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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 035705f494 Print friendly error when nodetool attempts to connect to 
uninitialized server
035705f494 is described below

commit 035705f49464a4854482e1f1280a7af45f7f0203
Author: williamvietnguyen <williamvnguy...@gmail.com>
AuthorDate: Wed Dec 21 11:10:35 2022 -0800

    Print friendly error when nodetool attempts to connect to uninitialized 
server
    
    Patch by William Nguyen; Reviewed by Paulo Motta, Brandon Williams for 
CASSANDRA-11537
---
 CHANGES.txt                                        |  1 +
 .../apache/cassandra/service/StorageService.java   | 17 ++++++--
 src/java/org/apache/cassandra/tools/NodeTool.java  |  6 +++
 .../org/apache/cassandra/tools/NodeProbeTest.java  |  1 +
 .../tools/nodetool/ClearSnapshotTest.java          |  1 +
 .../cassandra/tools/nodetool/CompactTest.java      |  1 +
 .../cassandra/tools/nodetool/GetAuditLogTest.java  |  1 +
 .../tools/nodetool/GetAuthCacheConfigTest.java     |  1 +
 .../tools/nodetool/GetFullQueryLogTest.java        |  1 +
 .../nodetool/InvalidateCredentialsCacheTest.java   |  1 +
 .../InvalidateJmxPermissionsCacheTest.java         |  1 +
 .../InvalidateNetworkPermissionsCacheTest.java     |  1 +
 .../nodetool/InvalidatePermissionsCacheTest.java   |  1 +
 .../tools/nodetool/InvalidateRolesCacheTest.java   |  1 +
 .../tools/nodetool/SetAuthCacheConfigTest.java     |  1 +
 .../tools/nodetool/SetGetColumnIndexSizeTest.java  |  1 +
 .../nodetool/SetGetCompactionThroughputTest.java   |  1 +
 ...etEntireSSTableInterDCStreamThroughputTest.java |  1 +
 .../SetGetEntireSSTableStreamThroughputTest.java   |  1 +
 .../SetGetInterDCStreamThroughputTest.java         |  1 +
 .../tools/nodetool/SetGetStreamThroughputTest.java |  1 +
 .../cassandra/tools/nodetool/SnapshotTest.java     |  1 +
 .../tools/nodetool/UninitializedServerTest.java    | 46 ++++++++++++++++++++++
 23 files changed, 86 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 881f9c2d5d..a1df8fea13 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.2
+ * Print friendly error when nodetool attempts to connect to uninitialized 
server (CASSANDRA-11537)
  * Use G1GC by default, and update default G1GC settings (CASSANDRA-18027)
  * SimpleSeedProvider can resolve multiple IP addresses per DNS record 
(CASSANDRA-14361)
  * Remove mocking in InternalNodeProbe spying on StorageServiceMBean 
(CASSANDRA-18152)
diff --git a/src/java/org/apache/cassandra/service/StorageService.java 
b/src/java/org/apache/cassandra/service/StorageService.java
index 170dade2d5..47014536fb 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -381,12 +381,16 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         super(JMXBroadcastExecutor.executor);
 
         jmxObjectName = "org.apache.cassandra.db:type=StorageService";
-        MBeanWrapper.instance.registerMBean(this, jmxObjectName);
-        MBeanWrapper.instance.registerMBean(StreamManager.instance, 
StreamManager.OBJECT_NAME);
 
         sstablesTracker = new 
SSTablesGlobalTracker(SSTableFormat.Type.current());
     }
 
+    private void registerMBeans()
+    {
+        MBeanWrapper.instance.registerMBean(this, jmxObjectName);
+        MBeanWrapper.instance.registerMBean(StreamManager.instance, 
StreamManager.OBJECT_NAME);
+    }
+
     public void registerDaemon(CassandraDaemon daemon)
     {
         this.daemon = daemon;
@@ -844,7 +848,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         if (!Boolean.parseBoolean(System.getProperty("cassandra.start_gossip", 
"true")))
         {
             logger.info("Not starting gossip as requested.");
-            initialized = true;
+            completeInitialization();
             return;
         }
 
@@ -882,6 +886,13 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
             logger.info("Not joining ring as requested. Use JMX 
(StorageService->joinRing()) to initiate ring joining");
         }
 
+        completeInitialization();
+    }
+
+    private void completeInitialization()
+    {
+        if (!initialized)
+            registerMBeans();
         initialized = true;
     }
 
diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java 
b/src/java/org/apache/cassandra/tools/NodeTool.java
index 5dca8eda73..5500240477 100644
--- a/src/java/org/apache/cassandra/tools/NodeTool.java
+++ b/src/java/org/apache/cassandra/tools/NodeTool.java
@@ -45,6 +45,8 @@ import java.util.Map.Entry;
 import java.util.Scanner;
 import java.util.SortedMap;
 
+import javax.management.InstanceNotFoundException;
+
 import com.google.common.base.Joiner;
 import com.google.common.base.Throwables;
 
@@ -307,6 +309,10 @@ public class NodeTool
 
     protected void err(Throwable e)
     {
+        // CASSANDRA-11537: friendly error message when server is not ready
+        if (e instanceof InstanceNotFoundException)
+            throw new IllegalArgumentException("Server is not initialized yet, 
cannot run nodetool.");
+
         output.err.println("error: " + e.getMessage());
         output.err.println("-- StackTrace --");
         output.err.println(getStackTraceAsString(e));
diff --git a/test/unit/org/apache/cassandra/tools/NodeProbeTest.java 
b/test/unit/org/apache/cassandra/tools/NodeProbeTest.java
index 22554e69a8..2947a26d25 100644
--- a/test/unit/org/apache/cassandra/tools/NodeProbeTest.java
+++ b/test/unit/org/apache/cassandra/tools/NodeProbeTest.java
@@ -37,6 +37,7 @@ public class NodeProbeTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
         probe = new NodeProbe(jmxHost, jmxPort);
     }
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
index d58d4bb5da..379d02a66e 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
@@ -61,6 +61,7 @@ public class ClearSnapshotTest extends CQLTester
     public static void setup() throws Exception
     {
         startJMXServer();
+        requireNetwork();
         probe = new NodeProbe(jmxHost, jmxPort);
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java
index 34059aa13c..928f8851e8 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java
@@ -35,6 +35,7 @@ public class CompactTest extends CQLTester
     @BeforeClass
     public static void setup() throws Throwable
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java
index 069710bc05..b96187fb0c 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java
@@ -32,6 +32,7 @@ public class GetAuditLogTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java
index e32040da66..90484e3c58 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java
@@ -42,6 +42,7 @@ public class GetAuthCacheConfigTest extends CQLTester
     {
         CQLTester.setUpClass();
         CQLTester.requireAuthentication();
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
index 61d34ec9a8..dfc1099a8e 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
@@ -38,6 +38,7 @@ public class GetFullQueryLogTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
index 40d7ffbcd1..d83c846840 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
@@ -62,6 +62,7 @@ public class InvalidateCredentialsCacheTest extends CQLTester
                 .newAuthenticator((EndPoint) null, null)
                 .initialResponse());
 
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
index f44a274f8f..54f2de756c 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
@@ -65,6 +65,7 @@ public class InvalidateJmxPermissionsCacheTest extends 
CQLTester
 
         AuthCacheService.initializeAndRegisterCaches();
 
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
index c54e526f55..4122066bca 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
@@ -47,6 +47,7 @@ public class InvalidateNetworkPermissionsCacheTest extends 
CQLTester
         roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, 
AuthTestUtils.getLoginRoleOptions());
         AuthCacheService.initializeAndRegisterCaches();
 
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
index c3a773f2a3..c8affb2eff 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
@@ -85,6 +85,7 @@ public class InvalidatePermissionsCacheTest extends CQLTester
             authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, 
resource, ROLE_B);
         }
 
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java
index bb8fb923f2..08ba676d3d 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java
@@ -47,6 +47,7 @@ public class InvalidateRolesCacheTest extends CQLTester
         roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, 
AuthTestUtils.getLoginRoleOptions());
         AuthCacheService.initializeAndRegisterCaches();
 
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java
index eee2c8ddbf..79329c66d0 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java
@@ -42,6 +42,7 @@ public class SetAuthCacheConfigTest extends CQLTester
     {
         CQLTester.setUpClass();
         CQLTester.requireAuthentication();
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java
index 40f82b0a33..1a19f09305 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java
@@ -36,6 +36,7 @@ public class SetGetColumnIndexSizeTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
index d15cc0c187..24ee9e5797 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
@@ -38,6 +38,7 @@ public class SetGetCompactionThroughputTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
index 4aea013c4f..d6d325367d 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
@@ -39,6 +39,7 @@ public class SetGetEntireSSTableInterDCStreamThroughputTest 
extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
index 028f32e41b..f250699a95 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
@@ -39,6 +39,7 @@ public class SetGetEntireSSTableStreamThroughputTest extends 
CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
index 0ef6b2c666..6cbb9480a9 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
@@ -46,6 +46,7 @@ public class SetGetInterDCStreamThroughputTest extends 
CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
index 911e0dc854..cf688d62d4 100644
--- 
a/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
+++ 
b/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
@@ -47,6 +47,7 @@ public class SetGetStreamThroughputTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
index 2fbaf954c9..9742972d15 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
@@ -36,6 +36,7 @@ public class SnapshotTest extends CQLTester
     @BeforeClass
     public static void setup() throws Exception
     {
+        requireNetwork();
         startJMXServer();
     }
 
diff --git 
a/test/unit/org/apache/cassandra/tools/nodetool/UninitializedServerTest.java 
b/test/unit/org/apache/cassandra/tools/nodetool/UninitializedServerTest.java
new file mode 100644
index 0000000000..2ddd27059c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/UninitializedServerTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class UninitializedServerTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void testUnintializedServer()
+    {
+        // CASSANDRA-11537
+        // fails, not finished initializing node because test never calls 
requireNetwork()
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("status");
+        assertThat(tool.getException() instanceof IllegalArgumentException);
+        assertThat(tool.getStderr().contains("Server is not initialized yet, 
cannot run nodetool."));
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to