fix osgi rollback bug, and better logging for remote url loads

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/8cd54657
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/8cd54657
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/8cd54657

Branch: refs/heads/master
Commit: 8cd54657749376c131e021b9a0a7e8b3970c6fb4
Parents: e387e42
Author: Alex Heneveld <[email protected]>
Authored: Wed Aug 23 10:54:57 2017 -0400
Committer: Alex Heneveld <[email protected]>
Committed: Wed Aug 23 11:59:16 2017 -0400

----------------------------------------------------------------------
 .../catalog/internal/BasicBrooklynCatalog.java  |  9 +++++-
 .../core/mgmt/ha/OsgiArchiveInstaller.java      |  5 ++--
 .../brooklyn/core/mgmt/ha/OsgiManager.java      | 30 ++++++++++++++------
 .../brooklyn/launcher/osgi/OsgiLauncher.java    |  2 +-
 4 files changed, 33 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8cd54657/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
index 87725dd..5679d5e 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java
@@ -1003,13 +1003,20 @@ public class BasicBrooklynCatalog implements 
BrooklynCatalog {
         Collection<CatalogBundle> parentLibraries = 
CatalogItemDtoAbstract.parseLibraries(parentLibrariesRaw);
         BrooklynClassLoadingContext loader = 
CatalogUtils.newClassLoadingContext(mgmt, "<catalog url reference 
loader>:0.0.0", parentLibraries);
         String yaml;
+        log.debug("Loading referenced BOM at "+url+" as part of 
"+(containingBundle==null ? "non-bundled load" : 
containingBundle.getVersionedName())+" ("+(resultNewFormat!=null ? 
resultNewFormat.size() : resultLegacyFormat!=null ? resultLegacyFormat.size() : 
"(unknown)")+" items before load)");
+        if (url.startsWith("http")) {
+            // give greater visibility to these
+            log.info("Loading external referenced BOM at "+url+" as part of 
"+(containingBundle==null ? "non-bundled load" : 
containingBundle.getVersionedName()));
+        }
         try {
             yaml = ResourceUtils.create(loader).getResourceAsString(url);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
-            throw new IllegalStateException("Remote catalog url " + url + " 
can't be fetched.", e);
+            throw new IllegalStateException("Remote catalog url " + url + " in 
"+(containingBundle==null ? "non-bundled load" : 
containingBundle.getVersionedName())+" can't be fetched.", e);
         }
         collectCatalogItemsFromCatalogBomRoot(yaml, containingBundle, 
resultLegacyFormat, resultNewFormat, requireValidation, parentMeta, depth, 
force);
+        log.debug("Loaded referenced BOM at "+url+" as part of 
"+(containingBundle==null ? "non-bundled load" : 
containingBundle.getVersionedName())+", now have "+
+            (resultNewFormat!=null ? resultNewFormat.size() : 
resultLegacyFormat!=null ? resultLegacyFormat.size() : "(unknown)")+" items");
     }
 
     @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8cd54657/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
index d294ad5..8cdb39e 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiArchiveInstaller.java
@@ -394,10 +394,11 @@ class OsgiArchiveInstaller {
                             throw new IllegalStateException("Did not have old 
ZIP file to install");
                         }
                         log.debug("Rolling back bundle 
"+result.getVersionedName()+" to state from "+oldZipFile);
-                        
osgiManager.managedBundlesRecord.updateManagedBundleFile(result, oldZipFile);
                         try {
-                            result.bundle.update(new 
FileInputStream(Preconditions.checkNotNull(oldZipFile, "Couldn't find contents 
of old version of bundle")));
+                            File zipFileNow = 
osgiManager.managedBundlesRecord.rollbackManagedBundleFile(result, oldZipFile);
+                            result.bundle.update(new 
FileInputStream(Preconditions.checkNotNull(zipFileNow, "Couldn't find contents 
of old version of bundle")));
                         } catch (Exception e) {
+                            Exceptions.propagateIfFatal(e);
                             log.error("Error rolling back following failed 
install of updated "+result.getVersionedName()+"; "
                                 + "installation will likely be corrupted and 
correct version should be manually installed.", e);
                         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8cd54657/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
index 111dfcc..d0c7800 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java
@@ -177,16 +177,12 @@ public class OsgiManager {
         /** Updates the bundle file associated with the given record, creating 
and returning a backup if there was already such a file */ 
         synchronized File updateManagedBundleFile(OsgiBundleInstallationResult 
result, File fNew) {
             File fCached = fileFor(result.getMetadata());
-            File fBak = null;
+            File fBak = new File(fCached.getAbsolutePath()+".bak");
+            if (fBak.equals(fNew)) {
+                // rolling back
+                throw new IllegalStateException("Cannot update to a backup 
copy; use rollback instead");
+            }
             if (fCached.exists()) {
-                fBak = new File(fCached.getAbsolutePath()+".bak");
-                if (fBak.equals(fNew)) {
-                    // rolling back
-                    log.debug("Rolling back to back Brooklyn local copy of 
bundle file "+fCached);
-                    fCached.delete();
-                    fBak.renameTo(fCached);
-                    return null;
-                }
                 log.debug("Replacing and backing up old Brooklyn local copy of 
bundle file "+fCached);
                 fCached.renameTo(fBak);
             } else {
@@ -199,6 +195,22 @@ public class OsgiManager {
             }
             return fBak;
         }
+        
+        /** Rolls back the officially installed file to a given backup copy of 
a bundle file, returning the new name of the file */
+        synchronized File 
rollbackManagedBundleFile(OsgiBundleInstallationResult result, File fBak) {
+            log.debug("Rolling back to back Brooklyn local copy of bundle file 
"+fBak);
+            if (!fBak.exists()) {
+                throw new IllegalStateException("Cannot rollback to "+fBak+" 
as file does not exist");
+            }
+            File fCached = fileFor(result.getMetadata());
+            if (fCached.exists()) {
+                fCached.delete();
+            } else {
+                log.warn("No pre-existing bundle file "+fCached+" when rolling 
back; ignoring");
+            }
+            fBak.renameTo(fCached);
+            return fCached;
+        }
     }
     
     private static AtomicInteger numberOfReusableFrameworksCreated = new 
AtomicInteger();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8cd54657/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncher.java
----------------------------------------------------------------------
diff --git 
a/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncher.java 
b/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncher.java
index fec5f71..51f43db 100644
--- 
a/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncher.java
+++ 
b/karaf/init/src/main/java/org/apache/brooklyn/launcher/osgi/OsgiLauncher.java
@@ -98,7 +98,7 @@ public class OsgiLauncher extends BasicLauncher<OsgiLauncher> 
{
     public void init() {
         synchronized (reloadLock) {
             BrooklynShutdownHooks.resetShutdownFlag();
-            LOG.debug("OsgiLauncher init");
+            LOG.debug("OsgiLauncher init, catalog "+defaultCatalogLocation);
             catalogInitialization(new 
CatalogInitialization(String.format("file:%s", defaultCatalogLocation), false, 
null, false));
             start();
         }

Reply via email to