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]
