Repository: brooklyn-server Updated Branches: refs/heads/master 36cb70d2d -> 6f093c71f
Persisting entity: donât persist its adjuncts every time Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/492ebd58 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/492ebd58 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/492ebd58 Branch: refs/heads/master Commit: 492ebd58552b8f691ee22e0dd76e535fea56ef2c Parents: ff38a5c Author: Aled Sage <aled.s...@gmail.com> Authored: Wed May 23 10:47:24 2018 +0100 Committer: Aled Sage <aled.s...@gmail.com> Committed: Thu May 24 12:24:13 2018 +0100 ---------------------------------------------------------------------- .../core/BrooklynFeatureEnablement.java | 12 ++++++ .../mgmt/internal/EntityChangeListener.java | 1 + .../rebind/PeriodicDeltaChangeListener.java | 39 +++++++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java index 939a15d..8c142d8 100644 --- a/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java +++ b/core/src/main/java/org/apache/brooklyn/core/BrooklynFeatureEnablement.java @@ -59,6 +59,17 @@ public class BrooklynFeatureEnablement { public static final String FEATURE_FEED_PERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".feedPersistence"; + /** + * When persisting an entity that changes, whether to persist its adjuncts and locations + * (i.e. its enrichers, policies, feeds and locations). + * + * This was previously the default behaviour, which meant that (legacy) java-based Brooklyn objects + * (e.g. entities, locations, policies, enrichers or feeds) could get away with bad practices and + * still be persisted. For example, they could change 'state' without telling the listener, and hope + * that the entity they were attached to would soon persist (thus piggy-backing off it). + */ + public static final String FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY = FEATURE_PROPERTY_PREFIX+".referencedObjectsPersistence"; + /** whether feeds are automatically registered when set on entities, so that they are persisted */ public static final String FEATURE_FEED_REGISTRATION_PROPERTY = FEATURE_PROPERTY_PREFIX+".feedRegistration"; @@ -150,6 +161,7 @@ public class BrooklynFeatureEnablement { setDefault(FEATURE_FEED_REGISTRATION_PROPERTY, false); setDefault(FEATURE_BUNDLE_PERSISTENCE_PROPERTY, true); setDefault(FEATURE_CATALOG_PERSISTENCE_PROPERTY, true); + setDefault(FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY, false); setDefault(FEATURE_DEFAULT_STANDBY_IS_HOT_PROPERTY, false); setDefault(FEATURE_PERSIST_ENTITY_SPEC_AS_SUPPLIER, true); setDefault(FEATURE_RENAME_THREADS, false); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java index b7f53a4..a0f5d73 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityChangeListener.java @@ -29,6 +29,7 @@ public interface EntityChangeListener { // TODO for testing only! public static final EntityChangeListener NOOP = new EntityChangeListener() { + @Override public String toString() { return "EntityChangeListener.NOOP"; } @Override public void onChanged() {} @Override public void onAttributeChanged(AttributeSensor<?> attribute) {} @Override public void onConfigChanged(ConfigKey<?> key) {} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/492ebd58/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PeriodicDeltaChangeListener.java ---------------------------------------------------------------------- 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 e4b2d7d..349f47f 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 @@ -195,6 +195,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener { private final boolean persistPoliciesEnabled; private final boolean persistEnrichersEnabled; private final boolean persistFeedsEnabled; + private final boolean persistReferencedObjectsEnabled; private final Semaphore persistingMutex = new Semaphore(1); private final Object startStopMutex = new Object(); @@ -222,6 +223,7 @@ public class PeriodicDeltaChangeListener implements ChangeListener { this.persistPoliciesEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_POLICY_PERSISTENCE_PROPERTY); this.persistEnrichersEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_ENRICHER_PERSISTENCE_PROPERTY); this.persistFeedsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_FEED_PERSISTENCE_PROPERTY); + this.persistReferencedObjectsEnabled = BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY); } public void start() { @@ -355,6 +357,11 @@ public class PeriodicDeltaChangeListener implements ChangeListener { return state == ListenerState.STOPPING || state == ListenerState.STOPPED || executionContext.isShutdown(); } + /** + * @deprecated since 1.0.0; its use is enabled via BrooklynFeatureEnablement.FEATURE_REFERENCED_OBJECTS_PERSISTENCE_PROPERTY, + * to preserve backwards compatibility for legacy implementations of entities, policies, etc. + */ + @Deprecated private void addReferencedObjects(DeltaCollector deltaCollector) { MutableSet<BrooklynObject> referencedObjects = MutableSet.of(); @@ -443,7 +450,9 @@ public class PeriodicDeltaChangeListener implements ChangeListener { limitedCountString(prevDeltaCollector.entities), limitedCountString(prevDeltaCollector.locations), limitedCountString(prevDeltaCollector.policies), limitedCountString(prevDeltaCollector.enrichers), limitedCountString(prevDeltaCollector.catalogItems), limitedCountString(prevDeltaCollector.bundles), limitedCountString(prevDeltaCollector.removedEntityIds), limitedCountString(prevDeltaCollector.removedLocationIds), limitedCountString(prevDeltaCollector.removedPolicyIds), limitedCountString(prevDeltaCollector.removedEnricherIds), limitedCountString(prevDeltaCollector.removedCatalogItemIds), limitedCountString(prevDeltaCollector.removedBundleIds)}); - addReferencedObjects(prevDeltaCollector); + if (persistReferencedObjectsEnabled) { + addReferencedObjects(prevDeltaCollector); + } if (LOG.isTraceEnabled()) LOG.trace("Checkpointing delta of memento with references: " + "updating {} entities, {} locations, {} policies, {} enrichers, {} catalog items, {} bundles; " @@ -527,7 +536,35 @@ public class PeriodicDeltaChangeListener implements ChangeListener { public synchronized void onManaged(BrooklynObject instance) { if (LOG.isTraceEnabled()) LOG.trace("onManaged: {}", instance); onChanged(instance); + addReferencedObjects(instance); + } + + private void addReferencedObjects(BrooklynObject instance) { + if (!(instance instanceof Entity)) return; + Entity entity = (Entity) instance; + + MutableSet<BrooklynObject> referencedObjects = MutableSet.of(); + + // collect references + for (Location location : entity.getLocations()) { + Collection<Location> findLocationsInHierarchy = TreeUtils.findLocationsInHierarchy(location); + referencedObjects.addAll(findLocationsInHierarchy); + } + if (persistPoliciesEnabled) { + referencedObjects.addAll(entity.policies()); + } + if (persistEnrichersEnabled) { + referencedObjects.addAll(entity.enrichers()); + } + if (persistFeedsEnabled) { + referencedObjects.addAll(((EntityInternal)entity).feeds().getFeeds()); + } + + for (BrooklynObject ref : referencedObjects) { + deltaCollector.addIfNotRemoved(ref); + } } + @Override public synchronized void onUnmanaged(BrooklynObject instance) {