This is an automated email from the ASF dual-hosted git repository.
smiklosovic 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 7998e22127 Enhance nodetool compactionstats with additional metrics
7998e22127 is described below
commit 7998e22127b7c612e26f56b5712639473d91576f
Author: mghildiy <[email protected]>
AuthorDate: Sat Jun 17 19:15:26 2023 +0530
Enhance nodetool compactionstats with additional metrics
patch by Manish Ghildiyal; reviewed by Stefan Miklosovic, Brandon Williams
for CASSANDRA-18305
Co-authored-by: Stefan Miklosovic <[email protected]>
---
CHANGES.txt | 1 +
.../db/compaction/CompactionIterator.java | 2 +-
src/java/org/apache/cassandra/tools/NodeProbe.java | 9 +-
.../cassandra/tools/nodetool/CompactionStats.java | 154 +++++++++++++--------
.../tools/nodetool/CompactionStatsTest.java | 120 +++++++++-------
.../apache/cassandra/stress/CompactionStress.java | 3 +-
6 files changed, 177 insertions(+), 112 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index b562e0dc6e..2e8dfb9a4c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
5.0
+ * Enhance nodetool compactionstats with additional metrics (CASSANDRA-18305)
* Added support for type VECTOR<type, dimension> (CASSANDRA-18504)
* Expose bootstrap and decommission state to nodetool info (CASSANDRA-18555)
* Fix SSTabledump errors when dumping data from index (CASSANDRA-17698)
diff --git
a/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
b/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
index c46fd83a94..e3fedfeb98 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
@@ -101,7 +101,7 @@ public class CompactionIterator extends
CompactionInfo.Holder implements Unfilte
private long totalSourceCQLRows;
// Keep targetDirectory for compactions, needed for `nodetool
compactionstats`
- private String targetDirectory;
+ private volatile String targetDirectory;
/*
* counters for merged rows.
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java
b/src/java/org/apache/cassandra/tools/NodeProbe.java
index e30ebd5136..63a383dafa 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -1918,7 +1918,9 @@ public class NodeProbe implements AutoCloseable
/**
* Retrieve Proxy metrics
- * @param metricName CompletedTasks, PendingTasks, BytesCompacted or
TotalCompactionsCompleted.
+ * @param metricName BytesCompacted, CompactionsAborted,
CompactionsReduced,
+ * SSTablesDroppedFromCompaction, CompletedTasks,
PendingTasks, PendingTasksByTableName
+ * or TotalCompactionsCompleted.
*/
public Object getCompactionMetric(String metricName)
{
@@ -1927,6 +1929,9 @@ public class NodeProbe implements AutoCloseable
switch(metricName)
{
case "BytesCompacted":
+ case "CompactionsAborted":
+ case "CompactionsReduced":
+ case "SSTablesDroppedFromCompaction":
return JMX.newMBeanProxy(mbeanServerConn,
new
ObjectName("org.apache.cassandra.metrics:type=Compaction,name=" + metricName),
CassandraMetricsRegistry.JmxCounterMBean.class);
@@ -1941,7 +1946,7 @@ public class NodeProbe implements AutoCloseable
new
ObjectName("org.apache.cassandra.metrics:type=Compaction,name=" + metricName),
CassandraMetricsRegistry.JmxMeterMBean.class);
default:
- throw new RuntimeException("Unknown compaction metric.");
+ throw new RuntimeException("Unknown compaction metric " +
metricName);
}
}
catch (MalformedObjectNameException e)
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
index aedc8f225f..c80de91d97 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
@@ -19,6 +19,7 @@ package org.apache.cassandra.tools.nodetool;
import java.io.PrintStream;
import java.text.DecimalFormat;
+import java.text.NumberFormat;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -28,8 +29,8 @@ import io.airlift.airline.Option;
import org.apache.cassandra.db.compaction.CompactionInfo;
import org.apache.cassandra.db.compaction.CompactionInfo.Unit;
-import org.apache.cassandra.db.compaction.CompactionManagerMBean;
import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.metrics.CassandraMetricsRegistry;
import org.apache.cassandra.tools.NodeProbe;
import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
@@ -53,82 +54,119 @@ public class CompactionStats extends NodeToolCmd
public void execute(NodeProbe probe)
{
PrintStream out = probe.output().out;
- CompactionManagerMBean cm = probe.getCompactionManagerProxy();
+ TableBuilder tableBuilder = new TableBuilder();
+ pendingTasksAndConcurrentCompactorsStats(probe, tableBuilder);
+ compactionsStats(probe, tableBuilder);
+
reportCompactionTable(probe.getCompactionManagerProxy().getCompactions(),
probe.getCompactionThroughputBytes(), humanReadable, vtableOutput, out,
tableBuilder);
+ }
+
+ private void pendingTasksAndConcurrentCompactorsStats(NodeProbe probe,
TableBuilder tableBuilder)
+ {
Map<String, Map<String, Integer>> pendingTaskNumberByTable =
- (Map<String, Map<String, Integer>>)
probe.getCompactionMetric("PendingTasksByTableName");
- int numTotalPendingTask = 0;
+ (Map<String, Map<String, Integer>>)
probe.getCompactionMetric("PendingTasksByTableName");
+
+ tableBuilder.add("concurrent compactors",
Integer.toString(probe.getConcurrentCompactors()));
+ tableBuilder.add("pending tasks",
Integer.toString(numPendingTasks(pendingTaskNumberByTable)));
+
for (Entry<String, Map<String, Integer>> ksEntry :
pendingTaskNumberByTable.entrySet())
- {
for (Entry<String, Integer> tableEntry :
ksEntry.getValue().entrySet())
- numTotalPendingTask += tableEntry.getValue();
- }
- out.println("pending tasks: " + numTotalPendingTask);
+ tableBuilder.add(ksEntry.getKey(), tableEntry.getKey(),
tableEntry.getValue().toString());
+ }
+
+ private int numPendingTasks(Map<String, Map<String, Integer>>
pendingTaskNumberByTable)
+ {
+ int numTotalPendingTasks = 0;
for (Entry<String, Map<String, Integer>> ksEntry :
pendingTaskNumberByTable.entrySet())
- {
- String ksName = ksEntry.getKey();
for (Entry<String, Integer> tableEntry :
ksEntry.getValue().entrySet())
- {
- String tableName = tableEntry.getKey();
- int pendingTaskCount = tableEntry.getValue();
+ numTotalPendingTasks += tableEntry.getValue();
- out.println("- " + ksName + '.' + tableName + ": " +
pendingTaskCount);
- }
- }
- out.println();
- reportCompactionTable(cm.getCompactions(),
probe.getCompactionThroughputBytes(), humanReadable, vtableOutput, out);
+ return numTotalPendingTasks;
}
- public static void reportCompactionTable(List<Map<String,String>>
compactions, long compactionThroughputInBytes, boolean humanReadable,
PrintStream out)
+ private void compactionsStats(NodeProbe probe, TableBuilder tableBuilder)
{
- reportCompactionTable(compactions, compactionThroughputInBytes,
humanReadable, false, out);
+ CassandraMetricsRegistry.JmxMeterMBean
totalCompactionsCompletedMetrics =
+ (CassandraMetricsRegistry.JmxMeterMBean)
probe.getCompactionMetric("TotalCompactionsCompleted");
+ tableBuilder.add("compactions completed",
String.valueOf(totalCompactionsCompletedMetrics.getCount()));
+
+ CassandraMetricsRegistry.JmxCounterMBean bytesCompacted =
(CassandraMetricsRegistry.JmxCounterMBean)
probe.getCompactionMetric("BytesCompacted");
+ if (humanReadable)
+ tableBuilder.add("data compacted",
FileUtils.stringifyFileSize(Double.parseDouble(Long.toString(bytesCompacted.getCount()))));
+ else
+ tableBuilder.add("data compacted",
Long.toString(bytesCompacted.getCount()));
+
+ CassandraMetricsRegistry.JmxCounterMBean compactionsAborted =
(CassandraMetricsRegistry.JmxCounterMBean)
probe.getCompactionMetric("CompactionsAborted");
+ tableBuilder.add("compactions aborted",
Long.toString(compactionsAborted.getCount()));
+
+ CassandraMetricsRegistry.JmxCounterMBean compactionsReduced =
(CassandraMetricsRegistry.JmxCounterMBean)
probe.getCompactionMetric("CompactionsReduced");
+ tableBuilder.add("compactions reduced",
Long.toString(compactionsReduced.getCount()));
+
+ CassandraMetricsRegistry.JmxCounterMBean sstablesDroppedFromCompaction
= (CassandraMetricsRegistry.JmxCounterMBean)
probe.getCompactionMetric("SSTablesDroppedFromCompaction");
+ tableBuilder.add("sstables dropped from compaction",
Long.toString(sstablesDroppedFromCompaction.getCount()));
+
+ NumberFormat formatter = new DecimalFormat("0.00");
+
+ tableBuilder.add("15 minute rate", String.format("%s/minute",
formatter.format(totalCompactionsCompletedMetrics.getFifteenMinuteRate() *
60)));
+ tableBuilder.add("mean rate", String.format("%s/hour",
formatter.format(totalCompactionsCompletedMetrics.getMeanRate() * 60 * 60)));
+
+ double configured =
probe.getStorageService().getCompactionThroughtputMibPerSecAsDouble();
+ tableBuilder.add("compaction throughput (MiB/s)", configured == 0 ?
"throttling disabled (0)" : Double.toString(configured));
}
- public static void reportCompactionTable(List<Map<String,String>>
compactions, long compactionThroughputInBytes, boolean humanReadable, boolean
vtableOutput, PrintStream out)
+ public static void reportCompactionTable(List<Map<String,String>>
compactions, long compactionThroughputInBytes, boolean humanReadable,
PrintStream out, TableBuilder table)
{
- if (!compactions.isEmpty())
+ reportCompactionTable(compactions, compactionThroughputInBytes,
humanReadable, false, out, table);
+ }
+
+ public static void reportCompactionTable(List<Map<String,String>>
compactions, long compactionThroughputInBytes, boolean humanReadable, boolean
vtableOutput, PrintStream out, TableBuilder table)
+ {
+ if (compactions.isEmpty())
{
- long remainingBytes = 0;
- TableBuilder table = new TableBuilder();
+ table.printTo(out);
+ return;
+ }
- if (vtableOutput)
- table.add("keyspace", "table", "task id", "completion ratio",
"kind", "progress", "sstables", "total", "unit", "target directory");
- else
- table.add("id", "compaction type", "keyspace", "table",
"completed", "total", "unit", "progress");
+ long remainingBytes = 0;
- for (Map<String, String> c : compactions)
- {
- long total = Long.parseLong(c.get(CompactionInfo.TOTAL));
- long completed =
Long.parseLong(c.get(CompactionInfo.COMPLETED));
- String taskType = c.get(CompactionInfo.TASK_TYPE);
- String keyspace = c.get(CompactionInfo.KEYSPACE);
- String columnFamily = c.get(CompactionInfo.COLUMNFAMILY);
- String unit = c.get(CompactionInfo.UNIT);
- boolean toFileSize = humanReadable && Unit.isFileSize(unit);
- String[] tables = c.get(CompactionInfo.SSTABLES).split(",");
- String progressStr = toFileSize ?
FileUtils.stringifyFileSize(completed) : Long.toString(completed);
- 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);
- if (vtableOutput)
- {
- String targetDirectory =
c.get(CompactionInfo.TARGET_DIRECTORY);
- table.add(keyspace, columnFamily, id, percentComplete,
taskType, progressStr, String.valueOf(tables.length), totalStr, unit,
targetDirectory);
- }
- else
- table.add(id, taskType, keyspace, columnFamily,
progressStr, totalStr, unit, percentComplete);
-
- remainingBytes += total - completed;
- }
- table.printTo(out);
+ if (vtableOutput)
+ table.add("keyspace", "table", "task id", "completion ratio",
"kind", "progress", "sstables", "total", "unit", "target directory");
+ else
+ table.add("id", "compaction type", "keyspace", "table",
"completed", "total", "unit", "progress");
- String remainingTime = "n/a";
- if (compactionThroughputInBytes != 0)
+ for (Map<String, String> c : compactions)
+ {
+ long total = Long.parseLong(c.get(CompactionInfo.TOTAL));
+ long completed = Long.parseLong(c.get(CompactionInfo.COMPLETED));
+ String taskType = c.get(CompactionInfo.TASK_TYPE);
+ String keyspace = c.get(CompactionInfo.KEYSPACE);
+ String columnFamily = c.get(CompactionInfo.COLUMNFAMILY);
+ String unit = c.get(CompactionInfo.UNIT);
+ boolean toFileSize = humanReadable && Unit.isFileSize(unit);
+ String[] tables = c.get(CompactionInfo.SSTABLES).split(",");
+ String progressStr = toFileSize ?
FileUtils.stringifyFileSize(completed) : Long.toString(completed);
+ 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);
+ if (vtableOutput)
{
- long remainingTimeInSecs = remainingBytes /
compactionThroughputInBytes;
- remainingTime = format("%dh%02dm%02ds", remainingTimeInSecs /
3600, (remainingTimeInSecs % 3600) / 60, (remainingTimeInSecs % 60));
+ String targetDirectory =
c.get(CompactionInfo.TARGET_DIRECTORY);
+ table.add(keyspace, columnFamily, id, percentComplete,
taskType, progressStr, String.valueOf(tables.length), totalStr, unit,
targetDirectory);
}
- out.printf("%25s%10s%n", "Active compaction remaining time : ",
remainingTime);
+ else
+ table.add(id, taskType, keyspace, columnFamily, progressStr,
totalStr, unit, percentComplete);
+
+ remainingBytes += total - completed;
}
+
+ String remainingTime = "n/a";
+ if (compactionThroughputInBytes != 0)
+ {
+ long remainingTimeInSecs = remainingBytes /
compactionThroughputInBytes;
+ remainingTime = format("%dh%02dm%02ds", remainingTimeInSecs /
3600, (remainingTimeInSecs % 3600) / 60, (remainingTimeInSecs % 60));
+ }
+
+ table.add("active compaction remaining time", remainingTime);
+ table.printTo(out);
}
}
\ No newline at end of file
diff --git
a/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
index a626daeae8..8758c3f8fd 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
@@ -35,11 +35,10 @@ import org.apache.cassandra.io.sstable.format.SSTableReader;
import org.apache.cassandra.schema.MockSchema;
import org.apache.cassandra.tools.ToolRunner;
import org.apache.cassandra.utils.TimeUUID;
-import org.assertj.core.api.Assertions;
-import org.awaitility.Awaitility;
import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
public class CompactionStatsTest extends CQLTester
{
@@ -58,42 +57,42 @@ public class CompactionStatsTest extends CQLTester
ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help",
"compactionstats");
tool.assertOnCleanExit();
- String help = "NAME\n" +
- " nodetool compactionstats - Print statistics on
compactions\n" +
- "\n" +
- "SYNOPSIS\n" +
- " nodetool [(-h <host> | --host <host>)] [(-p <port> |
--port <port>)]\n" +
- " [(-pp | --print-port)] [(-pw <password> |
--password <password>)]\n" +
- " [(-pwf <passwordFilePath> | --password-file
<passwordFilePath>)]\n" +
- " [(-u <username> | --username <username>)]
compactionstats\n" +
- " [(-H | --human-readable)] [(-V |
--vtable)]\n" +
- "\n" +
- "OPTIONS\n" +
- " -h <host>, --host <host>\n" +
- " Node hostname or ip address\n" +
- "\n" +
- " -H, --human-readable\n" +
- " Display bytes in human readable form, i.e. KiB,
MiB, GiB, TiB\n" +
- "\n" +
- " -p <port>, --port <port>\n" +
- " Remote jmx agent port number\n" +
- "\n" +
- " -pp, --print-port\n" +
- " Operate in 4.0 mode with hosts disambiguated by
port number\n" +
- "\n" +
- " -pw <password>, --password <password>\n" +
- " Remote jmx agent password\n" +
- "\n" +
- " -pwf <passwordFilePath>, --password-file
<passwordFilePath>\n" +
- " Path to the JMX password file\n" +
- "\n" +
- " -u <username>, --username <username>\n" +
- " Remote jmx agent username\n" +
- "\n" +
- " -V, --vtable\n" +
- " Display fields matching vtable output\n" +
- "\n" +
- "\n";
+ String help = "NAME\n" +
+ " nodetool compactionstats - Print statistics on
compactions\n" +
+ "\n" +
+ "SYNOPSIS\n" +
+ " nodetool [(-h <host> | --host <host>)] [(-p
<port> | --port <port>)]\n" +
+ " [(-pp | --print-port)] [(-pw <password>
| --password <password>)]\n" +
+ " [(-pwf <passwordFilePath> |
--password-file <passwordFilePath>)]\n" +
+ " [(-u <username> | --username
<username>)] compactionstats\n" +
+ " [(-H | --human-readable)] [(-V |
--vtable)]\n" +
+ "\n" +
+ "OPTIONS\n" +
+ " -h <host>, --host <host>\n" +
+ " Node hostname or ip address\n" +
+ "\n" +
+ " -H, --human-readable\n" +
+ " Display bytes in human readable form, i.e.
KiB, MiB, GiB, TiB\n" +
+ "\n" +
+ " -p <port>, --port <port>\n" +
+ " Remote jmx agent port number\n" +
+ "\n" +
+ " -pp, --print-port\n" +
+ " Operate in 4.0 mode with hosts
disambiguated by port number\n" +
+ "\n" +
+ " -pw <password>, --password <password>\n" +
+ " Remote jmx agent password\n" +
+ "\n" +
+ " -pwf <passwordFilePath>, --password-file
<passwordFilePath>\n" +
+ " Path to the JMX password file\n" +
+ "\n" +
+ " -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);
}
@@ -124,11 +123,23 @@ public class CompactionStatsTest extends CQLTester
CompactionManager.instance.active.beginCompaction(compactionHolder);
String stdout = waitForNumberOfPendingTasks(1, "compactionstats");
- Assertions.assertThat(stdout).containsPattern("id\\s+compaction
type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+ 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);
+ assertThat(stdout).containsPattern(expectedStatsPattern);
+
+ assertThat(stdout).containsPattern(expectedStatsPattern);
+ assertThat(stdout).containsPattern("concurrent compactors\\s+[0-9]*");
+ assertThat(stdout).containsPattern("pending tasks\\s+[0-9]*");
+ assertThat(stdout).containsPattern("compactions completed\\s+[0-9]*");
+ assertThat(stdout).containsPattern("data compacted\\s+[0-9]*");
+ assertThat(stdout).containsPattern("compactions aborted\\s+[0-9]*");
+ assertThat(stdout).containsPattern("compactions reduced\\s+[0-9]*");
+ assertThat(stdout).containsPattern("sstables dropped from
compaction\\s+[0-9]*");
+ assertThat(stdout).containsPattern("15 minute
rate\\s+[0-9]*.[0-9]*[0-9]*/minute");
+ assertThat(stdout).containsPattern("mean
rate\\s+[0-9]*.[0-9]*[0-9]*/hour");
+ assertThat(stdout).containsPattern("compaction throughput
\\(MiB/s\\)\\s+throttling disabled \\(0\\)");
CompactionManager.instance.active.finishCompaction(compactionHolder);
waitForNumberOfPendingTasks(0, "compactionstats");
@@ -176,17 +187,17 @@ public class CompactionStatsTest extends CQLTester
CompactionManager.instance.active.beginCompaction(compactionHolder);
CompactionManager.instance.active.beginCompaction(nonCompactionHolder);
String stdout = waitForNumberOfPendingTasks(2, "compactionstats",
"-V");
-
Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task
id\\s+completion
ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit\\s+target directory");
+ assertThat(stdout).containsPattern("keyspace\\s+table\\s+task
id\\s+completion
ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit\\s+target directory");
String expectedStatsPattern =
String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\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,
targetDirectory);
- Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+ assertThat(stdout).containsPattern(expectedStatsPattern);
String expectedStatsPatternForNonCompaction =
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);
-
Assertions.assertThat(stdout).containsPattern(expectedStatsPatternForNonCompaction);
+
assertThat(stdout).containsPattern(expectedStatsPatternForNonCompaction);
CompactionManager.instance.active.finishCompaction(compactionHolder);
CompactionManager.instance.active.finishCompaction(nonCompactionHolder);
@@ -220,11 +231,11 @@ public class CompactionStatsTest extends CQLTester
CompactionManager.instance.active.beginCompaction(compactionHolder);
String stdout = waitForNumberOfPendingTasks(1, "compactionstats",
"--human-readable");
- Assertions.assertThat(stdout).containsPattern("id\\s+compaction
type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+ 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);
+ assertThat(stdout).containsPattern(expectedStatsPattern);
CompactionManager.instance.active.finishCompaction(compactionHolder);
waitForNumberOfPendingTasks(0, "compactionstats", "--human-readable");
@@ -272,16 +283,16 @@ public class CompactionStatsTest extends CQLTester
CompactionManager.instance.active.beginCompaction(compactionHolder);
CompactionManager.instance.active.beginCompaction(nonCompactionHolder);
String stdout = waitForNumberOfPendingTasks(2, "compactionstats",
"--vtable", "--human-readable");
-
Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task
id\\s+completion
ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit\\s+target directory");
+ assertThat(stdout).containsPattern("keyspace\\s+table\\s+task
id\\s+completion
ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit\\s+target directory");
String expectedStatsPattern =
String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\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,
targetDirectory);
- Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+ assertThat(stdout).containsPattern(expectedStatsPattern);
String expectedStatsPatternForNonCompaction =
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.CLEANUP, "123 bytes", sstables.size(), "120.56 KiB",
CompactionInfo.Unit.BYTES);
-
Assertions.assertThat(stdout).containsPattern(expectedStatsPatternForNonCompaction);
+
assertThat(stdout).containsPattern(expectedStatsPatternForNonCompaction);
CompactionManager.instance.active.finishCompaction(compactionHolder);
CompactionManager.instance.active.finishCompaction(nonCompactionHolder);
@@ -291,12 +302,21 @@ public class CompactionStatsTest extends CQLTester
private String waitForNumberOfPendingTasks(int pendingTasksToWaitFor,
String... args)
{
AtomicReference<String> stdout = new AtomicReference<>();
- Awaitility.await().until(() -> {
+ await().until(() -> {
ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
tool.assertOnCleanExit();
String output = tool.getStdout();
stdout.set(output);
- return output.contains("pending tasks: " + pendingTasksToWaitFor);
+
+ try
+ {
+ assertThat(output).containsPattern("pending tasks\\s+" +
pendingTasksToWaitFor);
+ return true;
+ }
+ catch (AssertionError e)
+ {
+ return false;
+ }
});
return stdout.get();
diff --git a/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
b/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
index 9829d56021..d284a1b6d6 100644
--- a/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
+++ b/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
@@ -64,6 +64,7 @@ import org.apache.cassandra.stress.generate.SeedManager;
import org.apache.cassandra.stress.operations.userdefined.SchemaInsert;
import org.apache.cassandra.stress.settings.StressSettings;
import org.apache.cassandra.tools.nodetool.CompactionStats;
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.JVMStabilityInspector;
import org.apache.cassandra.utils.concurrent.Future;
@@ -274,7 +275,7 @@ public abstract class CompactionStress implements Runnable
{
System.out.println("========");
System.out.println(String.format("Pending compactions: %d\n",
CompactionManager.instance.getPendingTasks()));
-
CompactionStats.reportCompactionTable(CompactionManager.instance.getCompactions(),
0, true, System.out);
+
CompactionStats.reportCompactionTable(CompactionManager.instance.getCompactions(),
0, true, System.out, new TableBuilder());
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]