You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2022/06/29 15:16:48 UTC

[cassandra] branch cassandra-4.1 updated: Add new compactionstats output behind --vtable

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

brandonwilliams pushed a commit to branch cassandra-4.1
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-4.1 by this push:
     new b75d56fd38 Add new compactionstats output behind --vtable
b75d56fd38 is described below

commit b75d56fd387a3af2706f75c0536cf112fdf6b788
Author: Brandon Williams <br...@apache.org>
AuthorDate: Thu Jun 23 13:18:33 2022 -0500

    Add new compactionstats output behind --vtable
    
    Patch by brandonwilliams; reviewed by edimitrov and dcapwell for
    CASSANDRA-17683
---
 CHANGES.txt                                        |   1 +
 NEWS.txt                                           |   1 +
 .../cassandra/tools/nodetool/CompactionStats.java  |  24 ++++-
 .../tools/nodetool/CompactionStatsTest.java        | 107 +++++++++++++++++++--
 4 files changed, 121 insertions(+), 12 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index a8def999c5..6ad96664b3 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.1-alpha2
+ * Add new vtable output option to compactionstats (CASSANDRA-17683)
  * Fix commitLogUpperBound initialization in AbstractMemtableWithCommitlog (CASSANDRA-17587)
  * Fix widening to long in getBatchSizeFailThreshold (CASSANDRA-17650)
  * Fix widening from mebibytes to bytes in IntMebibytesBound (CASSANDRA-17716)
diff --git a/NEWS.txt b/NEWS.txt
index 9f0332c9e1..75ea4986d5 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -95,6 +95,7 @@ New features
       native_transport_max_requests_per_second in cassandra.yaml.
     - Support for pre hashing passwords on CQL DCL commands
     - Expose all client options via system_views.clients and nodetool clientstats --client-options.
+    - Add new nodetool compactionstats --vtable option to match the sstable_tasks vtable.
     - Support for String concatenation has been added through the + operator.
     - New configuration max_hints_size_per_host to limit the size of local hints files per host in mebibytes. Setting to
       non-positive value disables the limit, which is the default behavior. Setting to a positive value to ensure
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
index 87262801c3..76bbbbf90b 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
@@ -44,6 +44,11 @@ public class CompactionStats extends NodeToolCmd
             description = "Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB")
     private boolean humanReadable = false;
 
+    @Option(title = "vtable_output",
+            name = {"-V", "--vtable"},
+            description = "Display fields matching vtable output")
+    private boolean vtableOutput = false;
+
     @Override
     public void execute(NodeProbe probe)
     {
@@ -70,17 +75,26 @@ public class CompactionStats extends NodeToolCmd
             }
         }
         out.println();
-        reportCompactionTable(cm.getCompactions(), probe.getCompactionThroughput(), humanReadable, out);
+        reportCompactionTable(cm.getCompactions(), probe.getCompactionThroughput(), humanReadable, vtableOutput, out);
     }
 
     public static void reportCompactionTable(List<Map<String,String>> compactions, int compactionThroughput, boolean humanReadable, PrintStream out)
+    {
+        reportCompactionTable(compactions, compactionThroughput, humanReadable, false, out);
+    }
+
+    public static void reportCompactionTable(List<Map<String,String>> compactions, int compactionThroughput, boolean humanReadable, boolean vtableOutput, PrintStream out)
     {
         if (!compactions.isEmpty())
         {
             long remainingBytes = 0;
             TableBuilder table = new TableBuilder();
 
-            table.add("keyspace", "table", "task id", "completion ratio", "kind", "progress", "sstables", "total", "unit");
+            if (vtableOutput)
+                table.add("keyspace", "table", "task id", "completion ratio", "kind", "progress", "sstables", "total", "unit");
+            else
+                table.add("id", "compaction type", "keyspace", "table", "completed", "total", "unit", "progress");
+
             for (Map<String, String> c : compactions)
             {
                 long total = Long.parseLong(c.get(CompactionInfo.TOTAL));
@@ -95,7 +109,11 @@ public class CompactionStats extends NodeToolCmd
                 String totalStr = toFileSize ? FileUtils.stringifyFileSize(total) : Long.toString(total);
                 String percentComplete = total == 0 ? "n/a" : new DecimalFormat("0.00").format((double) completed / total * 100) + "%";
                 String id = c.get(CompactionInfo.COMPACTION_ID);
-                table.add(keyspace, columnFamily, id, percentComplete, taskType, progressStr, String.valueOf(tables.length), totalStr, unit);
+                if (vtableOutput)
+                    table.add(keyspace, columnFamily, id, percentComplete, taskType, progressStr, String.valueOf(tables.length), totalStr, unit);
+                else
+                    table.add(id, taskType, keyspace, columnFamily, progressStr, totalStr, unit, percentComplete);
+
                 remainingBytes += total - completed;
             }
             table.printTo(out);
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
index 71b4c17260..4ed1e000c5 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
@@ -65,7 +65,7 @@ public class CompactionStatsTest extends CQLTester
                 "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
                 "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
                 "                [(-u <username> | --username <username>)] compactionstats\n" +
-                "                [(-H | --human-readable)]\n" +
+                "                [(-H | --human-readable)] [(-V | --vtable)]\n" +
                 "\n" +
                 "OPTIONS\n" +
                 "        -h <host>, --host <host>\n" +
@@ -89,6 +89,9 @@ public class CompactionStatsTest extends CQLTester
                 "        -u <username>, --username <username>\n" +
                 "            Remote jmx agent username\n" +
                 "\n" +
+                "        -V, --vtable\n" +
+                "            Display fields matching vtable output\n" +
+                "\n" +
                 "\n";
         assertThat(tool.getStdout()).isEqualTo(help);
     }
@@ -123,14 +126,57 @@ public class CompactionStatsTest extends CQLTester
         tool.assertOnCleanExit();
         String stdout = tool.getStdout();
         assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("id\\s+compaction type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%.2f%%",
+            compactionId, OperationType.COMPACTION, CQLTester.KEYSPACE, currentTable(), bytesCompacted, bytesTotal,
+            CompactionInfo.Unit.BYTES, (double) bytesCompacted / bytesTotal * 100);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+
+    @Test
+    public void testCompactionStatsVtable()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats", "-V");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
         Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task id\\s+completion ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit");
         String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s",
-                CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
-                OperationType.COMPACTION, bytesCompacted, sstables.size(), bytesTotal, CompactionInfo.Unit.BYTES);
+            CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
+            OperationType.COMPACTION, bytesCompacted, sstables.size(), bytesTotal, CompactionInfo.Unit.BYTES);
         Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
 
         CompactionManager.instance.active.finishCompaction(compactionHolder);
-        tool = ToolRunner.invokeNodetool("compactionstats");
+        tool = ToolRunner.invokeNodetool("compactionstats", "-V");
         tool.assertOnCleanExit();
         stdout = tool.getStdout();
         assertThat(stdout).contains("pending tasks: 0");
@@ -146,8 +192,8 @@ public class CompactionStatsTest extends CQLTester
         long bytesTotal = 123456;
         TimeUUID compactionId = nextTimeUUID();
         List<SSTableReader> sstables = IntStream.range(0, 10)
-                .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
-                .collect(Collectors.toList());
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
         CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
         {
             public CompactionInfo getCompactionInfo()
@@ -166,14 +212,57 @@ public class CompactionStatsTest extends CQLTester
         tool.assertOnCleanExit();
         String stdout = tool.getStdout();
         assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("id\\s+compaction type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%.2f%%",
+            compactionId, OperationType.COMPACTION, CQLTester.KEYSPACE, currentTable(), "123 bytes", "120.56 KiB",
+            CompactionInfo.Unit.BYTES, (double) bytesCompacted / bytesTotal * 100);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats", "--human-readable");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+
+    @Test
+    public void testCompactionStatsVtableHumanReadable()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats", "--vtable", "--human-readable");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
         Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task id\\s+completion ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit");
         String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s",
-                CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
-                OperationType.COMPACTION, "123 bytes", sstables.size(), "120.56 KiB", CompactionInfo.Unit.BYTES);
+            CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
+            OperationType.COMPACTION, "123 bytes", sstables.size(), "120.56 KiB", CompactionInfo.Unit.BYTES);
         Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
 
         CompactionManager.instance.active.finishCompaction(compactionHolder);
-        tool = ToolRunner.invokeNodetool("compactionstats", "--human-readable");
+        tool = ToolRunner.invokeNodetool("compactionstats", "--vtable", "--human-readable");
         tool.assertOnCleanExit();
         stdout = tool.getStdout();
         assertThat(stdout).contains("pending tasks: 0");


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