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/12/06 16:50:13 UTC

[brooklyn-server] branch master updated (f477758 -> de03564)

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

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


    from f477758  weaken transient test
     new 02dfde8  fix bug where upgraded bundles cause log warnings when the old one is removed
     new dc4e84e  fix bug where upgraded bundles are still used in search path
     new d68d404  fix warning about inefficient guava removed class fix
     new 300f88f  allow BOM used to make a ZIP to give extra OSGi headers
     new 4d9d99e  don't mark a bundle for persistence until it is started
     new bcde518  provide metadata to suppress misleading warnings, and more context for persistence messages
     new de03564  This closes #1282

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../rebind/mementos/BrooklynMementoPersister.java  |  4 +--
 .../catalog/internal/BasicBrooklynCatalog.java     |  6 +++-
 .../catalog/internal/CatalogInitialization.java    |  4 ++-
 .../mgmt/ha/BrooklynBomOsgiArchiveInstaller.java   | 16 +++++------
 .../BrooklynMementoPersisterToObjectStore.java     | 32 ++++++++++++++++------
 .../mgmt/persist/BrooklynPersistenceUtils.java     | 14 +++++++---
 .../mgmt/rebind/PeriodicDeltaChangeListener.java   |  4 +++
 .../brooklyn/core/mgmt/rebind/RebindIteration.java | 12 ++++----
 .../core/mgmt/rebind/RebindManagerImpl.java        |  6 +++-
 .../BrooklynBomYamlCatalogBundleResolver.java      |  9 ++++++
 .../persist/deserializingClassRenames.properties   |  3 +-
 .../BrooklynMementoPersisterTestFixture.java       |  2 +-
 .../transformer/CompoundTransformerTest.java       |  2 +-
 .../brooklyn/launcher/common/BasicLauncher.java    |  6 ++--
 .../brooklyn/rest/resources/ServerResource.java    |  2 +-
 15 files changed, 84 insertions(+), 38 deletions(-)

[brooklyn-server] 07/07: This closes #1282

Posted by he...@apache.org.
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 de035640b790928bb35227a621ed313d69cc10c2
Merge: f477758 bcde518
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 16:50:08 2021 +0000

    This closes #1282

 .../rebind/mementos/BrooklynMementoPersister.java  |  4 +--
 .../catalog/internal/BasicBrooklynCatalog.java     |  6 +++-
 .../catalog/internal/CatalogInitialization.java    |  4 ++-
 .../mgmt/ha/BrooklynBomOsgiArchiveInstaller.java   | 16 +++++------
 .../BrooklynMementoPersisterToObjectStore.java     | 32 ++++++++++++++++------
 .../mgmt/persist/BrooklynPersistenceUtils.java     | 14 +++++++---
 .../mgmt/rebind/PeriodicDeltaChangeListener.java   |  4 +++
 .../brooklyn/core/mgmt/rebind/RebindIteration.java | 12 ++++----
 .../core/mgmt/rebind/RebindManagerImpl.java        |  6 +++-
 .../BrooklynBomYamlCatalogBundleResolver.java      |  9 ++++++
 .../persist/deserializingClassRenames.properties   |  3 +-
 .../BrooklynMementoPersisterTestFixture.java       |  2 +-
 .../transformer/CompoundTransformerTest.java       |  2 +-
 .../brooklyn/launcher/common/BasicLauncher.java    |  6 ++--
 .../brooklyn/rest/resources/ServerResource.java    |  2 +-
 15 files changed, 84 insertions(+), 38 deletions(-)

[brooklyn-server] 05/07: don't mark a bundle for persistence until it is started

Posted by he...@apache.org.
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 4d9d99eeda888b8366c77fd05115c3bcf1862ecb
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 14:28:56 2021 +0000

    don't mark a bundle for persistence until it is started
    
    suppress persistence attempt and subsequent warnings for bundles which are being upgraded
---
 .../core/catalog/internal/CatalogInitialization.java     |  4 ++--
 .../core/mgmt/ha/BrooklynBomOsgiArchiveInstaller.java    | 16 ++++++++--------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
index b16000c..dd0bc22 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
@@ -663,7 +663,7 @@ public class CatalogInitialization implements ManagementContextInjectable {
         for (Map.Entry<VersionedName, InstallableManagedBundle> entry : persistedState.getBundles().entrySet()) {
             if (catalogUpgrades.isBundleRemoved(entry.getKey())) {
                 rebindLogger.debug("Filtering out persisted bundle "+entry.getKey());
-                getManagementContext().getRebindManager().getChangeListener().onUnmanaged(entry.getValue().getManagedBundle());
+                // will skip persistence while not yet installed, and will remove when uninstalled
             } else {
                 bundles.put(entry.getKey(), entry.getValue());
             }
@@ -673,7 +673,7 @@ public class CatalogInitialization implements ManagementContextInjectable {
         for (CatalogItem<?, ?> legacyCatalogItem : persistedState.getLegacyCatalogItems()) {
             if (catalogUpgrades.isLegacyItemRemoved(legacyCatalogItem)) {
                 rebindLogger.debug("Filtering out persisted legacy catalog item "+legacyCatalogItem.getId());
-                getManagementContext().getRebindManager().getChangeListener().onUnmanaged(legacyCatalogItem);
+                // will skip persistence while not yet installed, and will remove when uninstalled
             } else {
                 legacyCatalogItems.add(legacyCatalogItem);
             }
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 4dd0fd3..a7d4bc4 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
@@ -653,10 +653,6 @@ public class BrooklynBomOsgiArchiveInstaller {
                 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()+"]";
-                if (!isBlacklistedForPersistence(result.getMetadata())) {
-                    ((BasicManagedBundle)result.getMetadata()).setPersistenceNeeded(true);
-                    mgmt().getRebindManager().getChangeListener().onManaged(result.getMetadata());
-                }
             } else {
                 Pair<File, ManagedBundle> olds = osgiManager.managedBundlesRecord.updateManagedBundleFileAndMetadata(result, zipFile);
                 oldZipFile = olds.getLeft();
@@ -664,10 +660,6 @@ public class BrooklynBomOsgiArchiveInstaller {
 
                 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()+"]";
-                if (!isBlacklistedForPersistence(result.getMetadata())) {
-                    ((BasicManagedBundle)result.getMetadata()).setPersistenceNeeded(true);
-                    mgmt().getRebindManager().getChangeListener().onChanged(result.getMetadata());
-                }
             }
             log.debug(result.message + " (partial): OSGi bundle installed, with bundle start and Brooklyn management to follow");
             // can now delete and close (copy has been made and is available from OsgiManager)
@@ -722,6 +714,14 @@ public class BrooklynBomOsgiArchiveInstaller {
                     if (start) {
                         try {
                             log.debug("Starting bundle "+result.getVersionedName());
+                            if (!isBlacklistedForPersistence(result.getMetadata())) {
+                                ((BasicManagedBundle)result.getMetadata()).setPersistenceNeeded(true);
+                                if (updating) {
+                                    mgmt().getRebindManager().getChangeListener().onChanged(result.getMetadata());
+                                } else {
+                                    mgmt().getRebindManager().getChangeListener().onManaged(result.getMetadata());
+                                }
+                            }
                             result.bundle.start();
                         } catch (BundleException e) {
                             log.warn("Error starting bundle "+result.getVersionedName()+", uninstalling, restoring any old bundle, then re-throwing error: "+e);

[brooklyn-server] 03/07: fix warning about inefficient guava removed class fix

Posted by he...@apache.org.
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 d68d404e09f4c3d834e625c5d965554097293785
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 12:35:51 2021 +0000

    fix warning about inefficient guava removed class fix
---
 .../brooklyn/core/mgmt/persist/deserializingClassRenames.properties    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties b/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties
index e233a99..8579417 100644
--- a/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties
+++ b/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties
@@ -1462,4 +1462,5 @@ org.apache.brooklyn.software-cm-salt\:org.apache.brooklyn.entity.cm.salt.impl.Sa
 # code-grant of new UI
 io.cloudsoft.amp.ui.common.enricher.AmpExternalUiModuleEnricher                  : org.apache.brooklyn.ui.modularity.enricher.BrooklynExternalUiModuleEnricher
 
-com.google.common.collect.EmptyImmutableBiMap                                    : org.apache.brooklyn.util.guava.EmptyImmutableBiMap
\ No newline at end of file
+com.google.guava\:com.google.common.collect.EmptyImmutableBiMap                  : org.apache.brooklyn.util.guava.EmptyImmutableBiMap
+com.google.common.collect.EmptyImmutableBiMap                                    : org.apache.brooklyn.util.guava.EmptyImmutableBiMap

[brooklyn-server] 06/07: provide metadata to suppress misleading warnings, and more context for persistence messages

Posted by he...@apache.org.
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 bcde5189d9a398fbe4c62ff0d8d26ea8fb209a55
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 16:03:38 2021 +0000

    provide metadata to suppress misleading warnings, and more context for persistence messages
---
 .../rebind/mementos/BrooklynMementoPersister.java  |  4 +--
 .../catalog/internal/CatalogInitialization.java    |  2 +-
 .../BrooklynMementoPersisterToObjectStore.java     | 32 ++++++++++++++++------
 .../mgmt/persist/BrooklynPersistenceUtils.java     | 14 +++++++---
 .../mgmt/rebind/PeriodicDeltaChangeListener.java   |  4 +++
 .../core/mgmt/rebind/RebindManagerImpl.java        |  6 +++-
 .../BrooklynMementoPersisterTestFixture.java       |  2 +-
 .../transformer/CompoundTransformerTest.java       |  2 +-
 .../brooklyn/launcher/common/BasicLauncher.java    |  6 ++--
 .../brooklyn/rest/resources/ServerResource.java    |  2 +-
 10 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
index 163a0ff..9f059c0 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
@@ -98,8 +98,8 @@ public interface BrooklynMementoPersister {
     Set<String> getLastErrors();
 
     /** applies a full checkpoint (write) of all state; returns true on success or false on error, with {@link #getLastErrors()} available to get the last errors */
-    boolean checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler);
-    /** applies a partial write of state delta; result and errors as per {@link #checkpoint(BrooklynMementoRawData, PersistenceExceptionHandler)} */
+    boolean checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler, String context, @Nullable RebindManager deltaDetails);
+    /** applies a partial write of state delta; result and errors as per {@link #checkpoint(BrooklynMementoRawData, PersistenceExceptionHandler, String, RebindManager)} */
     boolean delta(Delta delta, PersistenceExceptionHandler exceptionHandler);
     /** inserts an additional delta to be written on the next delta request */
     @Beta
diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
index dd0bc22..ed116dc 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
@@ -559,7 +559,7 @@ public class CatalogInitialization implements ManagementContextInjectable {
             if (b.getBundle().getState() >= Bundle.INSTALLED && b.getBundle().getState() < Bundle.STARTING) {
                 // we installed it, catalog did not start it, so let's uninstall it
                 OsgiBundleInstallationResult result = getManagementContext().getOsgiManager().get().uninstallUploadedBundle(b.getMetadata());
-                log.debug("Result of uninstalling "+b+" due to due to catalog upgrade metadata instructions: "+result);
+                log.debug("Result of uninstalling "+b+" due to catalog upgrade metadata instructions: "+result);
             }
         });
 
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
index 31e2019..fe09137 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
@@ -40,10 +40,10 @@ import javax.xml.xpath.XPathConstants;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.rebind.PersistenceExceptionHandler;
 import org.apache.brooklyn.api.mgmt.rebind.RebindExceptionHandler;
+import org.apache.brooklyn.api.mgmt.rebind.RebindManager;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister;
-import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister.LookupContext;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoRawData;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
 import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento;
@@ -63,6 +63,7 @@ import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectA
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessorWithLock;
 import org.apache.brooklyn.core.mgmt.persist.XmlMementoSerializer.XmlMementoSerializerBuilder;
 import org.apache.brooklyn.core.mgmt.rebind.PeriodicDeltaChangeListener;
+import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl;
 import org.apache.brooklyn.core.mgmt.rebind.dto.BrooklynMementoImpl;
 import org.apache.brooklyn.core.mgmt.rebind.dto.BrooklynMementoManifestImpl;
 import org.apache.brooklyn.core.typereg.BasicManagedBundle;
@@ -633,7 +634,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
     /** See {@link BrooklynPersistenceUtils} for conveniences for using this method. */
     @Override
     @Beta
-    public boolean checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler) {
+    public boolean checkpoint(BrooklynMementoRawData newMemento, PersistenceExceptionHandler exceptionHandler, String context, @Nullable RebindManager contextDetails) {
         checkWritesAllowed();
         try {
             lock.writeLock().lockInterruptibly();
@@ -642,6 +643,16 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         }
         
         try {
+            if (LOG.isDebugEnabled()) {
+                if (contextDetails!=null && !contextDetails.hasPending()) {
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Checkpointing memento for {}", context);
+                    }
+                } else {
+                    LOG.debug("Checkpointing memento for {}", context);
+                }
+            }
+
             exceptionHandler.clearRecentErrors();
             objectStore.prepareForMasterUse();
             
@@ -651,7 +662,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             futures.add(asyncUpdatePlaneId(newMemento.getPlaneId(), exceptionHandler));
             for (BrooklynObjectType type: BrooklynPersistenceUtils.STANDARD_BROOKLYN_OBJECT_TYPE_PERSISTENCE_ORDER) {
                 for (Map.Entry<String, String> entry : newMemento.getObjectsOfType(type).entrySet()) {
-                    addPersistContentIfManagedBundle(type, entry.getKey(), entry.getValue(), futures, exceptionHandler);
+                    addPersistContentIfManagedBundle(type, entry.getKey(), entry.getValue(), futures, exceptionHandler, contextDetails);
                     futures.add(asyncPersist(type.getSubPathName(), type, entry.getKey(), entry.getValue(), exceptionHandler));
                 }
             }
@@ -664,7 +675,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             } catch (Exception e) {
                 throw Exceptions.propagate(e);
             }
-            if (LOG.isDebugEnabled()) LOG.debug("Checkpointed entire memento in {}", Time.makeTimeStringRounded(stopwatch));
+            if (LOG.isDebugEnabled()) LOG.debug("Checkpointed memento in {} (for {})", Time.makeTimeStringRounded(stopwatch), context);
         } finally {
             lastErrors = exceptionHandler.getRecentErrors();
             lock.writeLock().unlock();
@@ -737,7 +748,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             for (BrooklynObjectType type: BrooklynPersistenceUtils.STANDARD_BROOKLYN_OBJECT_TYPE_PERSISTENCE_ORDER) {
                 for (Memento item : delta.getObjectsOfType(type)) {
                     if (!deletedIds.contains(item.getId())) {
-                        addPersistContentIfManagedBundle(type, item.getId(), ""+item.getCatalogItemId()+"/"+item.getDisplayName(), futures, exceptionHandler);
+                        addPersistContentIfManagedBundle(type, item.getId(), ""+item.getCatalogItemId()+"/"+item.getDisplayName(), futures, exceptionHandler, null);
                         futures.add(asyncPersist(type.getSubPathName(), item, exceptionHandler));
                     }
                 }
@@ -767,7 +778,7 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
         return lastErrors;
     }
 
-    private void addPersistContentIfManagedBundle(final BrooklynObjectType type, final String id, final String summaryOrContents, List<ListenableFuture<?>> futures, final PersistenceExceptionHandler exceptionHandler) {
+    private void addPersistContentIfManagedBundle(final BrooklynObjectType type, final String id, final String summaryOrContents, List<ListenableFuture<?>> futures, final PersistenceExceptionHandler exceptionHandler, final @Nullable RebindManager deltaContext) {
         if (type==BrooklynObjectType.MANAGED_BUNDLE) {
             if (mgmt==null) {
                 throw new IllegalStateException("Cannot persist bundles without a management context");
@@ -775,9 +786,12 @@ public class BrooklynMementoPersisterToObjectStore implements BrooklynMementoPer
             final ManagedBundle mb = ((ManagementContextInternal)mgmt).getOsgiManager().get().getManagedBundles().get(id);
             LOG.debug("Persisting managed bundle "+id+": "+mb+" - "+summaryOrContents);
             if (mb==null) {
-                // previously happened on rebind because new osgi unique id was made; now it should use the same so we shouldn't see this,
-                // but if we do the log will contain a summary or contents for comparison which will help
-                LOG.warn("Cannot find managed bundle for added bundle "+id+"; ignoring (probably uninstalled or reinstalled with another OSGi ID; see debug log for contents)");
+                if (deltaContext!=null && deltaContext instanceof RebindManagerImpl && ((RebindManagerImpl)deltaContext).isBundleIdUnmanaged(id)) {
+                    // known to happen if we add then remove something, because it is still listed
+                    LOG.trace("Skipipng absent managed bundle for added and removed bundle {}; ignoring (probably uninstalled or reinstalled with another OSGi ID; see debug log for contents)", id);
+                } else {
+                    LOG.warn("Cannot find managed bundle for added bundle {}; ignoring (probably uninstalled or reinstalled with another OSGi ID; see debug log for contents)", id);
+                }
                 return;
             }
             
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynPersistenceUtils.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynPersistenceUtils.java
index 649e9a6..3410325 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynPersistenceUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynPersistenceUtils.java
@@ -54,6 +54,7 @@ import org.apache.brooklyn.core.server.BrooklynServerPaths;
 import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
@@ -106,13 +107,18 @@ public class BrooklynPersistenceUtils {
 
     public static void writeMemento(ManagementContext managementContext, BrooklynMementoRawData memento,
             PersistenceObjectStore destinationObjectStore) {
+        writeMemento(managementContext, memento, destinationObjectStore, "explicit memento write (no details)");
+    }
+
+    public static void writeMemento(ManagementContext managementContext, BrooklynMementoRawData memento,
+                                    PersistenceObjectStore destinationObjectStore, String context) {
         BrooklynMementoPersisterToObjectStore persister = new BrooklynMementoPersisterToObjectStore(
             destinationObjectStore,
             managementContext);
         try {
             PersistenceExceptionHandler exceptionHandler = PersistenceExceptionHandlerImpl.builder().build();
             persister.enableWriteAccess();
-            persister.checkpoint(memento, exceptionHandler);
+            persister.checkpoint(memento, exceptionHandler, context, managementContext.getRebindManager());
         } finally {
             persister.stop(true);
         }
@@ -218,7 +224,7 @@ public class BrooklynPersistenceUtils {
         BrooklynMementoRawData dataRecord = newStateMemento(mgmt, source); 
         ManagementPlaneSyncRecord mgmtRecord = newManagerMemento(mgmt, source);
 
-        writeMemento(mgmt, dataRecord, targetStore);
+        writeMemento(mgmt, dataRecord, targetStore, "copy being written (for "+ JavaClassNames.callerNiceClassAndMethod(1)+")");
         writeManagerMemento(mgmt, mgmtRecord, targetStore);
         
         log.debug("Wrote full memento to "+targetStore+" in "+Time.makeTimeStringRounded(Duration.of(timer)));
@@ -258,7 +264,7 @@ public class BrooklynPersistenceUtils {
                     .location(backupSpec).nonBackupLocation(nonBackupSpec).resolveWithSubpathFor(managementContext, mode.toString());
                 destinationObjectStore = BrooklynPersistenceUtils.newPersistenceObjectStore(managementContext, backupSpec, backupContainer);
                 log.debug("Backing up persisted state on "+mode+", to "+destinationObjectStore.getSummaryName());
-                BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore);
+                BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore, "backup for '"+mode+"'");
                 BrooklynPersistenceUtils.writeManagerMemento(managementContext, planeState, destinationObjectStore);
                 if (!memento.isEmpty()) {
                     log.info("Back-up of persisted state created on "+mode+", in "+destinationObjectStore.getSummaryName());
@@ -278,7 +284,7 @@ public class BrooklynPersistenceUtils {
                         +" failed with "+e, e);
                     
                     log.debug("Backing up persisted state on "+mode+", locally because remote failed, to "+destinationObjectStore.getSummaryName());
-                    BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore);
+                    BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore, "secondary local backup for 'mode");
                     BrooklynPersistenceUtils.writeManagerMemento(managementContext, planeState, destinationObjectStore);
                     log.info("Back-up of persisted state created on "+mode+", locally because remote failed, in "+destinationObjectStore.getSummaryName());
                 }
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
index f9b9be4..1c533f5 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java
@@ -385,6 +385,10 @@ public class PeriodicDeltaChangeListener implements ChangeListener {
     boolean isStopped() {
         return state == ListenerState.STOPPING || state == ListenerState.STOPPED || executionContext.isShutdown();
     }
+
+    boolean isBundleIdUnmanaged(String id) {
+        return deltaCollector.removedBundleIds.contains(id);
+    }
     
     /**
      * @deprecated since 1.0.0; its use is enabled via BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY,
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
index 81c254e..d77d676 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
@@ -555,6 +555,10 @@ public class RebindManagerImpl implements RebindManager {
         return persistenceRealChangeListener.hasPending() || persistenceStoreAccess.isWriting();
     }
 
+    public boolean isBundleIdUnmanaged(String id) {
+        return persistenceRealChangeListener.isBundleIdUnmanaged(id);
+    }
+
     @Override
     @VisibleForTesting
     public void forcePersistNow(boolean full, PersistenceExceptionHandler exceptionHandler) {
@@ -567,7 +571,7 @@ public class RebindManagerImpl implements RebindManager {
             if (exceptionHandler == null) {
                 exceptionHandler = persistenceRealChangeListener.getExceptionHandler();
             }
-            persistenceStoreAccess.checkpoint(memento, exceptionHandler);
+            persistenceStoreAccess.checkpoint(memento, exceptionHandler, "manual forced persistence", null);
         } else {
             if (!persistenceRealChangeListener.persistNowSafely()) {
                 throw new IllegalStateException("Forced persistence failed; see logs for more detail");
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
index 0aa3df6..6f63bab 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterTestFixture.java
@@ -164,7 +164,7 @@ public abstract class BrooklynMementoPersisterTestFixture {
             
             // And test persisting
             PersistenceExceptionHandler exceptionHandler = PersistenceExceptionHandlerImpl.builder().build();
-            ((BrooklynMementoPersisterToObjectStore) persister).checkpoint(rawMemento, exceptionHandler);
+            ((BrooklynMementoPersisterToObjectStore) persister).checkpoint(rawMemento, exceptionHandler, "test", null);
         } else {
             throw new SkipException("Persister "+persister+" not a "+BrooklynMementoPersisterToObjectStore.class.getSimpleName());
         }
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformerTest.java
index 05969ec..fe79c66 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformerTest.java
@@ -455,7 +455,7 @@ public class CompoundTransformerTest extends RebindTestFixtureWithApp {
         persister.enableWriteAccess();
 
         PersistenceExceptionHandler exceptionHandler = PersistenceExceptionHandlerImpl.builder().build();
-        persister.checkpoint(rawData, exceptionHandler);
+        persister.checkpoint(rawData, exceptionHandler, "test", null);
         
         LOG.info("Test "+getClass()+" persisted raw data to "+newMementoDir);
         return newMementoDir;
diff --git a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
index bb70594..0a9742a 100644
--- a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
+++ b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.launcher.common;
 
+import com.google.common.annotations.VisibleForTesting;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.File;
@@ -333,7 +334,7 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
             LOG.info("Copying persisted state to "+destinationDir+(destinationLocationSpec!=null ? " @ "+destinationLocationSpec : ""));
             PersistenceObjectStore destinationObjectStore = BrooklynPersistenceUtils.newPersistenceObjectStore(
                 managementContext, destinationLocationSpec, destinationDir);
-            BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore);
+            BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore, "copy on launch");
             BrooklynPersistenceUtils.writeManagerMemento(managementContext, planeState, destinationObjectStore);
         } catch (Exception e) {
             Exceptions.propagateIfFatal(e);
@@ -364,11 +365,12 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
      */
     // Make private after deprecation
     @Deprecated
+    @VisibleForTesting
     public void persistState(BrooklynMementoRawData memento, String destinationDir, @Nullable String destinationLocationSpec) {
         initManagementContext();
         PersistenceObjectStore destinationObjectStore = BrooklynPersistenceUtils.newPersistenceObjectStore(
             managementContext, destinationLocationSpec, destinationDir);
-        BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore);
+        BrooklynPersistenceUtils.writeMemento(managementContext, memento, destinationObjectStore, "persist on launch (for testing only)");
     }
 
     /**
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
index 65617b1..a5ffa2d 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ServerResource.java
@@ -648,7 +648,7 @@ public class ServerResource extends AbstractBrooklynRestResource implements Serv
             result.catalogItems(newMementoRawData.getCatalogItems());
 
             PersistenceObjectStore currentPersistenceStore = ((BrooklynMementoPersisterToObjectStore) mgmt().getRebindManager().getPersister()).getObjectStore();
-            BrooklynPersistenceUtils.writeMemento(mgmt(),result.build(),currentPersistenceStore);
+            BrooklynPersistenceUtils.writeMemento(mgmt(),result.build(),currentPersistenceStore, "persist for REST call");
 
             mgmt().getRebindManager().rebind(mgmt().getCatalogClassLoader(),null, mgmt().getHighAvailabilityManager().getNodeState());
 

[brooklyn-server] 01/07: fix bug where upgraded bundles cause log warnings when the old one is removed

Posted by he...@apache.org.
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 02dfde847993ad0bfd7cfff51a70f1e162cdbb53
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 12:34:41 2021 +0000

    fix bug where upgraded bundles cause log warnings when the old one is removed
---
 .../apache/brooklyn/core/catalog/internal/CatalogInitialization.java    | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
index 8ff5180..b16000c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
+++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java
@@ -663,6 +663,7 @@ public class CatalogInitialization implements ManagementContextInjectable {
         for (Map.Entry<VersionedName, InstallableManagedBundle> entry : persistedState.getBundles().entrySet()) {
             if (catalogUpgrades.isBundleRemoved(entry.getKey())) {
                 rebindLogger.debug("Filtering out persisted bundle "+entry.getKey());
+                getManagementContext().getRebindManager().getChangeListener().onUnmanaged(entry.getValue().getManagedBundle());
             } else {
                 bundles.put(entry.getKey(), entry.getValue());
             }
@@ -672,6 +673,7 @@ public class CatalogInitialization implements ManagementContextInjectable {
         for (CatalogItem<?, ?> legacyCatalogItem : persistedState.getLegacyCatalogItems()) {
             if (catalogUpgrades.isLegacyItemRemoved(legacyCatalogItem)) {
                 rebindLogger.debug("Filtering out persisted legacy catalog item "+legacyCatalogItem.getId());
+                getManagementContext().getRebindManager().getChangeListener().onUnmanaged(legacyCatalogItem);
             } else {
                 legacyCatalogItems.add(legacyCatalogItem);
             }

[brooklyn-server] 04/07: allow BOM used to make a ZIP to give extra OSGi headers

Posted by he...@apache.org.
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 300f88f5d0415de447f1e850173f00d23c8e56b1
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 12:36:16 2021 +0000

    allow BOM used to make a ZIP to give extra OSGi headers
---
 .../brooklyn/core/catalog/internal/BasicBrooklynCatalog.java     | 6 +++++-
 .../core/typereg/BrooklynBomYamlCatalogBundleResolver.java       | 9 +++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

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 cf21aaf..4cde1de 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
@@ -116,9 +116,13 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
 
     /** Header on bundle indicating it is a wrapped BOM with no other resources */
     public static final String BROOKLYN_WRAPPED_BOM_BUNDLE = "Brooklyn-Wrapped-BOM";
+
     @VisibleForTesting
     public static final boolean AUTO_WRAP_CATALOG_YAML_AS_BUNDLE = true;
-    
+
+    /** key within brooklyn.catalog containing a map of items used to generate headers if an OSGi bundle is being produced by wrapping the YAML */
+    public static final String CATALOG_OSGI_WRAP_HEADERS = "catalog.osgi.wrap.headers";
+
     private static final Logger log = LoggerFactory.getLogger(BasicBrooklynCatalog.class);
 
     public static class BrooklynLoaderTracker {
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
index 110533c..642ce03 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynBomYamlCatalogBundleResolver.java
@@ -107,6 +107,15 @@ public class BrooklynBomYamlCatalogBundleResolver extends AbstractCatalogBundleR
         mf.getMainAttributes().putValue(Attributes.Name.MANIFEST_VERSION.toString(), BasicBrooklynCatalog.OSGI_MANIFEST_VERSION_VALUE);
         mf.getMainAttributes().putValue(BasicBrooklynCatalog.BROOKLYN_WRAPPED_BOM_BUNDLE, Boolean.TRUE.toString());
 
+        Object impliedHeaders = cm.get(BasicBrooklynCatalog.CATALOG_OSGI_WRAP_HEADERS);
+        if (impliedHeaders instanceof Map) {
+            ((Map<?, ?>) impliedHeaders).forEach((k,v)->{
+                mf.getMainAttributes().putValue(Strings.toString(k), Strings.toString(v));
+            });
+        } else if (impliedHeaders!=null) {
+            throw new IllegalStateException("Must contain map of OSGi headers to insert in "+BasicBrooklynCatalog.CATALOG_OSGI_WRAP_HEADERS);
+        }
+
         BundleMaker bm = new BundleMaker(mgmt);
         File bf = bm.createTempBundle(vn.getSymbolicName(), mf, MutableMap.of(
                 new ZipEntry(BasicBrooklynCatalog.CATALOG_BOM), (InputStream) new ByteArrayInputStream(yaml.getBytes())));

[brooklyn-server] 02/07: fix bug where upgraded bundles are still used in search path

Posted by he...@apache.org.
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 dc4e84ef94c8edc23fdb4e0015c10049bd1cc968
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Mon Dec 6 12:35:27 2021 +0000

    fix bug where upgraded bundles are still used in search path
---
 .../apache/brooklyn/core/mgmt/rebind/RebindIteration.java    | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
index e85918d..df0a105 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
@@ -1068,26 +1068,26 @@ public abstract class RebindIteration {
             if (searchPath != null && !searchPath.isEmpty()) {
                 for (String searchItemId : searchPath) {
                     String fixedSearchItemId = null;
+                    VersionedName searchItemVersionedName = VersionedName.fromString(searchItemId);
+
                     OsgiManager osgi = managementContext.getOsgiManager().orNull();
 
-                    VersionedName bundleVN = VersionedName.fromString(searchItemId);
                     String bundleUpgraded = CatalogUpgrades.getBundleUpgradedIfNecessary(managementContext, searchItemId);
                     if (bundleUpgraded!=null && !bundleUpgraded.equals(searchItemId)) {
                         logRebindingDebug("Upgrading search path entry of " + bType.getSimpleName().toLowerCase() + " " + contextSuchAsId + " from " + searchItemId + " to bundle " + bundleUpgraded);
-                        bundleVN = VersionedName.fromString(bundleUpgraded);
+                        searchItemVersionedName = VersionedName.fromString(bundleUpgraded);
                     }
 
                     if (osgi != null) {
-                        ManagedBundle bundle = osgi.getManagedBundle(bundleVN);
+                        ManagedBundle bundle = osgi.getManagedBundle(searchItemVersionedName);
                         if (bundle != null) {
                             // found as bundle
-                            reboundSearchPath.add(searchItemId);
+                            fixedSearchItemId = searchItemVersionedName.toOsgiString();
+                            reboundSearchPath.add(fixedSearchItemId);
                             continue;
                         }
                     }
 
-
-
                     // look for as a type now
                     RegisteredType t1 = managementContext.getTypeRegistry().get(searchItemId);
                     if (t1 == null) {