You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2018/06/05 14:23:59 UTC
cassandra git commit: Add a virtual table to expose all running
sstable tasks [Forced Update!]
Repository: cassandra
Updated Branches:
refs/heads/trunk 899f7c419 -> 2a2ee0063 (forced update)
Add a virtual table to expose all running sstable tasks
patch by Chris Lohfink; reviewed by Aleksey Yeschenko for
CASSANDRA-14457
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2a2ee006
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2a2ee006
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2a2ee006
Branch: refs/heads/trunk
Commit: 2a2ee006302a086ff054eac52161209a3118bb7c
Parents: 0f79427
Author: Chris Lohfink <cl...@apple.com>
Authored: Sat May 19 01:27:28 2018 -0500
Committer: Aleksey Yeshchenko <al...@apple.com>
Committed: Tue Jun 5 15:22:34 2018 +0100
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../cassandra/db/compaction/CompactionInfo.java | 51 +++++++++------
.../db/compaction/CompactionManager.java | 13 +++-
.../cassandra/db/virtual/SSTableTasksTable.java | 69 ++++++++++++++++++++
.../db/virtual/SystemViewsKeyspace.java | 2 +-
.../tools/nodetool/CompactionStats.java | 14 ++--
6 files changed, 121 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 86842d0..351ae37 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0
+ * Add a virtual table to expose all running sstable tasks (CASSANDRA-14457)
* Let nodetool import take a list of directories (CASSANDRA-14442)
* Avoid unneeded memory allocations / cpu for disabled log levels (CASSANDRA-14488)
* Implement virtual keyspace interface (CASSANDRA-7622)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
index ccdfeb4..99df259 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.db.compaction;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import java.util.UUID;
import org.apache.cassandra.schema.TableMetadata;
@@ -28,6 +29,16 @@ import org.apache.cassandra.schema.TableMetadata;
public final class CompactionInfo implements Serializable
{
private static final long serialVersionUID = 3695381572726744816L;
+
+ public static final String ID = "id";
+ public static final String KEYSPACE = "keyspace";
+ public static final String COLUMNFAMILY = "columnfamily";
+ public static final String COMPLETED = "completed";
+ public static final String TOTAL = "total";
+ public static final String TASK_TYPE = "taskType";
+ public static final String UNIT = "unit";
+ public static final String COMPACTION_ID = "compactionId";
+
private final TableMetadata metadata;
private final OperationType tasktype;
private final long completed;
@@ -84,19 +95,14 @@ public final class CompactionInfo implements Serializable
return new CompactionInfo(metadata, tasktype, complete, total, unit, compactionId);
}
- public UUID getId()
- {
- return metadata != null ? metadata.id.asUUID() : null;
- }
-
- public String getKeyspace()
+ public Optional<String> getKeyspace()
{
- return metadata != null ? metadata.keyspace : null;
+ return Optional.ofNullable(metadata != null ? metadata.keyspace : null);
}
- public String getColumnFamily()
+ public Optional<String> getTable()
{
- return metadata != null ? metadata.name : null;
+ return Optional.ofNullable(metadata != null ? metadata.name : null);
}
public TableMetadata getTableMetadata()
@@ -119,19 +125,24 @@ public final class CompactionInfo implements Serializable
return tasktype;
}
- public UUID compactionId()
+ public UUID getTaskId()
{
return compactionId;
}
+ public Unit getUnit()
+ {
+ return unit;
+ }
+
public String toString()
{
StringBuilder buff = new StringBuilder();
buff.append(getTaskType());
if (metadata != null)
{
- buff.append('@').append(getId()).append('(');
- buff.append(getKeyspace()).append(", ").append(getColumnFamily()).append(", ");
+ buff.append('@').append(metadata.id).append('(');
+ buff.append(metadata.keyspace).append(", ").append(metadata.name).append(", ");
}
else
{
@@ -144,14 +155,14 @@ public final class CompactionInfo implements Serializable
public Map<String, String> asMap()
{
Map<String, String> ret = new HashMap<String, String>();
- ret.put("id", getId() == null ? "" : getId().toString());
- ret.put("keyspace", getKeyspace());
- ret.put("columnfamily", getColumnFamily());
- ret.put("completed", Long.toString(completed));
- ret.put("total", Long.toString(total));
- ret.put("taskType", tasktype.toString());
- ret.put("unit", unit.toString());
- ret.put("compactionId", compactionId == null ? "" : compactionId.toString());
+ ret.put(ID, metadata != null ? metadata.id.toString() : "");
+ ret.put(KEYSPACE, getKeyspace().orElse(null));
+ ret.put(COLUMNFAMILY, getTable().orElse(null));
+ ret.put(COMPLETED, Long.toString(completed));
+ ret.put(TOTAL, Long.toString(total));
+ ret.put(TASK_TYPE, tasktype.toString());
+ ret.put(UNIT, unit.toString());
+ ret.put(COMPACTION_ID, compactionId == null ? "" : compactionId.toString());
return ret;
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 05891d2..8a8aaec 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -1773,7 +1773,7 @@ public class CompactionManager implements CompactionManagerMBean
{
for (Holder holder : CompactionMetrics.getCompactions())
{
- UUID holderId = holder.getCompactionInfo().compactionId();
+ UUID holderId = holder.getCompactionInfo().getTaskId();
if (holderId != null && holderId.equals(UUID.fromString(compactionId)))
holder.stop();
}
@@ -1951,4 +1951,15 @@ public class CompactionManager implements CompactionManagerMBean
break;
}
}
+
+ public List<CompactionInfo> getSStableTasks()
+ {
+ return CompactionMetrics.getCompactions()
+ .stream()
+ .map(CompactionInfo.Holder::getCompactionInfo)
+ .filter(task -> task.getTaskType() != OperationType.COUNTER_CACHE_SAVE
+ && task.getTaskType() != OperationType.KEY_CACHE_SAVE
+ && task.getTaskType() != OperationType.ROW_CACHE_SAVE)
+ .collect(Collectors.toList());
+ }
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java b/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
new file mode 100644
index 0000000..e98e3a6
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
@@ -0,0 +1,69 @@
+/*
+ * 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.db.virtual;
+
+import org.apache.cassandra.db.compaction.CompactionInfo;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.marshal.LongType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class SSTableTasksTable extends AbstractVirtualTable
+{
+ private final static String KEYSPACE_NAME = "keyspace_name";
+ private final static String TABLE_NAME = "table_name";
+ private final static String TASK_ID = "task_id";
+ private final static String KIND = "kind";
+ private final static String PROGRESS = "progress";
+ private final static String TOTAL = "total";
+ private final static String UNIT = "unit";
+
+ SSTableTasksTable(String keyspace)
+ {
+ super(TableMetadata.builder(keyspace, "sstable_tasks")
+ .comment("current sstable tasks")
+ .kind(TableMetadata.Kind.VIRTUAL)
+ .addPartitionKeyColumn(KEYSPACE_NAME, UTF8Type.instance)
+ .addClusteringColumn(TABLE_NAME, UTF8Type.instance)
+ .addClusteringColumn(TASK_ID, UUIDType.instance)
+ .addRegularColumn(KIND, UTF8Type.instance)
+ .addRegularColumn(PROGRESS, LongType.instance)
+ .addRegularColumn(TOTAL, LongType.instance)
+ .addRegularColumn(UNIT, UTF8Type.instance)
+ .build());
+ }
+
+ public DataSet data()
+ {
+ SimpleDataSet result = new SimpleDataSet(metadata());
+
+ for (CompactionInfo task : CompactionManager.instance.getSStableTasks())
+ {
+ result.row(task.getKeyspace().orElse("*"),
+ task.getTable().orElse("*"),
+ task.getTaskId())
+ .column(KIND, task.getTaskType().toString().toLowerCase())
+ .column(PROGRESS, task.getCompleted())
+ .column(TOTAL, task.getTotal())
+ .column(UNIT, task.getUnit().toString().toLowerCase());
+ }
+
+ return result;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
index 8d6f59b..5d33a63 100644
--- a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
+++ b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
@@ -27,6 +27,6 @@ public final class SystemViewsKeyspace extends VirtualKeyspace
private SystemViewsKeyspace()
{
- super(NAME, ImmutableList.of());
+ super(NAME, ImmutableList.of(new SSTableTasksTable(NAME)));
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/2a2ee006/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
index 574220e..497fe24 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
@@ -82,17 +82,17 @@ public class CompactionStats extends NodeToolCmd
table.add("id", "compaction type", "keyspace", "table", "completed", "total", "unit", "progress");
for (Map<String, String> c : compactions)
{
- long total = Long.parseLong(c.get("total"));
- long completed = Long.parseLong(c.get("completed"));
- String taskType = c.get("taskType");
- String keyspace = c.get("keyspace");
- String columnFamily = c.get("columnfamily");
- String unit = c.get("unit");
+ 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 completedStr = 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("compactionId");
+ String id = c.get(CompactionInfo.COMPACTION_ID);
table.add(id, taskType, keyspace, columnFamily, completedStr, totalStr, unit, percentComplete);
if (taskType.equals(OperationType.COMPACTION.toString()))
remainingBytes += total - completed;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org