Repository: incubator-brooklyn Updated Branches: refs/heads/master 4b02716b0 -> 320c1c752
copy-state CLI: use BrooklynMementoRawData Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/82ddabb0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/82ddabb0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/82ddabb0 Branch: refs/heads/master Commit: 82ddabb013e3114195b53c8a9afc05e5459d2155 Parents: bba5f3e Author: Aled Sage <[email protected]> Authored: Thu Sep 11 13:00:26 2014 +0100 Committer: Aled Sage <[email protected]> Committed: Thu Sep 18 10:13:04 2014 +0100 ---------------------------------------------------------------------- .../brooklyn/entity/rebind/RebindManager.java | 3 +- .../entity/rebind/RebindManagerImpl.java | 103 +++++++++---------- .../entity/rebind/dto/BrooklynMementoImpl.java | 4 +- .../NonDeploymentManagementContext.java | 4 +- usage/cli/src/main/java/brooklyn/cli/Main.java | 8 +- .../brooklyn/launcher/BrooklynLauncher.java | 8 +- .../BrooklynLauncherRebindTestToFiles.java | 7 +- 7 files changed, 65 insertions(+), 72 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/api/src/main/java/brooklyn/entity/rebind/RebindManager.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java index 7df2edd..5c5d972 100644 --- a/api/src/main/java/brooklyn/entity/rebind/RebindManager.java +++ b/api/src/main/java/brooklyn/entity/rebind/RebindManager.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeoutException; import brooklyn.entity.Application; import brooklyn.mementos.BrooklynMemento; import brooklyn.mementos.BrooklynMementoPersister; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.util.time.Duration; import com.google.common.annotations.VisibleForTesting; @@ -66,7 +67,7 @@ public interface RebindManager { public List<Application> rebind(ClassLoader classLoader, RebindExceptionHandler exceptionHandler) throws IOException; - public BrooklynMemento retrieveMemento(ClassLoader classLoader) throws IOException; + public BrooklynMementoRawData retrieveMementoRawData() throws IOException; public ChangeListener getChangeListener(); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java index 2b4d4f8..70c2452 100644 --- a/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java +++ b/core/src/main/java/brooklyn/entity/rebind/RebindManagerImpl.java @@ -44,6 +44,7 @@ import brooklyn.entity.proxying.InternalEntityFactory; import brooklyn.entity.proxying.InternalFactory; import brooklyn.entity.proxying.InternalLocationFactory; import brooklyn.entity.proxying.InternalPolicyFactory; +import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore; import brooklyn.internal.BrooklynFeatureEnablement; import brooklyn.location.Location; import brooklyn.location.basic.AbstractLocation; @@ -54,6 +55,7 @@ import brooklyn.mementos.BrooklynMemento; import brooklyn.mementos.BrooklynMementoManifest; import brooklyn.mementos.BrooklynMementoPersister; import brooklyn.mementos.BrooklynMementoPersister.LookupContext; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.mementos.EnricherMemento; import brooklyn.mementos.EntityMemento; import brooklyn.mementos.LocationMemento; @@ -273,22 +275,15 @@ public class RebindManagerImpl implements RebindManager { } @Override - public BrooklynMemento retrieveMemento(ClassLoader classLoader) throws IOException { + public BrooklynMementoRawData retrieveMementoRawData() throws IOException { RebindExceptionHandler exceptionHandler = RebindExceptionHandlerImpl.builder() .danglingRefFailureMode(danglingRefFailureMode) .rebindFailureMode(rebindFailureMode) .addPolicyFailureMode(addPolicyFailureMode) .loadPolicyFailureMode(loadPolicyFailureMode) .build(); - RebindContextImpl rebindContext = new RebindContextImpl(exceptionHandler, classLoader); - BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(exceptionHandler); - RebindTracker.setRebinding(); - try { - return retrieveMemento(classLoader, exceptionHandler, rebindContext, mementoManifest); - } finally { - RebindTracker.reset(); - } + return loadMementoRawData(exceptionHandler); } /** @@ -296,28 +291,61 @@ public class RebindManagerImpl implements RebindManager { * * In so doing, it instantiates the entities + locations, registering them with the rebindContext. */ - protected BrooklynMemento retrieveMemento(final ClassLoader classLoader, final RebindExceptionHandler exceptionHandler, RebindContextImpl rebindContext, BrooklynMementoManifest mementoManifest) throws IOException { + protected BrooklynMementoRawData loadMementoRawData(final RebindExceptionHandler exceptionHandler) throws IOException { + try { + if (!(persister instanceof BrooklynMementoPersisterToObjectStore)) { + throw new IllegalStateException("Cannot load raw memento with persister "+persister); + } + + return ((BrooklynMementoPersisterToObjectStore)persister).loadMementoRawData(exceptionHandler); + + } catch (RuntimeException e) { + throw exceptionHandler.onFailed(e); + } + } + + protected List<Application> rebindImpl(final ClassLoader classLoader, final RebindExceptionHandler exceptionHandler) throws IOException { checkNotNull(classLoader, "classLoader"); + RebindTracker.setRebinding(); try { Reflections reflections = new Reflections(classLoader); - + RebindContextImpl rebindContext = new RebindContextImpl(exceptionHandler, classLoader); LookupContext realLookupContext = new RebindContextLookupContext(managementContext, rebindContext, exceptionHandler); - // Two-phase deserialization. + // Mutli-phase deserialization. // 1. deserialize just the "manifest" to find all instances (and their types). - // (this is now passed in; we are just left with instantiating the instances that may be cross-referenced. - // 2. deserialize so that inter-entity references can be set (and entity config/state is set). + // 2. instantiate entities+locations so that inter-entity references can subsequently be set during deserialize (and entity config/state is set). + // 3. deserialize the memento + // 4. instantiate policies+enrichers (could perhaps merge this with (2), depending how they are implemented) + // 5. reconstruct the entities etc (i.e. calling init on the already-instantiated instances). + // 6. add policies+enrichers to all the entities. + // 7. manage the entities // TODO if underlying data-store is changed between first and second phase (e.g. to add an // entity), then second phase might try to reconstitute an entity that has not been put in // the rebindContext. This should not affect normal production usage, because rebind is run // against a data-store that is not being written to by other brooklyn instance(s). + // // PHASE ONE // + BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(exceptionHandler); + + boolean isEmpty = mementoManifest.isEmpty(); + if (!isEmpty) { + LOG.info("Rebinding from "+getPersister().getBackingStoreDescription()+"..."); + } else { + LOG.info("Rebind check: no existing state; will persist new items to "+getPersister().getBackingStoreDescription()); + } + + + // + // PHASE TWO + // + // Instantiate locations LOG.debug("RebindManager instantiating locations: {}", mementoManifest.getLocationIdToType().keySet()); for (Map.Entry<String, String> entry : mementoManifest.getLocationIdToType().entrySet()) { @@ -348,53 +376,18 @@ public class RebindManagerImpl implements RebindManager { } } - // - // PHASE TWO - // - - return persister.loadMemento(realLookupContext, exceptionHandler); - - } catch (RuntimeException e) { - throw exceptionHandler.onFailed(e); - } - } - - protected List<Application> rebindImpl(final ClassLoader classLoader, final RebindExceptionHandler exceptionHandler) throws IOException { - checkNotNull(classLoader, "classLoader"); - - RebindTracker.setRebinding(); - try { - Reflections reflections = new Reflections(classLoader); - RebindContextImpl rebindContext = new RebindContextImpl(exceptionHandler, classLoader); - - // Five-phase deserialization. - // 1. deserialize just the "manifest" to find all instances (and their types). - // 2. deserialize so that inter-entity references can be set (and entity config/state is set). - // 3. reconstruct the entities etc (i.e. calling init on the already-instantiated instances). - // 4. add policies+enrichers to all the entities. - // 5. manage the entities - // - // PHASE ONE + // PHASE THREE // - BrooklynMementoManifest mementoManifest = persister.loadMementoManifest(exceptionHandler); - - boolean isEmpty = mementoManifest.isEmpty(); - if (!isEmpty) { - LOG.info("Rebinding from "+getPersister().getBackingStoreDescription()+"..."); - } else { - LOG.info("Rebind check: no existing state; will persist new items to "+getPersister().getBackingStoreDescription()); - } + BrooklynMemento memento = persister.loadMemento(realLookupContext, exceptionHandler); // - // PHASE TWO CONTINUED... + // PHASE FOUR // - BrooklynMemento memento = retrieveMemento(classLoader, exceptionHandler, rebindContext, mementoManifest); - // Instantiate policies if (persistPoliciesEnabled) { LOG.debug("RebindManager instantiating policies: {}", memento.getPolicyIds()); @@ -431,7 +424,7 @@ public class RebindManagerImpl implements RebindManager { // - // PHASE THREE + // PHASE FIVE // // Reconstruct locations @@ -515,7 +508,7 @@ public class RebindManagerImpl implements RebindManager { // - // PHASE FOUR + // PHASE SIX // // Associate policies+enrichers with entities @@ -540,7 +533,7 @@ public class RebindManagerImpl implements RebindManager { // - // PHASE FIVE + // PHASE SEVEN // LOG.debug("RebindManager managing locations"); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java index 732b7ce..f9e8ab4 100644 --- a/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java +++ b/core/src/main/java/brooklyn/entity/rebind/dto/BrooklynMementoImpl.java @@ -59,10 +59,10 @@ public class BrooklynMementoImpl implements BrooklynMemento, Serializable { public Builder applicationId(String val) { applicationIds.add(val); return this; } - public Builder applicationIds(List<String> vals) { + public Builder applicationIds(Collection<String> vals) { applicationIds.addAll(vals); return this; } - public Builder topLevelLocationIds(List<String> vals) { + public Builder topLevelLocationIds(Collection<String> vals) { topLevelLocationIds.addAll(vals); return this; } public void memento(Memento memento) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java index e60a9bd..cc2c916 100644 --- a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java +++ b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java @@ -64,8 +64,8 @@ import brooklyn.management.ha.ManagementNodeState; import brooklyn.management.ha.ManagementPlaneSyncRecord; import brooklyn.management.ha.ManagementPlaneSyncRecordPersister; import brooklyn.management.ha.OsgiManager; -import brooklyn.mementos.BrooklynMemento; import brooklyn.mementos.BrooklynMementoPersister; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.util.guava.Maybe; import brooklyn.util.time.Duration; @@ -469,7 +469,7 @@ public class NonDeploymentManagementContext implements ManagementContextInternal throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation."); } @Override - public BrooklynMemento retrieveMemento(ClassLoader classLoader) { + public BrooklynMementoRawData retrieveMementoRawData() { throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation."); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/cli/src/main/java/brooklyn/cli/Main.java ---------------------------------------------------------------------- diff --git a/usage/cli/src/main/java/brooklyn/cli/Main.java b/usage/cli/src/main/java/brooklyn/cli/Main.java index 5a8c7d4..9f1df6e 100644 --- a/usage/cli/src/main/java/brooklyn/cli/Main.java +++ b/usage/cli/src/main/java/brooklyn/cli/Main.java @@ -53,7 +53,7 @@ import brooklyn.launcher.BrooklynServerDetails; import brooklyn.launcher.config.StopWhichAppsOnShutdown; import brooklyn.management.ManagementContext; import brooklyn.management.ha.HighAvailabilityMode; -import brooklyn.mementos.BrooklynMemento; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.rest.security.PasswordHasher; import brooklyn.util.ResourceUtils; import brooklyn.util.exceptions.Exceptions; @@ -682,11 +682,11 @@ public class Main extends AbstractMain { public String localBrooklynProperties; @Option(name = { "--persistenceDir" }, title = "persistence dir", - description = "The directory to read/write persisted state (or container name if using an object store)") + description = "The directory to read persisted state (or container name if using an object store)") public String persistenceDir; @Option(name = { "--persistenceLocation" }, title = "persistence location", - description = "The location spec for an object store to read/write persisted state") + description = "The location spec for an object store to read persisted state") public String persistenceLocation; @Option(name = { "--destinationDir" }, required = true, title = "destination dir", @@ -724,7 +724,7 @@ public class Main extends AbstractMain { } try { - BrooklynMemento memento = launcher.retrieveState(); + BrooklynMementoRawData memento = launcher.retrieveState(); launcher.persistState(memento, destinationDirF); } catch (FatalRuntimeException e) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java ---------------------------------------------------------------------- diff --git a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java index 3e7bbb2..7910b71 100644 --- a/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java +++ b/usage/launcher/src/main/java/brooklyn/launcher/BrooklynLauncher.java @@ -74,6 +74,7 @@ import brooklyn.management.ha.ManagementPlaneSyncRecordPersisterToObjectStore; import brooklyn.management.internal.LocalManagementContext; import brooklyn.management.internal.ManagementContextInternal; import brooklyn.mementos.BrooklynMemento; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.rest.BrooklynWebConfig; import brooklyn.rest.security.BrooklynPropertiesSecurityFilter; import brooklyn.util.exceptions.Exceptions; @@ -431,7 +432,7 @@ public class BrooklynLauncher { return this; } - public BrooklynMemento retrieveState() { + public BrooklynMementoRawData retrieveState() { initManagementContext(); try { @@ -440,9 +441,8 @@ public class BrooklynLauncher { handleSubsystemStartupError(ignorePersistenceErrors, "persistence", e); } - ClassLoader classLoader = managementContext.getCatalog().getRootClassLoader(); try { - return managementContext.getRebindManager().retrieveMemento(classLoader); + return managementContext.getRebindManager().retrieveMementoRawData(); } catch (Exception e) { Exceptions.propagateIfFatal(e); @@ -452,7 +452,7 @@ public class BrooklynLauncher { } } - public void persistState(BrooklynMemento memento, File destinationDir) { + public void persistState(BrooklynMementoRawData memento, File destinationDir) { initManagementContext(); try { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/82ddabb0/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java ---------------------------------------------------------------------- diff --git a/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java b/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java index 20809fc..c40e61a 100644 --- a/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java +++ b/usage/launcher/src/test/java/brooklyn/launcher/BrooklynLauncherRebindTestToFiles.java @@ -26,13 +26,12 @@ import org.testng.annotations.Test; import brooklyn.config.BrooklynProperties; import brooklyn.config.BrooklynServerConfig; -import brooklyn.config.StringConfigMap; import brooklyn.entity.proxying.EntitySpec; import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore; import brooklyn.entity.rebind.persister.FileBasedObjectStore; import brooklyn.entity.rebind.persister.PersistMode; import brooklyn.management.ManagementContext; -import brooklyn.mementos.BrooklynMemento; +import brooklyn.mementos.BrooklynMementoRawData; import brooklyn.test.entity.TestApplication; import brooklyn.util.javalang.JavaClassNames; import brooklyn.util.os.Os; @@ -120,11 +119,11 @@ public class BrooklynLauncherRebindTestToFiles extends BrooklynLauncherRebindTes try { // Auto will rebind if the dir exists BrooklynLauncher launcher = newLauncherDefault(PersistMode.AUTO); - BrooklynMemento memento = launcher.retrieveState(); + BrooklynMementoRawData memento = launcher.retrieveState(); launcher.persistState(memento, destinationDir); launcher.terminate(); - assertEquals(memento.getApplicationIds().size(), 1, "apps="+memento.getApplicationIds()); + assertEquals(memento.getEntities().size(), 1, "entityMementos="+memento.getEntities().keySet()); // Should now have a usable copy in the destionationDir // Auto will rebind if the dir exists
