From b7eb323c5a6ca3f2f9f8e32574ddd37d8b802957 Mon Sep 17 00:00:00 2001 From: Maxim Muzafarov Date: Wed, 18 Feb 2026 14:58:49 +0100 Subject: [PATCH] Fix nodetool sjk dropping all arguments after the first one Patch by Maxim Muzafarov; reviewed by Dmitry Konstantinov for CASSANDRA-21009 --- .../apache/cassandra/tools/nodetool/Sjk.java | 7 +++-- .../tools/nodetool/mock/SjkMockTest.java | 31 ++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/tools/nodetool/Sjk.java b/src/java/org/apache/cassandra/tools/nodetool/Sjk.java index 1f2d5db777..c117ed638b 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Sjk.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Sjk.java @@ -86,10 +86,11 @@ public class Sjk extends AbstractCommand { // Consume all arguments and pass them to SJK. assert commandSpec.userObject() instanceof Sjk; - if (args.isEmpty()) - return true; + Sjk sjk = (Sjk) commandSpec.userObject(); + + while (!args.isEmpty()) + sjk.args.add(args.pop()); - ((Sjk) commandSpec.userObject()).args.add(args.pop()); return true; } } diff --git a/test/unit/org/apache/cassandra/tools/nodetool/mock/SjkMockTest.java b/test/unit/org/apache/cassandra/tools/nodetool/mock/SjkMockTest.java index 836f85afb3..40cabcae77 100644 --- a/test/unit/org/apache/cassandra/tools/nodetool/mock/SjkMockTest.java +++ b/test/unit/org/apache/cassandra/tools/nodetool/mock/SjkMockTest.java @@ -48,9 +48,38 @@ public class SjkMockTest extends AbstractNodetoolMock @Test public void testSjkTtop() { - ToolRunner.ToolResult result = invokeNodetool("sjk", "hh", "--top-number", "10", "--live"); + ToolRunner.ToolResult result = invokeNodetool("sjk", "hh", "--top-number", "10000", "--live"); result.assertOnCleanExit(); assertThat(result.getStdout()).contains(" # Instances Bytes Type"); assertThat(result.getStdout()).containsPattern(" +\\d+ +\\d+ +org\\.apache\\.cassandra\\.config\\.DatabaseDescriptor\\$1"); } + + @Test + public void testSjkMxdumpQueryFiltersResults() + { + ToolRunner.ToolResult allBeans = invokeNodetool("sjk", "mxdump"); + allBeans.assertOnCleanExit(); + assertThat(allBeans.getStdout()).contains(STORAGE_SERVICE_MBEAN); + assertThat(allBeans.getStdout()).contains(FAILURE_DETECTOR_MBEAN); + + ToolRunner.ToolResult filtered = invokeNodetool("sjk", "mxdump", "-q", + STORAGE_SERVICE_MBEAN); + filtered.assertOnCleanExit(); + assertThat(filtered.getStdout()).contains(STORAGE_SERVICE_MBEAN); + assertThat(filtered.getStdout()).doesNotContain(FAILURE_DETECTOR_MBEAN); + assertThat(filtered.getStdout()).doesNotContain(GOSSIPER_MBEAN); + } + + @Test + public void testSjkMxdumpQueryWildcard() + { + ToolRunner.ToolResult filtered = invokeNodetool("sjk", "mxdump", "-q", + "org.apache.cassandra.net:*"); + filtered.assertOnCleanExit(); + assertThat(filtered.getStdout()).contains(FAILURE_DETECTOR_MBEAN); + assertThat(filtered.getStdout()).contains(GOSSIPER_MBEAN); + assertThat(filtered.getStdout()).contains(MESSAGING_SERVICE_MBEAN); + assertThat(filtered.getStdout()).doesNotContain(STORAGE_SERVICE_MBEAN); + assertThat(filtered.getStdout()).doesNotContain(CACHE_SERVICE_MBEAN); + } }