Avoid NPE when meta keyspace placements are empty before CMS is initialized

Patch by Sam Tunnicliffe; reviewed by Marcus Eriksson for CASSANDRA-21004
This commit is contained in:
Sam Tunnicliffe 2025-11-07 17:29:35 +00:00
parent 62bd9ab1ae
commit ec7794f20f
3 changed files with 11 additions and 3 deletions

View File

@ -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)

View File

@ -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
{

View File

@ -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'"));