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 <[email protected]> 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());
