Repository: incubator-brooklyn Updated Branches: refs/heads/master 09b4e2361 -> 9a9e780e8
Ensure deterministic DynamicCluster member removal order Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/5947eb97 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/5947eb97 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/5947eb97 Branch: refs/heads/master Commit: 5947eb97d6a6559101be367bbbdf0c7be0d2f4ef Parents: 4a03c46 Author: Mike Zaccardo <[email protected]> Authored: Tue Nov 24 10:59:54 2015 -0500 Committer: Mike Zaccardo <[email protected]> Committed: Tue Nov 24 10:59:54 2015 -0500 ---------------------------------------------------------------------- .../entity/group/DynamicClusterImpl.java | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5947eb97/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java index ac79dd6..61180db 100644 --- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java +++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicClusterImpl.java @@ -139,18 +139,33 @@ public class DynamicClusterImpl extends AbstractGroupImpl implements DynamicClus private static final Function<Collection<Entity>, Entity> defaultRemovalStrategy = new Function<Collection<Entity>, Entity>() { @Override public Entity apply(Collection<Entity> contenders) { - // choose newest entity that is stoppable, or if none are stoppable take the newest non-stoppable - long newestTime = 0; + /* + * Choose the newest entity (largest cluster member ID or latest timestamp) that is stoppable. + * If none are stoppable, take the newest non-stoppable. + * + * Both cluster member ID and timestamp must be taken into consideration to account for legacy + * clusters that were created before the addition of the cluster member ID config value. + */ + int largestClusterMemberId = -1; + long newestTime = 0L; Entity newest = null; for (Entity contender : contenders) { - boolean newer = contender.getCreationTime() > newestTime; + Integer contenderClusterMemberId = contender.config().get(CLUSTER_MEMBER_ID); + long contenderCreationTime = contender.getCreationTime(); + + boolean newer = (contenderClusterMemberId != null && contenderClusterMemberId > largestClusterMemberId) || + contenderCreationTime > newestTime; + if ((contender instanceof Startable && newer) || (!(newest instanceof Startable) && ((contender instanceof Startable) || newer))) { newest = contender; - newestTime = contender.getCreationTime(); + + if (contenderClusterMemberId != null) largestClusterMemberId = contenderClusterMemberId; + newestTime = contenderCreationTime; } } + return newest; } };
