diff --git a/CHANGES.txt b/CHANGES.txt index f10a89a289..25fbd74468 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.0.14: + * Fix NullPointerException when nodetool getendpoints is run + against invalid keyspaces or tables (CASSANDRA-8950) * Allow specifying the tmp dir (CASSANDRA-7712) * Improve compaction estimated tasks estimation (CASSANDRA-8904) * Fix duplicate up/down messages sent to native clients (CASSANDRA-7816) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 8085d7bddc..622380e88b 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -2778,7 +2778,14 @@ public class StorageService extends NotificationBroadcasterSupport implements IE */ public List getNaturalEndpoints(String keyspaceName, String cf, String key) { - CFMetaData cfMetaData = Schema.instance.getKSMetaData(keyspaceName).cfMetaData().get(cf); + KSMetaData ksMetaData = Schema.instance.getKSMetaData(keyspaceName); + if (ksMetaData == null) + throw new IllegalArgumentException("Unknown keyspace '" + keyspaceName + "'"); + + CFMetaData cfMetaData = ksMetaData.cfMetaData().get(cf); + if (cfMetaData == null) + throw new IllegalArgumentException("Unknown table '" + cf + "' in keyspace '" + keyspaceName + "'"); + return getNaturalEndpoints(keyspaceName, getPartitioner().getToken(cfMetaData.getKeyValidator().fromString(key))); } diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java index df533476ff..bc5410f909 100644 --- a/src/java/org/apache/cassandra/tools/NodeCmd.java +++ b/src/java/org/apache/cassandra/tools/NodeCmd.java @@ -1182,11 +1182,16 @@ public class NodeCmd private void printEndPoints(String keySpace, String cf, String key, PrintStream output) { - List endpoints = this.probe.getEndpoints(keySpace, cf, key); - - for (InetAddress anEndpoint : endpoints) + try { - output.println(anEndpoint.getHostAddress()); + List endpoints = probe.getEndpoints(keySpace, cf, key); + for (InetAddress anEndpoint : endpoints) + output.println(anEndpoint.getHostAddress()); + } + catch (IllegalArgumentException ex) + { + output.println(ex.getMessage()); + probe.failed(); } } diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 6b28f185a2..d66d12d75c 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -907,6 +907,11 @@ public class NodeProbe ssProxy.resetLocalSchema(); } + public void failed() + { + failed = true; + } + public boolean isFailed() { return failed;