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(); }
