This is an automated email from the ASF dual-hosted git repository.

ifesdjeen pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 018feb36f4 NPE on Directory in ShortPaxosSimulationTest
018feb36f4 is described below

commit 018feb36f42d28bc11073741ef224b42f9a60ad0
Author: Alex Petrov <[email protected]>
AuthorDate: Thu Jul 25 14:47:13 2024 +0200

    NPE on Directory in ShortPaxosSimulationTest
    
    Patch by Alex Petrov, reviewed by Caleb Rackliffe and Marcus Eriksson for 
CASSANDRA-19794
---
 src/java/org/apache/cassandra/locator/CMSPlacementStrategy.java    | 6 +++---
 .../tcm/transformations/cms/PrepareCMSReconfiguration.java         | 3 +++
 .../org/apache/cassandra/simulator/cluster/OnClusterLeave.java     | 7 ++++++-
 .../org/apache/cassandra/simulator/cluster/OnClusterReplace.java   | 7 ++++++-
 4 files changed, 18 insertions(+), 5 deletions(-)

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<NodeId> currentCms, Set<NodeId> newCms)
     {
+        assert !currentCms.contains(null) : "Current CMS contains a null value 
" + currentCms;
+        assert !newCms.contains(null) : "New CMS contains a null value " + 
newCms;
+
         List<NodeId> 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,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to