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