Jaydeepkumar Chovatia created CASSANDRA-14952: -------------------------------------------------
Summary: NPE when using allocate_tokens_for_keyspace and add new DC Key: CASSANDRA-14952 URL: https://issues.apache.org/jira/browse/CASSANDRA-14952 Project: Cassandra Issue Type: Bug Components: Cluster/Gossip Reporter: Jaydeepkumar Chovatia Received following NPE while bootstrapping very first node in the new datacenter with {{allocate_tokens_for_keyspace}} yaml option {code:java} INFO 21:44:13 JOINING: getting bootstrap token Exception (java.lang.NullPointerException) encountered during startup: null java.lang.NullPointerException at org.apache.cassandra.dht.tokenallocator.TokenAllocation.getStrategy(TokenAllocation.java:208) at org.apache.cassandra.dht.tokenallocator.TokenAllocation.getStrategy(TokenAllocation.java:170) at org.apache.cassandra.dht.tokenallocator.TokenAllocation.allocateTokens(TokenAllocation.java:55) at org.apache.cassandra.dht.BootStrapper.allocateTokens(BootStrapper.java:206) at org.apache.cassandra.dht.BootStrapper.getBootstrapTokens(BootStrapper.java:173) at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:854) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:666) at org.apache.cassandra.service.StorageService.initServer(StorageService.java:579) at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:351) at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:586) at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:714) {code} Please find reproducible steps here: 1. Set {{allocate_tokens_for_keyspace}} property with {{Networktopologystrategy}} say {{{{Networktopologystrategy, 'dc1' : 1, 'dc2' : 1}}}} 2. Start first node in {{dc1}} 3. Now bootstrap second node in {{dc2,}} it will throw above exception. RCA: [doAddEndpoint|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/locator/TokenMetadata.java#L1325] is invoked from the [bootstrap|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/service/StorageService.java#L1254] and at this time [local node's rack information|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/locator/TokenMetadata.java#L1276] is available However with have {{allocate_tokens_for_keyspace}} option, daemon tries to access rack information even before calling [bootstrap|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/service/StorageService.java#L1241] function, at [this place|https://github.com/apache/cassandra/blob/cassandra-3.0/src/java/org/apache/cassandra/service/StorageService.java#L878] which results in NPE Fix: Since this is applicable to only very first node for new dc, we can check for {{null}} as: {code:java} diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java index 8d8a6ffeca..e162757d95 100644 --- a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java +++ b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java @@ -205,7 +205,11 @@ public class TokenAllocation final int replicas = rs.getReplicationFactor(dc); Topology topology = tokenMetadata.getTopology(); - int racks = topology.getDatacenterRacks().get(dc).asMap().size(); + int racks = 1; + if (topology.getDatacenterRacks().get(dc) != null) + { + racks = topology.getDatacenterRacks().get(dc).asMap().size(); + } if (racks >= replicas) { {code} Let me know your comments. -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org