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