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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]