diff --git a/src/java/org/apache/cassandra/locator/CMSPlacementStrategy.java b/src/java/org/apache/cassandra/locator/CMSPlacementStrategy.java index 6a90aa1770..400553ce01 100644 --- a/src/java/org/apache/cassandra/locator/CMSPlacementStrategy.java +++ b/src/java/org/apache/cassandra/locator/CMSPlacementStrategy.java @@ -106,13 +106,13 @@ public interface CMSPlacementStrategy rf.put(e.getKey(), ReplicationFactor.fullOnly(e.getValue())); } - Directory directory = metadata.directory; + Directory tmpDirectory = metadata.directory; TokenMap tokenMap = metadata.tokenMap; for (NodeId peerId : metadata.directory.peerIds()) { if (!filter.apply(metadata, peerId)) { - directory = directory.without(peerId); + tmpDirectory = tmpDirectory.without(peerId); tokenMap = tokenMap.unassignTokens(peerId); } } @@ -123,7 +123,7 @@ public interface CMSPlacementStrategy Token minToken = DatabaseDescriptor.getPartitioner().getMinimumToken(); EndpointsForRange endpoints = NetworkTopologyStrategy.calculateNaturalReplicas(minToken, new Range<>(minToken, minToken), - directory, + tmpDirectory, tokenMap, rf); diff --git a/src/java/org/apache/cassandra/tcm/transformations/cms/PrepareCMSReconfiguration.java b/src/java/org/apache/cassandra/tcm/transformations/cms/PrepareCMSReconfiguration.java index 7daee231b1..0367640fda 100644 --- a/src/java/org/apache/cassandra/tcm/transformations/cms/PrepareCMSReconfiguration.java +++ b/src/java/org/apache/cassandra/tcm/transformations/cms/PrepareCMSReconfiguration.java @@ -215,6 +215,9 @@ public class PrepareCMSReconfiguration public static Diff diff(Set currentCms, Set newCms) { + assert !currentCms.contains(null) : "Current CMS contains a null value " + currentCms; + assert !newCms.contains(null) : "New CMS contains a null value " + newCms; + List additions = new ArrayList<>(); for (NodeId node : newCms) { diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java index 9e77b55815..2b2ce15086 100644 --- a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java +++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java @@ -30,9 +30,11 @@ import org.apache.cassandra.tcm.ClusterMetadataService; import org.apache.cassandra.tcm.MultiStepOperation; import org.apache.cassandra.tcm.Transformation; import org.apache.cassandra.tcm.sequences.LeaveStreams; +import org.apache.cassandra.tcm.sequences.ReconfigureCMS; import org.apache.cassandra.tcm.sequences.UnbootstrapAndLeave; import org.apache.cassandra.tcm.transformations.PrepareLeave; +import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort; import static org.apache.cassandra.utils.LazyToString.lazy; class OnClusterLeave extends OnClusterChangeTopology @@ -83,6 +85,9 @@ class OnClusterLeave extends OnClusterChangeTopology { super("Prepare Leave", actions, on, () -> { ClusterMetadata metadata = ClusterMetadata.current(); + ReconfigureCMS.maybeReconfigureCMS(metadata, getBroadcastAddressAndPort()); + + metadata = ClusterMetadata.current(); ClusterMetadataService.instance().commit(new PrepareLeave(metadata.myNodeId(), false, ClusterMetadataService.instance().placementProvider(), @@ -114,4 +119,4 @@ class OnClusterLeave extends OnClusterChangeTopology }); } } -} +} \ No newline at end of file diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java index d3f5d86720..19204e4d06 100644 --- a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java +++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java @@ -40,6 +40,7 @@ import org.apache.cassandra.tcm.MultiStepOperation; import org.apache.cassandra.tcm.Transformation; import org.apache.cassandra.tcm.membership.NodeId; import org.apache.cassandra.tcm.sequences.BootstrapAndReplace; +import org.apache.cassandra.tcm.sequences.ReconfigureCMS; import org.apache.cassandra.tcm.transformations.PrepareReplace; import static org.apache.cassandra.simulator.Action.Modifiers.NONE; @@ -132,7 +133,11 @@ class OnClusterReplace extends OnClusterChangeTopology { super("Prepare Replace", actions, joining, () -> { ClusterMetadata metadata = ClusterMetadata.current(); - ClusterMetadataService.instance().commit(new PrepareReplace(new NodeId(leavingNodeId), + NodeId leaving = new NodeId(leavingNodeId); + ReconfigureCMS.maybeReconfigureCMS(metadata, metadata.directory.endpoint(leaving)); + + metadata = ClusterMetadata.current(); + ClusterMetadataService.instance().commit(new PrepareReplace(leaving, metadata.myNodeId(), ClusterMetadataService.instance().placementProvider(), true,