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

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

commit ec7794f20fc0cd07a37901a43f07f4e65517cb08
Author: Sam Tunnicliffe <[email protected]>
AuthorDate: Fri Nov 7 17:29:35 2025 +0000

    Avoid NPE when meta keyspace placements are empty before CMS is initialized
    
    Patch by Sam Tunnicliffe; reviewed by Marcus Eriksson for CASSANDRA-21004
---
 CHANGES.txt                                                       | 1 +
 src/java/org/apache/cassandra/service/StorageService.java         | 8 +++++---
 .../distributed/upgrade/ClusterMetadataSingleNodeUpgradeTest.java | 5 +++++
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 0f7cf787f4..ac61998c3a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.1
+ * Avoid NPE when meta keyspace placements are empty before CMS is initialized 
(CASSANDRA-21004)
  * Gossip entries for hibernating non-members don't block truncate 
(CASSANDRA-21003)
  * Retry without time limit calculates wait time incorrectly (CASSANDRA-21002)
  * Don't submit AlterSchemaStatements which produce no effect locally to the 
CMS (CASSANDRA-21001)
diff --git a/src/java/org/apache/cassandra/service/StorageService.java 
b/src/java/org/apache/cassandra/service/StorageService.java
index 84a61f6b26..5f41f57c5c 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -200,6 +200,7 @@ import org.apache.cassandra.tcm.membership.NodeAddresses;
 import org.apache.cassandra.tcm.membership.NodeId;
 import org.apache.cassandra.tcm.membership.NodeState;
 import org.apache.cassandra.tcm.migration.GossipCMSListener;
+import org.apache.cassandra.tcm.ownership.DataPlacement;
 import org.apache.cassandra.tcm.ownership.MovementMap;
 import org.apache.cassandra.tcm.ownership.TokenMap;
 import org.apache.cassandra.tcm.ownership.VersionedEndpoints;
@@ -2070,9 +2071,10 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         {
             if (keyspaceMetadata.params.replication.isMeta())
             {
-                rangeToEndpointMap.put(MetaStrategy.entireRange,
-                                       
metadata.placements.get(keyspaceMetadata.params.replication)
-                                       
.reads.forRange(MetaStrategy.entireRange).get());
+                DataPlacement placement = 
metadata.placements.get(keyspaceMetadata.params.replication);
+                // May be empty if mid-upgrade and CMS is not yet initialized
+                if (!placement.reads.isEmpty())
+                    rangeToEndpointMap.put(MetaStrategy.entireRange, 
placement.reads.forRange(MetaStrategy.entireRange).get());
             }
             else
             {
diff --git 
a/test/distributed/org/apache/cassandra/distributed/upgrade/ClusterMetadataSingleNodeUpgradeTest.java
 
b/test/distributed/org/apache/cassandra/distributed/upgrade/ClusterMetadataSingleNodeUpgradeTest.java
index 10d6c02dcc..24cf020a73 100644
--- 
a/test/distributed/org/apache/cassandra/distributed/upgrade/ClusterMetadataSingleNodeUpgradeTest.java
+++ 
b/test/distributed/org/apache/cassandra/distributed/upgrade/ClusterMetadataSingleNodeUpgradeTest.java
@@ -22,6 +22,10 @@ import org.junit.Test;
 
 import org.apache.cassandra.distributed.Constants;
 import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.service.StorageService;
+
+import static org.junit.Assert.assertTrue;
 
 /**
  * @see org.apache.cassandra.tools.nodetool.CMSAdmin.InitializeCMS
@@ -42,6 +46,7 @@ public class ClusterMetadataSingleNodeUpgradeTest extends 
UpgradeTestBase
             cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, 
ck int, v int, PRIMARY KEY (pk, ck))");
         })
         .runAfterClusterUpgrade((cluster) -> {
+            assertTrue(((IInvokableInstance)cluster.get(1)).callOnInstance(() 
-> 
StorageService.instance.getRangeToAddressMap("system_cluster_metadata").isEmpty()));
             cluster.get(1).nodetoolResult("cms", 
"initialize").asserts().success();
             // make sure we can execute transformations:
             cluster.schemaChange(withKeyspace("ALTER TABLE %s.tbl with comment 
= 'hello123'"));


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

Reply via email to