You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2021/05/26 22:52:29 UTC

[brooklyn-server] 04/06: restore bundle metadata on rollback

This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit a6d210f8c2f38ebed6e59c51ccf8fd46b127e629
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Wed May 26 23:45:15 2021 +0100

    restore bundle metadata on rollback
---
 .../org/apache/brooklyn/camp/brooklyn/RebindOsgiTest.java   |  2 +-
 .../core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java       | 13 +++++++++----
 .../java/org/apache/brooklyn/core/mgmt/ha/OsgiManager.java  | 12 ++++++++----
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/RebindOsgiTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/RebindOsgiTest.java
index 20cb545..2766942 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/RebindOsgiTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/RebindOsgiTest.java
@@ -513,7 +513,7 @@ public class RebindOsgiTest extends AbstractYamlRebindTest {
             Asserts.expectedFailureContains(e, "DeliberatelyMissing", appSymbolicName);
         }
         Map<String, ManagedBundle> newBundles = origManagementContext.getOsgiManager().get().getManagedBundles();
-        Assert.assertEquals(newBundles, oldBundles, "Bundles: "+newBundles);
+        Assert.assertEquals(newBundles, oldBundles, "Bundles: "+newBundles+" != "+oldBundles);
 
         rebind();
         newBundles = origManagementContext.getOsgiManager().get().getManagedBundles();
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
index 3f66043..4dd0fd3 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java
@@ -69,6 +69,7 @@ import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.BrooklynVersionSyntax;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.text.VersionComparator;
+import org.apache.commons.lang3.tuple.Pair;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
@@ -643,10 +644,12 @@ public class BrooklynBomOsgiArchiveInstaller {
             }
             
             osgiManager.checkCorrectlyInstalled(result.getMetadata(), result.bundle);
-            final File oldZipFile; 
+            final File oldZipFile;
+            final ManagedBundle oldManagedBundle;
             
             if (!updating) { 
                 oldZipFile = null;
+                oldManagedBundle = null;
                 osgiManager.managedBundlesRecord.addManagedBundle(result, zipFile);
                 result.code = OsgiBundleInstallationResult.ResultCode.INSTALLED_NEW_BUNDLE;
                 result.message = "Installed Brooklyn catalog bundle "+result.getMetadata().getVersionedName()+" with ID "+result.getMetadata().getId()+" ["+result.bundle.getBundleId()+"]";
@@ -655,7 +658,9 @@ public class BrooklynBomOsgiArchiveInstaller {
                     mgmt().getRebindManager().getChangeListener().onManaged(result.getMetadata());
                 }
             } else {
-                oldZipFile = osgiManager.managedBundlesRecord.updateManagedBundleFileAndMetadata(result, zipFile);
+                Pair<File, ManagedBundle> olds = osgiManager.managedBundlesRecord.updateManagedBundleFileAndMetadata(result, zipFile);
+                oldZipFile = olds.getLeft();
+                oldManagedBundle = olds.getRight();
 
                 result.code = OsgiBundleInstallationResult.ResultCode.UPDATED_EXISTING_BUNDLE;
                 result.message = "Updated Brooklyn catalog bundle "+result.getMetadata().getVersionedName()+" as existing ID "+result.getMetadata().getId()+" ["+result.bundle.getBundleId()+"]";
@@ -686,9 +691,9 @@ public class BrooklynBomOsgiArchiveInstaller {
                         if (oldZipFile==null) {
                             throw new IllegalStateException("Did not have old ZIP file to install");
                         }
-                        log.debug("Rolling back bundle "+result.getVersionedName()+" to state from "+oldZipFile);
+                        log.debug("Rolling back bundle "+result.getVersionedName()+" to state "+oldManagedBundle+" from "+oldZipFile);
                         try {
-                            File zipFileNow = osgiManager.managedBundlesRecord.rollbackManagedBundleFile(result, oldZipFile);
+                            File zipFileNow = osgiManager.managedBundlesRecord.rollbackManagedBundleFileAndMetadata(result, oldZipFile, oldManagedBundle);
                             result.bundle.update(new FileInputStream(Preconditions.checkNotNull(zipFileNow, "Couldn't find contents of old version of bundle")));
                         } catch (Exception e) {
                             Exceptions.propagateIfFatal(e);
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 44065ab..a909635 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
@@ -66,6 +66,7 @@ import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.stream.Streams;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
+import org.apache.commons.lang3.tuple.Pair;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
@@ -173,7 +174,7 @@ 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 updateManagedBundleFileAndMetadata(OsgiBundleInstallationResult result, File fNew) {
+        synchronized Pair<File,ManagedBundle> updateManagedBundleFileAndMetadata(OsgiBundleInstallationResult result, File fNew) {
             File fCached = fileFor(result.getMetadata());
             File fBak = new File(fCached.getAbsolutePath()+".bak");
             if (fBak.equals(fNew)) {
@@ -192,13 +193,13 @@ public class OsgiManager {
                 throw Exceptions.propagate(e);
             }
 
-            managedBundlesByUid.put(result.getMetadata().getId(), result.getMetadata());
+            ManagedBundle mbBak = managedBundlesByUid.put(result.getMetadata().getId(), result.getMetadata());
 
-            return fBak;
+            return Pair.of(fBak, mbBak);
         }
         
         /** 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) {
+        synchronized File rollbackManagedBundleFileAndMetadata(OsgiBundleInstallationResult result, File fBak, ManagedBundle mbBak) {
             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");
@@ -210,6 +211,9 @@ public class OsgiManager {
                 log.warn("No pre-existing bundle file "+fCached+" when rolling back; ignoring");
             }
             fBak.renameTo(fCached);
+
+            managedBundlesByUid.put(result.getMetadata().getId(), mbBak);
+
             return fCached;
         }
     }