Repository: brooklyn-server
Updated Branches:
  refs/heads/master 745d6de61 -> eb4992e28


Persist management plane ID


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/e799ca9e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/e799ca9e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/e799ca9e

Branch: refs/heads/master
Commit: e799ca9eef7d87aba6d37e6a093207ac5f0ae855
Parents: a940d49
Author: Svetoslav Neykov <[email protected]>
Authored: Thu Mar 30 17:19:43 2017 +0300
Committer: Svetoslav Neykov <[email protected]>
Committed: Tue Apr 11 17:55:12 2017 +0300

----------------------------------------------------------------------
 .../brooklyn/api/mgmt/ManagementContext.java    | 16 ++++++-
 .../api/mgmt/ha/ManagementNodeSyncRecord.java   |  2 -
 .../api/mgmt/ha/ManagementPlaneSyncRecord.java  |  2 +-
 .../rebind/PersistenceExceptionHandler.java     |  3 ++
 .../mgmt/rebind/mementos/BrooklynMemento.java   |  2 +
 .../mementos/BrooklynMementoManifest.java       |  2 +
 .../mementos/BrooklynMementoPersister.java      |  2 +
 .../rebind/mementos/BrooklynMementoRawData.java | 17 +++++++-
 .../mgmt/ha/HighAvailabilityManagerImpl.java    | 20 ++++++---
 ...ntPlaneSyncRecordPersisterToObjectStore.java |  6 +++
 .../ha/dto/ManagementPlaneSyncRecordImpl.java   | 11 +++++
 .../mgmt/internal/LocalManagementContext.java   | 34 +++++++++++++--
 .../NonDeploymentManagementContext.java         |  6 +++
 .../BrooklynMementoPersisterToObjectStore.java  | 38 ++++++++++++++++-
 .../mgmt/persist/BrooklynPersistenceUtils.java  |  1 +
 .../rebind/ActivePartialRebindIteration.java    |  5 +++
 .../rebind/PeriodicDeltaChangeListener.java     | 44 +++++++++++++++++---
 .../rebind/PersistenceExceptionHandlerImpl.java | 10 ++++-
 .../core/mgmt/rebind/PersisterDeltaImpl.java    |  7 ++++
 .../core/mgmt/rebind/RebindIteration.java       | 11 +++++
 .../core/mgmt/rebind/RebindManagerImpl.java     | 19 +++++++--
 .../mgmt/rebind/dto/BrooklynMementoImpl.java    | 13 ++++++
 .../rebind/dto/BrooklynMementoManifestImpl.java | 15 ++++++-
 .../mgmt/rebind/dto/MutableBrooklynMemento.java | 11 +++++
 .../rebind/transformer/CompoundTransformer.java |  1 +
 .../impl/DeleteOrphanedStateTransformer.java    |  1 +
 .../core/server/BrooklynServerPaths.java        |  2 +-
 .../ha/ImmutableManagementPlaneSyncRecord.java  | 23 ++++++++--
 .../ha/MutableManagementPlaneSyncRecord.java    | 12 +++++-
 .../core/mgmt/rebind/RebindTestUtils.java       |  2 +
 .../brooklyn/launcher/common/BasicLauncher.java |  2 +-
 .../AbstractCleanOrphanedStateTest.java         |  1 +
 .../brooklyn/launcher/BrooklynLauncherTest.java |  2 +-
 33 files changed, 308 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
index 9057b95..64e778a 100644
--- a/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
+++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/ManagementContext.java
@@ -39,6 +39,7 @@ import org.apache.brooklyn.config.StringConfigMap;
 import org.apache.brooklyn.util.guava.Maybe;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Optional;
 
 /**
  * This is the entry point for accessing and interacting with a realm of 
applications and their entities in Brooklyn.
@@ -66,9 +67,20 @@ public interface ManagementContext {
      * In other words the value of {@link 
Application#getManagementContext()#getManagementPlaneId()} 
      * will generally be constant (in contrast to {@link 
#getManagementNodeId()}).
      * <p>
-     * This value should not be null unless the management context is a 
non-functional
-     * (non-deployment) instance. */
+     * Throws an {@link NullPointerException} if the value hasn't been 
initialized yet. The value is set:
+     * <ul>
+     *   <li>no persistence - during launch
+     *   <li>persistence enabled, HA disabled - on rebind (during launch)
+     *   <li>persistence enabled, HA enabled - on the first HA state check 
(async to launch)
+     * </ul>
+     */
     String getManagementPlaneId();
+
+    /**
+     * Same as {@link #getManagementPlaneId()}, but will return {@link 
Optional#absent()} if the
+     * {@code managementPlaneId} hasn't been initialized yet.
+     */
+    Optional<String> getOptionalManagementPlaneId();
     
     /** 
      * UID for this {@link ManagementContext} node (as part of a single 
management plane).

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementNodeSyncRecord.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementNodeSyncRecord.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementNodeSyncRecord.java
index dccbd01..595fbcb 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementNodeSyncRecord.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementNodeSyncRecord.java
@@ -36,8 +36,6 @@ public interface ManagementNodeSyncRecord {
 
     // TODO Not setting URI currently; ManagementContext doesn't know its URI; 
only have one if web-console was enabled.
     
-    // TODO Add getPlaneId(); but first need to set it in a sensible way
-    
     String getBrooklynVersion();
     
     String getNodeId();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementPlaneSyncRecord.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementPlaneSyncRecord.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementPlaneSyncRecord.java
index 86bb74e..94acd05 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementPlaneSyncRecord.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/ha/ManagementPlaneSyncRecord.java
@@ -40,7 +40,7 @@ import com.google.common.annotations.Beta;
 @Beta
 public interface ManagementPlaneSyncRecord {
 
-    // TODO Add getPlaneId(); but first need to set it sensibly on each 
management node
+    String getPlaneId();
     
     String getMasterNodeId();
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/PersistenceExceptionHandler.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/PersistenceExceptionHandler.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/PersistenceExceptionHandler.java
index 759bca6..4a64720 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/PersistenceExceptionHandler.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/PersistenceExceptionHandler.java
@@ -41,4 +41,7 @@ public interface PersistenceExceptionHandler {
     void onPersistRawMementoFailed(BrooklynObjectType type, String id, 
Exception e);
 
     void onDeleteMementoFailed(String id, Exception e);
+    
+    void onUpdatePlaneIdFailed(String planeId, Exception e);
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMemento.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMemento.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMemento.java
index 1c66c70..8ee23da 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMemento.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMemento.java
@@ -37,6 +37,8 @@ import java.util.Map;
  */
 public interface BrooklynMemento extends Serializable {
 
+    public String getPlaneId();
+
     public EntityMemento getEntityMemento(String id);
     public LocationMemento getLocationMemento(String id);
     public PolicyMemento getPolicyMemento(String id);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoManifest.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoManifest.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoManifest.java
index 0b192ae..a96601f 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoManifest.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoManifest.java
@@ -38,6 +38,8 @@ public interface BrooklynMementoManifest extends Serializable 
{
         public String getCatalogItemId();
     }
 
+    public String getPlaneId();
+
     public Map<String, EntityMementoManifest> getEntityIdToManifest();
 
     public Map<String, String> getLocationIdToType();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoPersister.java
----------------------------------------------------------------------
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 03673fd..c2cdae3 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
@@ -110,6 +110,8 @@ public interface BrooklynMementoPersister {
     /** All methods on this interface are unmodifiable by the caller. 
Sub-interfaces may introduce modifiers. */
     // NB: the type-specific methods aren't actually used anymore; we could 
remove them to simplify the impl (and use a multiset there)
     public interface Delta {
+        String planeId();
+
         Collection<LocationMemento> locations();
         Collection<EntityMemento> entities();
         Collection<PolicyMemento> policies();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoRawData.java
----------------------------------------------------------------------
diff --git 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoRawData.java
 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoRawData.java
index f2ec4a9..e0a4c87 100644
--- 
a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoRawData.java
+++ 
b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/mementos/BrooklynMementoRawData.java
@@ -42,6 +42,7 @@ public class BrooklynMementoRawData {
     }
     
     public static class Builder {
+        protected String planeId;
         protected String brooklynVersion;
         protected final Map<String, String> entities = Maps.newConcurrentMap();
         protected final Map<String, String> locations = 
Maps.newConcurrentMap();
@@ -49,7 +50,12 @@ public class BrooklynMementoRawData {
         protected final Map<String, String> enrichers = 
Maps.newConcurrentMap();
         protected final Map<String, String> feeds = Maps.newConcurrentMap();
         protected final Map<String, String> catalogItems = 
Maps.newConcurrentMap();
-        
+
+        public Builder planeId(String val) {
+            planeId = val; return this;
+        }
+        /** @deprecated since 0.11.0; value not used */
+        @Deprecated
         public Builder brooklynVersion(String val) {
             brooklynVersion = val; return this;
         }
@@ -122,6 +128,7 @@ public class BrooklynMementoRawData {
         }
     }
 
+    private final String planeId;
     private final String brooklynVersion;
     private final Map<String, String> entities;
     private final Map<String, String> locations;
@@ -131,6 +138,7 @@ public class BrooklynMementoRawData {
     private final Map<String, String> catalogItems;
     
     private BrooklynMementoRawData(Builder builder) {
+        planeId = builder.planeId;
         brooklynVersion = builder.brooklynVersion;
         entities = builder.entities;
         locations = builder.locations;
@@ -140,10 +148,17 @@ public class BrooklynMementoRawData {
         catalogItems = builder.catalogItems;
     }
 
+    @Nullable
+    public String getPlaneId() {
+        return planeId;
+    }
+
     /**
      * Setting the brooklyn version explicitly is optional. 
+     * @deprecated since 0.11.0; value unused and not set anywhere
      */
     @Beta
+    @Deprecated
     @Nullable
     public String getBrooklynVersion() {
         return brooklynVersion;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
index c9f3a58..f968c96 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/HighAvailabilityManagerImpl.java
@@ -56,6 +56,7 @@ import 
org.apache.brooklyn.core.mgmt.ha.dto.ManagementPlaneSyncRecordImpl;
 import 
org.apache.brooklyn.core.mgmt.ha.dto.ManagementPlaneSyncRecordImpl.Builder;
 import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagementMode;
 import org.apache.brooklyn.core.mgmt.internal.LocalEntityManager;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.LocationManagerInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementTransitionMode;
@@ -278,10 +279,13 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
         ownNodeId = managementContext.getManagementNodeId();
         // TODO Small race in that we first check, and then we'll do 
checkMaster() on first poll,
         // so another node could have already become master or terminated in 
that window.
-        ManagementNodeSyncRecord existingMaster = hasHealthyMaster();
+        ManagementPlaneSyncRecord planeRec = 
loadManagementPlaneSyncRecord(false);
+        ManagementNodeSyncRecord existingMaster = hasHealthyMaster(planeRec);
         boolean weAreRecognisedAsMaster = existingMaster!=null && 
ownNodeId.equals(existingMaster.getNodeId());
         boolean weAreMasterLocally = 
getInternalNodeState()==ManagementNodeState.MASTER;
         
+        updatePlaneId(planeRec);
+        
         // catch error in some tests where mgmt context has a different HA 
manager
         if (managementContext.getHighAvailabilityManager()!=this)
             throw new IllegalStateException("Cannot start an HA manager on a 
management context with a different HA manager!");
@@ -456,6 +460,12 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
             registerPollTask();
     }
 
+    protected void updatePlaneId(ManagementPlaneSyncRecord existingMaster) {
+        if (existingMaster.getPlaneId() != null) {
+            
((LocalManagementContext)managementContext).setManagementPlaneId(existingMaster.getPlaneId());
+        }
+    }
+
     @Override
     public void setPriority(long priority) {
         this.priority = priority;
@@ -538,7 +548,6 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
         return lastSyncRecord;
     }
     
-    @SuppressWarnings("unchecked")
     protected void registerPollTask() {
         final Runnable job = new Runnable() {
             private boolean lastFailed;
@@ -687,9 +696,7 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
         return (timestampMe - timestampMaster) <= 
getHeartbeatTimeout().toMilliseconds();
     }
     
-    protected ManagementNodeSyncRecord hasHealthyMaster() {
-        ManagementPlaneSyncRecord memento = 
loadManagementPlaneSyncRecord(false);
-        
+    protected ManagementNodeSyncRecord 
hasHealthyMaster(ManagementPlaneSyncRecord memento ) {
         String nodeId = memento.getMasterNodeId();
         ManagementNodeSyncRecord masterMemento = (nodeId == null) ? null : 
memento.getManagementNodes().get(nodeId);
         
@@ -715,6 +722,8 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
             return;
         }
         
+        updatePlaneId(memento);
+        
         String currMasterNodeId = memento.getMasterNodeId();
         ManagementNodeSyncRecord currMasterNodeRecord = 
memento.getManagementNodes().get(currMasterNodeId);
         ManagementNodeSyncRecord ownNodeRecord = 
memento.getManagementNodes().get(ownNodeId);
@@ -971,6 +980,7 @@ public class HighAvailabilityManagerImpl implements 
HighAvailabilityManager {
         if (disabled) {
             // if HA is disabled, then we are the only node - no persistence; 
just load a memento to describe this node
             Builder builder = ManagementPlaneSyncRecordImpl.builder()
+                
.planeId(managementContext.getOptionalManagementPlaneId().orNull())
                 .node(createManagementNodeSyncRecord(true));
             if (getTransitionTargetNodeState() == ManagementNodeState.MASTER) {
                 builder.masterNodeId(ownNodeId);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
index dae25cf..f32a476 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/ManagementPlaneSyncRecordPersisterToObjectStore.java
@@ -36,6 +36,7 @@ import 
org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
 import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecordPersister;
 import org.apache.brooklyn.core.mgmt.ha.dto.BasicManagementNodeSyncRecord;
 import org.apache.brooklyn.core.mgmt.ha.dto.ManagementPlaneSyncRecordImpl;
+import 
org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.MementoSerializer;
 import org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.RetryingMementoSerializer;
@@ -93,6 +94,7 @@ public class ManagementPlaneSyncRecordPersisterToObjectStore 
implements Manageme
     // TODO Leak if we go through lots of managers; but tiny!
     private final ConcurrentMap<String, StoreObjectAccessorWithLock> 
nodeWriters = Maps.newConcurrentMap();
 
+    private StoreObjectAccessorWithLock planeIdReader;
     private StoreObjectAccessorWithLock masterWriter;
     private StoreObjectAccessorWithLock changeLogWriter;
 
@@ -143,6 +145,8 @@ public class 
ManagementPlaneSyncRecordPersisterToObjectStore implements Manageme
                 masterWriter = new 
StoreObjectAccessorLocking(objectStore.newAccessor("master"));
                 changeLogWriter = new 
StoreObjectAccessorLocking(objectStore.newAccessor("change.log"));
             }
+            // No need to wrap it in a write lock, doing it just for 
consistency
+            planeIdReader = new 
StoreObjectAccessorLocking(objectStore.newAccessor(BrooklynMementoPersisterToObjectStore.PLANE_ID_FILE_NAME));
         }
     }
 
@@ -194,6 +198,8 @@ public class 
ManagementPlaneSyncRecordPersisterToObjectStore implements Manageme
         } else {
             builder.masterNodeId(masterNodeId);
         }
+        
+        builder.planeId(Strings.emptyToNull(planeIdReader.get()));
 
         // Load node-files
         List<String> nodeFiles = 
objectStore.listContentsWithSubPath(NODES_SUB_PATH);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/ManagementPlaneSyncRecordImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/ManagementPlaneSyncRecordImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/ManagementPlaneSyncRecordImpl.java
index dd89320..f800f25 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/ManagementPlaneSyncRecordImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/ha/dto/ManagementPlaneSyncRecordImpl.java
@@ -41,9 +41,13 @@ public class ManagementPlaneSyncRecordImpl implements 
ManagementPlaneSyncRecord,
     }
     
     public static class Builder {
+        protected String planeId;
         protected String masterNodeId;
         protected final Map<String,ManagementNodeSyncRecord> nodes = 
MutableMap.of();
         
+        public Builder planeId(String val) {
+            planeId = val; return this;
+        }
         public Builder masterNodeId(String val) {
             masterNodeId = val; return this;
         }
@@ -62,10 +66,12 @@ public class ManagementPlaneSyncRecordImpl implements 
ManagementPlaneSyncRecord,
         }
     }
 
+    private String planeId;
     private String masterNodeId;
     private Map<String, ManagementNodeSyncRecord> managementNodes;
     
     private ManagementPlaneSyncRecordImpl(Builder builder) {
+        planeId = builder.planeId;
         masterNodeId = builder.masterNodeId;
         managementNodes = Maps.newLinkedHashMap();
         for (ManagementNodeSyncRecord node : builder.nodes.values()) {
@@ -75,6 +81,11 @@ public class ManagementPlaneSyncRecordImpl implements 
ManagementPlaneSyncRecord,
     }
 
     @Override
+    public String getPlaneId() {
+        return planeId;
+    }
+
+    @Override
     public String getMasterNodeId() {
         return masterNodeId;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContext.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContext.java
index 67cd15f..7418666 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContext.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalManagementContext.java
@@ -68,6 +68,8 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableSet;
 
@@ -187,8 +189,6 @@ public class LocalManagementContext extends 
AbstractManagementContext {
         
         checkNotNull(configMap, "brooklynProperties");
         
-        // TODO in a persisted world the planeId may be injected
-        this.managementPlaneId = Strings.makeRandomId(8);
         this.managementNodeId = Strings.makeRandomId(8);
         this.builder = builder;
         this.brooklynAdditionalProperties = brooklynAdditionalProperties;
@@ -212,7 +212,32 @@ public class LocalManagementContext extends 
AbstractManagementContext {
 
     @Override
     public String getManagementPlaneId() {
-        return managementPlaneId;
+        if (managementPlaneId != null) {
+            return managementPlaneId;
+        } else {
+            throw new NullPointerException("managementPlaneId not initialized 
yet. " +
+                    "Either it's too early in the process lifecycle or " +
+                    "ManagementContext hasn't been initialized properly");
+        }
+    }
+    
+    @Override
+    public Optional<String> getOptionalManagementPlaneId() {
+        return Optional.fromNullable(managementPlaneId);
+    }
+    
+    public void setManagementPlaneId(String newPlaneId) {
+        if (managementPlaneId != null && 
!managementPlaneId.equals(newPlaneId)) {
+            log.warn("Management plane ID changed from {} to {}", 
managementPlaneId, newPlaneId);
+        }
+        this.managementPlaneId = newPlaneId;
+    }
+
+    public void generateManagementPlaneId() {
+        if (this.managementPlaneId != null) {
+            throw new IllegalStateException("Request to generate a management 
plane ID but one already exists (" + managementPlaneId + ")");
+        }
+        this.managementPlaneId = Strings.makeRandomId(8);
     }
     
     @Override
@@ -391,7 +416,8 @@ public class LocalManagementContext extends 
AbstractManagementContext {
 
     @Override
     public String toString() {
-        return 
LocalManagementContext.class.getSimpleName()+"["+getManagementPlaneId()+"-"+getManagementNodeId()+"]";
+        String planeId = MoreObjects.firstNonNull(managementPlaneId, "?");
+        return 
LocalManagementContext.class.getSimpleName()+"["+planeId+"-"+getManagementNodeId()+"]";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
index dafb4c4..a839aed 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/NonDeploymentManagementContext.java
@@ -76,6 +76,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
@@ -128,6 +129,11 @@ public class NonDeploymentManagementContext implements 
ManagementContextInternal
     }
     
     @Override
+    public Optional<String> getOptionalManagementPlaneId() {
+        return (initialManagementContext == null) ? Optional.<String>absent() 
: initialManagementContext.getOptionalManagementPlaneId();
+    }
+    
+    @Override
     public String getManagementNodeId() {
         return (initialManagementContext == null) ? null : 
initialManagementContext.getManagementNodeId();
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynMementoPersisterToObjectStore.java
----------------------------------------------------------------------
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 de5fd0a..a89a528 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
@@ -88,6 +88,8 @@ public class BrooklynMementoPersisterToObjectStore implements 
BrooklynMementoPer
     // TODO Should stop() take a timeout, and shutdown the executor gracefully?
     
     private static final Logger LOG = 
LoggerFactory.getLogger(BrooklynMementoPersisterToObjectStore.class);
+    public static final String PLANE_ID_FILE_NAME = "planeId";
+
 
     public static final ConfigKey<Integer> PERSISTER_MAX_THREAD_POOL_SIZE = 
ConfigKeys.newIntegerConfigKey(
             "persister.threadpool.maxSize",
@@ -306,6 +308,7 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
 
         Stopwatch stopwatch = Stopwatch.createStarted();
 
+        builder.planeId(Strings.emptyToNull(read(PLANE_ID_FILE_NAME)));
         visitMemento("loading raw", subPathData, loaderVisitor, 
exceptionHandler);
         
         BrooklynMementoRawData result = builder.build();
@@ -328,6 +331,8 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
         
         final BrooklynMementoManifestImpl.Builder builder = 
BrooklynMementoManifestImpl.builder();
 
+        builder.planeId(mementoData.getPlaneId());
+
         Visitor visitor = new Visitor() {
             @Override
             public void visit(BrooklynObjectType type, String objectId, final 
String contents) throws Exception {
@@ -395,7 +400,9 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
         Stopwatch stopwatch = Stopwatch.createStarted();
 
         final BrooklynMementoImpl.Builder builder = 
BrooklynMementoImpl.builder();
-        
+
+        builder.planeId(mementoData.getPlaneId());
+
         Visitor visitor = new Visitor() {
             @Override
             public void visit(BrooklynObjectType type, String objectId, String 
contents) throws Exception {
@@ -518,6 +525,7 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
             Stopwatch stopwatch = Stopwatch.createStarted();
             List<ListenableFuture<?>> futures = Lists.newArrayList();
             
+            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()) {
                     futures.add(asyncPersist(type.getSubPathName(), type, 
entry.getKey(), entry.getValue(), exceptionHandler));
@@ -590,6 +598,9 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
                 deletedIds.addAll(delta.getRemovedIdsOfType(type));
             }
             
+            if (delta.planeId() != null) {
+                futures.add(asyncUpdatePlaneId(delta.planeId(), 
exceptionHandler));
+            }
             for (BrooklynObjectType type: 
BrooklynPersistenceUtils.STANDARD_BROOKLYN_OBJECT_TYPE_PERSISTENCE_ORDER) {
                 for (Memento item : delta.getObjectsOfType(type)) {
                     if (!deletedIds.contains(item.getId())) {
@@ -674,6 +685,23 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
         }
     }
 
+    private void updatePlaneId(String planeId, PersistenceExceptionHandler 
exceptionHandler) {
+        try {
+            if (planeId==null) {
+                LOG.warn("Null content for planeId");
+            }
+
+            String persistedPlaneId = read(PLANE_ID_FILE_NAME);
+            if (persistedPlaneId == null) {
+                getWriter(PLANE_ID_FILE_NAME).put(planeId);
+            } else if(!persistedPlaneId.equals(planeId)) {
+                throw new IllegalStateException("Persisted planeId found (" + 
persistedPlaneId + ") but instance planeId is different (" + planeId + ")");
+            }
+        } catch (Exception e) {
+            exceptionHandler.onUpdatePlaneIdFailed(planeId, e);
+        }
+    }
+
     private ListenableFuture<?> asyncPersist(final String subPath, final 
Memento memento, final PersistenceExceptionHandler exceptionHandler) {
         return executor.submit(new Runnable() {
             @Override
@@ -698,6 +726,14 @@ public class BrooklynMementoPersisterToObjectStore 
implements BrooklynMementoPer
             }});
     }
     
+    private ListenableFuture<?> asyncUpdatePlaneId(final String planeId, final 
PersistenceExceptionHandler exceptionHandler) {
+        return executor.submit(new Runnable() {
+            @Override
+            public void run() {
+                updatePlaneId(planeId, exceptionHandler);
+            }});
+    }
+
     private String getPath(String subPath, String id) {
         return subPath+"/"+Strings.makeValidFilename(id);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/BrooklynPersistenceUtils.java
----------------------------------------------------------------------
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 ff57645..4cade20 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
@@ -163,6 +163,7 @@ public class BrooklynPersistenceUtils {
         MementoSerializer<Object> rawSerializer = new 
XmlMementoSerializer<Object>(mgmt.getClass().getClassLoader());
         RetryingMementoSerializer<Object> serializer = new 
RetryingMementoSerializer<Object>(rawSerializer, 1);
         
+        result.planeId(mgmt.getManagementPlaneId());
         for (Location instance: mgmt.getLocationManager().getLocations())
             result.location(instance.getId(), 
serializer.toString(newObjectMemento(instance)));
         for (Entity instance: mgmt.getEntityManager().getEntities()) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindIteration.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindIteration.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindIteration.java
index dfd5a42..84e2089 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindIteration.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindIteration.java
@@ -131,6 +131,11 @@ public class ActivePartialRebindIteration extends 
RebindIteration {
     }
     
     @Override
+    protected void initPlaneId() {
+        // managementPlaneId is already initialized, no need to set it on 
partial rebind
+    }
+    
+    @Override
     protected void preprocessManifestFiles() throws Exception {
         for (CompoundTransformer transformer: transformers) {
             mementoRawData = transformer.transform(mementoRawData);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/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 fdfe362..68e47f7 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
@@ -28,8 +28,6 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.brooklyn.api.catalog.CatalogItem;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
@@ -58,9 +56,12 @@ import 
org.apache.brooklyn.util.exceptions.RuntimeInterruptedException;
 import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Stopwatch;
+import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -84,8 +85,11 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
 
     protected final AtomicLong checkpointLogCount = new AtomicLong();
     private static final int INITIAL_LOG_WRITES = 5;
+    private static final Duration PERSIST_PLANE_ID_PERIOD = Duration.ONE_HOUR;
 
     private static class DeltaCollector {
+        private String planeId;
+
         private Set<Location> locations = Sets.newLinkedHashSet();
         private Set<Entity> entities = Sets.newLinkedHashSet();
         private Set<Policy> policies = Sets.newLinkedHashSet();
@@ -101,7 +105,8 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
         private Set<String> removedCatalogItemIds = Sets.newLinkedHashSet();
 
         public boolean isEmpty() {
-            return locations.isEmpty() && entities.isEmpty() && 
policies.isEmpty() && 
+            return planeId == null &&
+                    locations.isEmpty() && entities.isEmpty() && 
policies.isEmpty() && 
                     enrichers.isEmpty() && feeds.isEmpty() &&
                     catalogItems.isEmpty() &&
                     removedEntityIds.isEmpty() && removedLocationIds.isEmpty() 
&& removedPolicyIds.isEmpty() && 
@@ -109,6 +114,10 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
                     removedCatalogItemIds.isEmpty();
         }
         
+        public void setPlaneId(String planeId) {
+            this.planeId = planeId;
+        }
+
         public void add(BrooklynObject instance) {
             BrooklynObjectType type = BrooklynObjectType.of(instance);
             getUnsafeCollectionOfType(type).add(instance);
@@ -187,8 +196,18 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
     private final AtomicInteger writeCount = new AtomicInteger(0);
 
     private PersistenceActivityMetrics metrics;
-    
-    public PeriodicDeltaChangeListener(ExecutionContext executionContext, 
BrooklynMementoPersister persister, PersistenceExceptionHandler 
exceptionHandler, PersistenceActivityMetrics metrics, Duration period) {
+
+    private CountdownTimer planeIdPersistTimer = 
CountdownTimer.newInstanceStarted(Duration.ZERO);
+    private Supplier<String> planeIdSupplier;
+
+    public PeriodicDeltaChangeListener(
+            Supplier<String> planeIdSupplier,
+            ExecutionContext executionContext,
+            BrooklynMementoPersister persister,
+            PersistenceExceptionHandler exceptionHandler,
+            PersistenceActivityMetrics metrics,
+            Duration period) {
+        this.planeIdSupplier = planeIdSupplier;
         this.executionContext = executionContext;
         this.persister = persister;
         this.exceptionHandler = exceptionHandler;
@@ -382,6 +401,8 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
             if (!alreadyHasMutex) persistingMutex.acquire();
             if (!isActive() && state != ListenerState.STOPPING) return;
             
+            updatePlaneIdIfTimedOut();
+
             // Atomically switch the delta, so subsequent modifications will 
be done in the
             // next scheduled persist
             DeltaCollector prevDeltaCollector;
@@ -411,7 +432,10 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
                 if (LOG.isTraceEnabled()) LOG.trace("No changes to persist 
since last delta");
             } else {
                 PersisterDeltaImpl persisterDelta = new PersisterDeltaImpl();
-                
+
+                if (prevDeltaCollector.planeId != null) {
+                    persisterDelta.planeId = prevDeltaCollector.planeId;
+                }
                 for (BrooklynObjectType type: 
BrooklynPersistenceUtils.STANDARD_BROOKLYN_OBJECT_TYPE_PERSISTENCE_ORDER) {
                     for (BrooklynObject instance: 
prevDeltaCollector.getCollectionOfType(type)) {
                         try {
@@ -453,6 +477,14 @@ public class PeriodicDeltaChangeListener implements 
ChangeListener {
         }
     }
     
+    private void updatePlaneIdIfTimedOut() {
+        if (planeIdPersistTimer.isExpired()) {
+            deltaCollector.setPlaneId(planeIdSupplier.get());
+            planeIdPersistTimer = PERSIST_PLANE_ID_PERIOD.countdownTimer();
+        }
+        
+    }
+
     private static String limitedCountString(Collection<?> items) {
         if (items==null) return null;
         int size = items.size();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersistenceExceptionHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersistenceExceptionHandlerImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersistenceExceptionHandlerImpl.java
index 063e547..8418c3c 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersistenceExceptionHandlerImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersistenceExceptionHandlerImpl.java
@@ -29,6 +29,7 @@ import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.Sets;
 
 public class PersistenceExceptionHandlerImpl implements 
PersistenceExceptionHandler {
@@ -82,7 +83,14 @@ public class PersistenceExceptionHandlerImpl implements 
PersistenceExceptionHand
         String errmsg = "delete for memento "+id;
         onErrorImpl(errmsg, e, prevFailedPersisters.add(id));
     }
-    
+
+    @Override
+    public void onUpdatePlaneIdFailed(String planeId, Exception e) {
+        String errmsg = "init planeId " + planeId;
+        String prevFailedId = MoreObjects.firstNonNull(planeId, 
"null-plane-id");
+        onErrorImpl(errmsg, e, prevFailedPersisters.add(prevFailedId));
+    }
+
     protected void onErrorImpl(String errmsg, Exception e, boolean isNew) {
         // TODO the default behaviour is simply to warn; we should have a 
"fail_at_end" behaviour,
         // and a way for other subsystems to tune in to such failures

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersisterDeltaImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersisterDeltaImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersisterDeltaImpl.java
index 7ea3a44..30ceaa6 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersisterDeltaImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/PersisterDeltaImpl.java
@@ -39,6 +39,8 @@ import com.google.common.collect.Sets;
 
 public class PersisterDeltaImpl implements Delta, MutableDelta {
     
+    String planeId;
+
     // use multiset?
     
     Collection<LocationMemento> locations = Sets.newLinkedHashSet();
@@ -54,6 +56,11 @@ public class PersisterDeltaImpl implements Delta, 
MutableDelta {
     Collection<String> removedEnricherIds = Sets.newLinkedHashSet();
     Collection <String> removedFeedIds = Sets.newLinkedHashSet();
     Collection<String> removedCatalogItemIds = Sets.newLinkedHashSet();
+    
+    @Override
+    public String planeId() {
+        return planeId;
+    }
 
     @Override
     public Collection<LocationMemento> locations() {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java
----------------------------------------------------------------------
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 f62db69..c4b171e 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
@@ -76,6 +76,7 @@ import 
org.apache.brooklyn.core.mgmt.classloading.JavaBrooklynClassLoadingContex
 import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagementMode;
 import org.apache.brooklyn.core.mgmt.internal.BrooklynObjectManagerInternal;
 import org.apache.brooklyn.core.mgmt.internal.EntityManagerInternal;
+import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.mgmt.internal.LocationManagerInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.mgmt.internal.ManagementTransitionMode;
@@ -235,6 +236,7 @@ public abstract class RebindIteration {
     
     protected void doRun() throws Exception {
         loadManifestFiles();
+        initPlaneId();
         rebuildCatalog();
         instantiateLocationsAndEntities();
         instantiateMementos();
@@ -467,6 +469,15 @@ public abstract class RebindIteration {
         memento = persistenceStoreAccess.loadMemento(mementoRawData, 
rebindContext.lookup(), exceptionHandler);
     }
 
+    protected void initPlaneId() {
+        String persistedPlaneId = mementoRawData.getPlaneId();
+        if (persistedPlaneId == null) {
+            
((LocalManagementContext)managementContext).generateManagementPlaneId();
+        } else {
+            
((LocalManagementContext)managementContext).setManagementPlaneId(persistedPlaneId);
+        }
+    }
+
     protected void instantiateAdjuncts(BrooklynObjectInstantiator 
instantiator) {
         
         checkEnteringPhase(5);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java
----------------------------------------------------------------------
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 a3e663c..d3693e2 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
@@ -52,8 +52,8 @@ import 
org.apache.brooklyn.core.mgmt.ha.HighAvailabilityManagerImpl;
 import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import 
org.apache.brooklyn.core.mgmt.persist.BrooklynMementoPersisterToObjectStore;
 import org.apache.brooklyn.core.mgmt.persist.BrooklynPersistenceUtils;
-import org.apache.brooklyn.core.mgmt.persist.PersistenceActivityMetrics;
 import 
org.apache.brooklyn.core.mgmt.persist.BrooklynPersistenceUtils.CreateBackupMode;
+import org.apache.brooklyn.core.mgmt.persist.PersistenceActivityMetrics;
 import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer;
 import org.apache.brooklyn.core.server.BrooklynServerConfig;
 import org.apache.brooklyn.util.collections.MutableList;
@@ -72,6 +72,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
+import com.google.common.base.Supplier;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -169,6 +170,13 @@ public class RebindManagerImpl implements RebindManager {
             rebinding.set(Boolean.TRUE);
         }
     }
+    
+    private class PlaneIdSupplier implements Supplier<String> {
+        @Override
+        public String get() {
+            return managementContext.getOptionalManagementPlaneId().orNull();
+        }
+    }
 
     public RebindManagerImpl(ManagementContextInternal managementContext) {
         this.managementContext = managementContext;
@@ -238,7 +246,13 @@ public class RebindManagerImpl implements RebindManager {
         
         this.persistenceStoreAccess = checkNotNull(val, "persister");
         
-        this.persistenceRealChangeListener = new 
PeriodicDeltaChangeListener(managementContext.getServerExecutionContext(), 
persistenceStoreAccess, exceptionHandler, persistMetrics, 
periodicPersistPeriod);
+        this.persistenceRealChangeListener = new PeriodicDeltaChangeListener(
+                new PlaneIdSupplier(),
+                managementContext.getServerExecutionContext(),
+                persistenceStoreAccess,
+                exceptionHandler,
+                persistMetrics,
+                periodicPersistPeriod);
         this.persistencePublicChangeListener = new 
SafeChangeListener(persistenceRealChangeListener);
         
         if (persistenceRunning) {
@@ -278,7 +292,6 @@ public class RebindManagerImpl implements RebindManager {
         LOG.debug("Stopped rebind (persistence), mgmt 
"+managementContext.getManagementNodeId());
     }
     
-    @SuppressWarnings("unchecked")
     @Override
     public void startReadOnly(final ManagementNodeState mode) {
         if (!ManagementNodeState.isHotProxy(mode)) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoImpl.java
index 57276d5..d6dd359 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoImpl.java
@@ -47,6 +47,7 @@ public class BrooklynMementoImpl implements BrooklynMemento, 
Serializable {
     }
     
     public static class Builder {
+        protected String planeId;
         protected String brooklynVersion = BrooklynVersion.get();
         protected final List<String> applicationIds = 
Collections.synchronizedList(Lists.<String>newArrayList());
         protected final List<String> topLevelLocationIds = 
Collections.synchronizedList(Lists.<String>newArrayList());
@@ -58,6 +59,11 @@ public class BrooklynMementoImpl implements BrooklynMemento, 
Serializable {
         protected final Map<String, CatalogItemMemento> catalogItems = 
Maps.newConcurrentMap();
 
         
+        public Builder planeId(String val) {
+            planeId = val; return this;
+        }
+        /** @deprecated since 0.11.0; value unused */
+        @Deprecated
         public Builder brooklynVersion(String val) {
             brooklynVersion = val; return this;
         }
@@ -132,6 +138,7 @@ public class BrooklynMementoImpl implements 
BrooklynMemento, Serializable {
         }
     }
 
+    private String planeId;
     @SuppressWarnings("unused")
     private String brooklynVersion;
     private List<String> applicationIds;
@@ -144,6 +151,7 @@ public class BrooklynMementoImpl implements 
BrooklynMemento, Serializable {
     private Map<String, CatalogItemMemento> catalogItems;
     
     private BrooklynMementoImpl(Builder builder) {
+        planeId = builder.planeId;
         brooklynVersion = builder.brooklynVersion;
         applicationIds = builder.applicationIds;
         topLevelLocationIds = builder.topLevelLocationIds;
@@ -156,6 +164,11 @@ public class BrooklynMementoImpl implements 
BrooklynMemento, Serializable {
     }
 
     @Override
+    public String getPlaneId() {
+        return planeId;
+    }
+
+    @Override
     public EntityMemento getEntityMemento(String id) {
         return entities.get(id);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
index 62ee2c6..664ddfe 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java
@@ -38,6 +38,7 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
     }
     
     public static class Builder {
+        protected String planeId;
         protected String brooklynVersion;
         protected final Map<String, EntityMementoManifest> entityIdToManifest 
= Maps.newConcurrentMap();
         protected final Map<String, String> locationIdToType = 
Maps.newConcurrentMap();
@@ -45,7 +46,12 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
         protected final Map<String, String> enricherIdToType = 
Maps.newConcurrentMap();
         protected final Map<String, String> feedIdToType = 
Maps.newConcurrentMap();
         protected final Map<String, CatalogItemMemento> catalogItems = 
Maps.newConcurrentMap();
-        
+
+        public Builder planeId(String planeId) {
+            this.planeId = planeId; return this;
+        }
+        /** @deprecated since 0.11.0; value is not used */
+        @Deprecated
         public Builder brooklynVersion(String val) {
             brooklynVersion = val; return this;
         }
@@ -103,6 +109,7 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
         }
     }
 
+    private final String planeId;
     private final Map<String, EntityMementoManifest> entityIdToManifest;
     private final Map<String, String> locationIdToType;
     private final Map<String, String> policyIdToType;
@@ -111,6 +118,7 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
     private Map<String, CatalogItemMemento> catalogItems;
     
     private BrooklynMementoManifestImpl(Builder builder) {
+        planeId = builder.planeId;
         entityIdToManifest = builder.entityIdToManifest;
         locationIdToType = builder.locationIdToType;
         policyIdToType = builder.policyIdToType;
@@ -120,6 +128,11 @@ public class BrooklynMementoManifestImpl implements 
BrooklynMementoManifest, Ser
     }
 
     @Override
+    public String getPlaneId() {
+        return planeId;
+    }
+
+    @Override
     public Map<String, EntityMementoManifest> getEntityIdToManifest() {
         return Collections.unmodifiableMap(entityIdToManifest);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
index 898fa91..7dce070 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MutableBrooklynMemento.java
@@ -51,6 +51,7 @@ public class MutableBrooklynMemento implements 
BrooklynMemento {
 
     private static final long serialVersionUID = -442895028005849060L;
     
+    private String planeId;
     private final Collection<String> applicationIds = Sets.newLinkedHashSet();
     private final Collection<String> topLevelLocationIds = 
Sets.newLinkedHashSet();
     private final Map<String, EntityMemento> entities = 
Maps.newLinkedHashMap();
@@ -68,6 +69,7 @@ public class MutableBrooklynMemento implements 
BrooklynMemento {
     }
     
     public void reset(BrooklynMemento memento) {
+        planeId = memento.getPlaneId();
         applicationIds.addAll(memento.getApplicationIds());
         topLevelLocationIds.addAll(memento.getTopLevelLocationIds());
         for (String entityId : memento.getEntityIds()) {
@@ -78,6 +80,10 @@ public class MutableBrooklynMemento implements 
BrooklynMemento {
         }
     }
 
+    public void setPlaneId(String planeId) {
+        this.planeId = planeId;
+    }
+
     public void updateEntityMemento(EntityMemento memento) {
         updateEntityMementos(ImmutableSet.of(memento));
     }
@@ -189,6 +195,11 @@ public class MutableBrooklynMemento implements 
BrooklynMemento {
     public void removeCatalogItems(Collection<String> ids) {
         catalogItems.keySet().removeAll(ids);
     }
+    
+    @Override
+    public String getPlaneId() {
+        return planeId;
+    }
 
     @Override
     public EntityMemento getEntityMemento(String id) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
index ef8531c..74b8bb0 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java
@@ -353,6 +353,7 @@ public class CompoundTransformer {
         }
         
         return BrooklynMementoRawData.builder()
+                .planeId(rawData.getPlaneId())
                 .entities(entities)
                 .locations(locations)
                 .policies(policies)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/impl/DeleteOrphanedStateTransformer.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/impl/DeleteOrphanedStateTransformer.java
 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/impl/DeleteOrphanedStateTransformer.java
index 04fdef5..de0f065 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/impl/DeleteOrphanedStateTransformer.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/impl/DeleteOrphanedStateTransformer.java
@@ -97,6 +97,7 @@ public class DeleteOrphanedStateTransformer extends 
CompoundTransformer {
         LOG.info("Deleting {} orphaned feed{} (of {}): {}", new Object[] 
{feedsToDelete.size(), Strings.s(feedsToDelete.size()), 
input.getFeeds().size(), feedsToDelete});
         
         return BrooklynMementoRawData.builder()
+                .planeId(input.getPlaneId())
                 .brooklynVersion(input.getBrooklynVersion())
                 .catalogItems(input.getCatalogItems())
                 .entities(input.getEntities())

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java 
b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
index 16d7c5a..4ac5e2c 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/server/BrooklynServerPaths.java
@@ -224,7 +224,7 @@ public class BrooklynServerPaths {
     
     public static File getBrooklynWebTmpDir(ManagementContext mgmt) {
         String brooklynMgmtBaseDir = getMgmtBaseDir(mgmt);
-        File webappTempDir = new File(Os.mergePaths(brooklynMgmtBaseDir, 
"planes", mgmt.getManagementPlaneId(), mgmt.getManagementNodeId(), "jetty"));
+        File webappTempDir = new File(Os.mergePaths(brooklynMgmtBaseDir, 
"planes", mgmt.getManagementNodeId(), "jetty"));
         try {
             FileUtils.forceMkdir(webappTempDir);
             Os.deleteOnExitRecursivelyAndEmptyParentsUpTo(webappTempDir, new 
File(brooklynMgmtBaseDir)); 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ImmutableManagementPlaneSyncRecord.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ImmutableManagementPlaneSyncRecord.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ImmutableManagementPlaneSyncRecord.java
index 4496037..6599640 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ImmutableManagementPlaneSyncRecord.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/ImmutableManagementPlaneSyncRecord.java
@@ -23,19 +23,26 @@ import java.util.Map;
 import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord;
 import org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
 
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableMap;
 
 public class ImmutableManagementPlaneSyncRecord implements 
ManagementPlaneSyncRecord {
+    private final String planeId;
     private final String masterNodeId;
     private final Map<String, ManagementNodeSyncRecord> managementNodes;
 
-    ImmutableManagementPlaneSyncRecord(String masterNodeId, Map<String, 
ManagementNodeSyncRecord> nodes) {
+    ImmutableManagementPlaneSyncRecord(String planeId, String masterNodeId, 
Map<String, ManagementNodeSyncRecord> nodes) {
+        this.planeId = planeId;
         this.masterNodeId = masterNodeId;
         this.managementNodes = ImmutableMap.copyOf(nodes);
     }
     
     @Override
+    public String getPlaneId() {
+        return planeId;
+    }
+    
+    @Override
     public String getMasterNodeId() {
         return masterNodeId;
     }
@@ -47,11 +54,19 @@ public class ImmutableManagementPlaneSyncRecord implements 
ManagementPlaneSyncRe
 
     @Override
     public String toString() {
-        return Objects.toStringHelper(this).add("master", 
masterNodeId).add("nodes", managementNodes.keySet()).toString();
+        return MoreObjects.toStringHelper(this)
+                .add("planeId", planeId)
+                .add("master", masterNodeId)
+                .add("nodes", managementNodes.keySet())
+                .toString();
     }
     
     @Override
     public String toVerboseString() {
-        return Objects.toStringHelper(this).add("master", 
masterNodeId).add("nodes", managementNodes).toString();
+        return MoreObjects.toStringHelper(this)
+                .add("planeId", planeId)
+                .add("master", masterNodeId)
+                .add("nodes", managementNodes)
+                .toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MutableManagementPlaneSyncRecord.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MutableManagementPlaneSyncRecord.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MutableManagementPlaneSyncRecord.java
index 09964c5..ca256c5 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MutableManagementPlaneSyncRecord.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/ha/MutableManagementPlaneSyncRecord.java
@@ -26,8 +26,14 @@ import 
org.apache.brooklyn.api.mgmt.ha.ManagementPlaneSyncRecord;
 import com.google.common.collect.Maps;
 
 public class MutableManagementPlaneSyncRecord implements 
ManagementPlaneSyncRecord {
+    private String planeId;
     private String masterNodeId;
     private Map<String, ManagementNodeSyncRecord> managementNodes = 
Maps.newConcurrentMap();
+    
+    @Override
+    public String getPlaneId() {
+        return planeId;
+    }
 
     @Override
     public String getMasterNodeId() {
@@ -45,7 +51,11 @@ public class MutableManagementPlaneSyncRecord implements 
ManagementPlaneSyncReco
     }
 
     public ImmutableManagementPlaneSyncRecord snapshot() {
-        return new ImmutableManagementPlaneSyncRecord(masterNodeId, 
managementNodes);
+        return new ImmutableManagementPlaneSyncRecord(planeId, masterNodeId, 
managementNodes);
+    }
+    
+    public void setPlaneId(String planeId) {
+        this.planeId = planeId;
     }
     
     public void setMasterNodeId(String masterNodeId) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
index fa59b5a..3f8e330 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
@@ -55,6 +55,7 @@ import 
org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 import org.apache.brooklyn.util.io.FileUtil;
 import org.apache.brooklyn.util.javalang.Serializers;
 import org.apache.brooklyn.util.javalang.Serializers.ObjectReplacer;
+import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -226,6 +227,7 @@ public class RebindTestUtils {
             }
             if (forLive) {
                 unstarted = new LocalManagementContext(properties);
+                unstarted.generateManagementPlaneId();
             } else {
                 unstarted = 
LocalManagementContextForTests.builder(true).useProperties(properties).disableOsgi(!enableOsgi).build();
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java
----------------------------------------------------------------------
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 5b157a3..afad4c9 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
@@ -571,7 +571,7 @@ public class BasicLauncher<T extends BasicLauncher<T>> {
         if (persistMode == PersistMode.DISABLED) {
             LOG.info("Persistence disabled");
             objectStore = null;
-            
+            
((LocalManagementContext)managementContext).generateManagementPlaneId();
         } else {
             try {
                 if (persistenceLocation == null) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
----------------------------------------------------------------------
diff --git 
a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
 
b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
index 8c5608e..b64f291 100644
--- 
a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
+++ 
b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java
@@ -52,6 +52,7 @@ public abstract class AbstractCleanOrphanedStateTest extends 
RebindTestFixtureWi
         @Override
         public BrooklynMementoRawData apply(BrooklynMementoRawData input) {
             return BrooklynMementoRawData.builder()
+                    .planeId(input.getPlaneId())
                     .brooklynVersion(input.getBrooklynVersion())
                     .catalogItems(input.getCatalogItems())
                     .entities(MutableMap.<String, 
String>builder().putAll(input.getEntities()).removeAll(deletions.entities).build())

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/e799ca9e/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
----------------------------------------------------------------------
diff --git 
a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java 
b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
index 72f389e..8e89352 100644
--- 
a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
+++ 
b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java
@@ -101,7 +101,7 @@ public class BrooklynLauncherTest {
                 .start();
         
         ManagementContext managementContext = 
launcher.getServerDetails().getManagementContext();
-        String expectedTempDir = Os.mergePaths(Os.home(), dataDirName, 
"planes", managementContext.getManagementPlaneId(), 
managementContext.getManagementNodeId(), "jetty");
+        String expectedTempDir = Os.mergePaths(Os.home(), dataDirName, 
"planes", managementContext.getManagementNodeId(), "jetty");
         
         File webappTempDir = 
launcher.getServerDetails().getWebServer().getWebappTempDir();
         assertEquals(webappTempDir.getAbsolutePath(), expectedTempDir);

Reply via email to