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

spricoder pushed a commit to branch feature/disk-metric
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 289b02cc0713eab21ae0ed2333c8438c2550a2a2
Author: spricoder <[email protected]>
AuthorDate: Thu Sep 21 13:30:23 2023 +0800

    add database and region tags into file metric
---
 .../iotdb/db/service/metrics/FileMetrics.java      | 162 +++++++++++++++------
 .../db/storageengine/dataregion/DataRegion.java    |  47 +++---
 .../execute/task/CrossSpaceCompactionTask.java     |   6 +-
 .../execute/task/InnerSpaceCompactionTask.java     |   2 +
 .../compaction/execute/utils/CompactionUtils.java  |  14 +-
 5 files changed, 151 insertions(+), 80 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
index c57a3a8526e..8b7d627ea37 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/FileMetrics.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.Abst
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.CompactionTaskSummary;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager;
+import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
 import org.apache.iotdb.db.storageengine.dataregion.wal.WALManager;
 import org.apache.iotdb.metrics.AbstractMetricService;
@@ -66,6 +67,10 @@ public class FileMetrics implements IMetricSet {
   private static final String SEQUENCE = "sequence";
   private static final String UNSEQUENCE = "unsequence";
   private static final String LEVEL = "level";
+  private final Map<String, Map<String, Long>> seqFileSizeGaugeMap = new 
ConcurrentHashMap<>();
+  private final Map<String, Map<String, Long>> unseqFileSizeGaugeMap = new 
ConcurrentHashMap<>();
+  private final Map<String, Map<String, Integer>> seqFileNumGaugeMap = new 
ConcurrentHashMap<>();
+  private final Map<String, Map<String, Integer>> unseqFileNumGaugeMap = new 
ConcurrentHashMap<>();
   private final AtomicLong seqFileSize = new AtomicLong(0);
   private final AtomicLong unseqFileSize = new AtomicLong(0);
   private final AtomicInteger seqFileNum = new AtomicInteger(0);
@@ -114,20 +119,6 @@ public class FileMetrics implements IMetricSet {
   }
 
   private void bindTsFileMetrics(AbstractMetricService metricService) {
-    metricService.createAutoGauge(
-        Metric.FILE_SIZE.toString(),
-        MetricLevel.CORE,
-        this,
-        o -> o.getFileSize(true),
-        Tag.NAME.toString(),
-        "seq");
-    metricService.createAutoGauge(
-        Metric.FILE_SIZE.toString(),
-        MetricLevel.CORE,
-        this,
-        o -> o.getFileSize(false),
-        Tag.NAME.toString(),
-        "unseq");
     metricService.createAutoGauge(
         Metric.FILE_SIZE.toString(),
         MetricLevel.CORE,
@@ -135,20 +126,6 @@ public class FileMetrics implements IMetricSet {
         FileMetrics::getModFileSize,
         Tag.NAME.toString(),
         "mods");
-    metricService.createAutoGauge(
-        Metric.FILE_COUNT.toString(),
-        MetricLevel.CORE,
-        this,
-        o -> o.getFileNum(true),
-        Tag.NAME.toString(),
-        "seq");
-    metricService.createAutoGauge(
-        Metric.FILE_COUNT.toString(),
-        MetricLevel.CORE,
-        this,
-        o -> o.getFileNum(false),
-        Tag.NAME.toString(),
-        "unseq");
     metricService.createAutoGauge(
         Metric.FILE_COUNT.toString(),
         MetricLevel.CORE,
@@ -333,8 +310,8 @@ public class FileMetrics implements IMetricSet {
   }
 
   // following are update functions for tsfile metrics
-  public void addFile(long size, boolean seq, String name) {
-    updateGlobalCountAndSize(size, 1, seq);
+  public void addFile(String database, String regionId, long size, boolean 
seq, String name) {
+    updateGlobalCountAndSize(database, regionId, size, 1, seq);
     try {
       TsFileNameGenerator.TsFileName tsFileName = 
TsFileNameGenerator.getTsFileName(name);
       int level = tsFileName.getInnerCompactionCnt();
@@ -344,13 +321,110 @@ public class FileMetrics implements IMetricSet {
     }
   }
 
-  private void updateGlobalCountAndSize(long sizeDelta, int countDelta, 
boolean seq) {
+  private void updateGlobalCountAndSize(
+      String database, String regionId, long sizeDelta, int countDelta, 
boolean seq) {
     if (seq) {
-      seqFileSize.getAndAdd(sizeDelta);
-      seqFileNum.getAndAdd(countDelta);
+      // update sequence file size
+      seqFileSizeGaugeMap.compute(
+          database,
+          (k, v) -> {
+            long size = 0;
+            if (v == null) {
+              v = new ConcurrentHashMap<>();
+            } else if (v.containsKey(regionId)) {
+              size = v.get(regionId);
+            }
+            v.put(regionId, size + sizeDelta);
+            return v;
+          });
+      // update sequence file number
+      seqFileNumGaugeMap.compute(
+          database,
+          (k, v) -> {
+            int count = 0;
+            if (v == null) {
+              v = new ConcurrentHashMap<>();
+            } else if (v.containsKey(regionId)) {
+              count += countDelta;
+            }
+            v.put(regionId, count);
+            return v;
+          });
+      // update sequence file size metric
+      metricService
+          .getOrCreateGauge(
+              Metric.FILE_SIZE.toString(),
+              MetricLevel.CORE,
+              Tag.NAME.toString(),
+              "seq",
+              Tag.DATABASE.toString(),
+              database,
+              Tag.REGION.toString(),
+              regionId)
+          .set(seqFileSizeGaugeMap.get(database).get(regionId));
+      // update sequence file number metric
+      metricService
+          .getOrCreateGauge(
+              Metric.FILE_COUNT.toString(),
+              MetricLevel.CORE,
+              Tag.NAME.toString(),
+              "seq",
+              Tag.DATABASE.toString(),
+              database,
+              Tag.REGION.toString(),
+              regionId)
+          .set(seqFileNumGaugeMap.get(database).get(regionId));
     } else {
-      unseqFileSize.getAndAdd(sizeDelta);
-      unseqFileNum.getAndAdd(countDelta);
+      // update unsequence file size
+      unseqFileSizeGaugeMap.compute(
+          database,
+          (k, v) -> {
+            long size = 0;
+            if (v == null) {
+              v = new ConcurrentHashMap<>();
+            } else if (v.containsKey(regionId)) {
+              size = v.get(regionId);
+            }
+            v.put(regionId, size + sizeDelta);
+            return v;
+          });
+      // update unsequence file number
+      unseqFileNumGaugeMap.compute(
+          database,
+          (k, v) -> {
+            int count = 0;
+            if (v == null) {
+              v = new ConcurrentHashMap<>();
+            } else if (v.containsKey(regionId)) {
+              count = v.get(regionId);
+            }
+            v.put(regionId, count + countDelta);
+            return v;
+          });
+      // update unsequence file size metric
+      metricService
+          .getOrCreateGauge(
+              Metric.FILE_SIZE.toString(),
+              MetricLevel.CORE,
+              Tag.NAME.toString(),
+              "unseq",
+              Tag.DATABASE.toString(),
+              database,
+              Tag.REGION.toString(),
+              regionId)
+          .set(unseqFileSizeGaugeMap.get(database).get(regionId));
+      // update unsequence file number metric
+      metricService
+          .getOrCreateGauge(
+              Metric.FILE_COUNT.toString(),
+              MetricLevel.CORE,
+              Tag.NAME.toString(),
+              "unseq",
+              Tag.DATABASE.toString(),
+              database,
+              Tag.REGION.toString(),
+              regionId)
+          .set(unseqFileNumGaugeMap.get(database).get(regionId));
     }
   }
 
@@ -435,19 +509,15 @@ public class FileMetrics implements IMetricSet {
         .set(size);
   }
 
-  public void deleteFile(long[] sizeList, boolean seq, List<String> names) {
-    long totalSize = 0;
-    for (long size : sizeList) {
-      totalSize += size;
-    }
-    updateGlobalCountAndSize(-totalSize, -sizeList.length, seq);
-    for (int i = 0, length = names.size(); i < length; ++i) {
-      int level = -1;
-      String name = names.get(i);
-      long size = sizeList[i];
+  public void deleteFile(boolean seq, List<TsFileResource> tsFileResourceList) 
{
+    for (TsFileResource tsFileResource : tsFileResourceList) {
+      String name = tsFileResource.getTsFile().getName();
+      long size = tsFileResource.getTsFileSize();
+      updateGlobalCountAndSize(
+          tsFileResource.getDatabaseName(), tsFileResource.getDataRegionId(), 
-size, -1, seq);
       try {
         TsFileNameGenerator.TsFileName tsFileName = 
TsFileNameGenerator.getTsFileName(name);
-        level = tsFileName.getInnerCompactionCnt();
+        int level = tsFileName.getInnerCompactionCnt();
         updateLevelCountAndSize(-size, -1, seq, level);
       } catch (IOException e) {
         log.warn("Unexpected error occurred when getting tsfile name", e);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 0794f469073..61f01a7c02a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -443,7 +443,12 @@ public class DataRegion implements IDataRegionForQuery {
         for (TsFileResource resource : value) {
           if (resource.resourceFileExists()) {
             FileMetrics.getInstance()
-                .addFile(resource.getTsFile().length(), true, 
resource.getTsFile().getName());
+                .addFile(
+                    resource.getDatabaseName(),
+                    resource.getDataRegionId(),
+                    resource.getTsFile().length(),
+                    true,
+                    resource.getTsFile().getName());
             if (resource.getModFile().exists()) {
               FileMetrics.getInstance().increaseModFileNum(1);
               
FileMetrics.getInstance().increaseModFileSize(resource.getModFile().getSize());
@@ -469,7 +474,12 @@ public class DataRegion implements IDataRegionForQuery {
         for (TsFileResource resource : value) {
           if (resource.resourceFileExists()) {
             FileMetrics.getInstance()
-                .addFile(resource.getTsFile().length(), false, 
resource.getTsFile().getName());
+                .addFile(
+                    resource.getDatabaseName(),
+                    resource.getDataRegionId(),
+                    resource.getTsFile().length(),
+                    false,
+                    resource.getTsFile().getName());
           }
           if (resource.getModFile().exists()) {
             FileMetrics.getInstance().increaseModFileNum(1);
@@ -703,6 +713,8 @@ public class DataRegion implements IDataRegionForQuery {
         tsFileResourceManager.registerSealedTsFileResource(tsFileResource);
         FileMetrics.getInstance()
             .addFile(
+                tsFileResource.getDatabaseName(),
+                tsFileResource.getDataRegionId(),
                 tsFileResource.getTsFile().length(),
                 recoverPerformer.isSequence(),
                 tsFileResource.getTsFile().getName());
@@ -1445,11 +1457,7 @@ public class DataRegion implements IDataRegionForQuery {
       tsFileResourceList.addAll(tsFileManager.getTsFileList(false));
       tsFileResourceList.forEach(
           x -> {
-            FileMetrics.getInstance()
-                .deleteFile(
-                    new long[] {x.getTsFileSize()},
-                    x.isSeq(),
-                    Collections.singletonList(x.getTsFile().getName()));
+            FileMetrics.getInstance().deleteFile(x.isSeq(), 
Collections.singletonList(x));
             if (x.getModFile().exists()) {
               FileMetrics.getInstance().decreaseModFileNum(1);
               
FileMetrics.getInstance().decreaseModFileSize(x.getModFile().getSize());
@@ -1524,11 +1532,7 @@ public class DataRegion implements IDataRegionForQuery {
     try {
       // try to delete physical data file
       resource.remove();
-      FileMetrics.getInstance()
-          .deleteFile(
-              new long[] {resource.getTsFileSize()},
-              isSeq,
-              Collections.singletonList(resource.getTsFile().getName()));
+      FileMetrics.getInstance().deleteFile(isSeq, 
Collections.singletonList(resource));
       logger.info(
           "Removed a file {} before {} by ttl ({} {})",
           resource.getTsFilePath(),
@@ -2074,11 +2078,14 @@ public class DataRegion implements IDataRegionForQuery {
     synchronized (closeStorageGroupCondition) {
       closeStorageGroupCondition.notifyAll();
     }
+    TsFileResource tsFileResource = tsFileProcessor.getTsFileResource();
     FileMetrics.getInstance()
         .addFile(
-            tsFileProcessor.getTsFileResource().getTsFileSize(),
+            tsFileResource.getDatabaseName(),
+            tsFileResource.getDataRegionId(),
+            tsFileResource.getTsFileSize(),
             tsFileProcessor.isSequence(),
-            tsFileProcessor.getTsFileResource().getTsFile().getName());
+            tsFileResource.getTsFile().getName());
     logger.info("signal closing database condition in {}", databaseName + "-" 
+ dataRegionId);
   }
 
@@ -2203,6 +2210,8 @@ public class DataRegion implements IDataRegionForQuery {
 
       FileMetrics.getInstance()
           .addFile(
+              newTsFileResource.getDatabaseName(),
+              newTsFileResource.getDataRegionId(),
               newTsFileResource.getTsFile().length(),
               false,
               newTsFileResource.getTsFile().getName());
@@ -2492,10 +2501,7 @@ public class DataRegion implements IDataRegionForQuery {
           tsFileResourceToBeMoved = sequenceResource;
           tsFileManager.remove(tsFileResourceToBeMoved, true);
           FileMetrics.getInstance()
-              .deleteFile(
-                  new long[] {tsFileResourceToBeMoved.getTsFileSize()},
-                  true,
-                  
Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName()));
+              .deleteFile(true, 
Collections.singletonList(tsFileResourceToBeMoved));
           break;
         }
       }
@@ -2507,10 +2513,7 @@ public class DataRegion implements IDataRegionForQuery {
             tsFileResourceToBeMoved = unsequenceResource;
             tsFileManager.remove(tsFileResourceToBeMoved, false);
             FileMetrics.getInstance()
-                .deleteFile(
-                    new long[] {tsFileResourceToBeMoved.getTsFileSize()},
-                    false,
-                    
Collections.singletonList(tsFileResourceToBeMoved.getTsFile().getName()));
+                .deleteFile(false, 
Collections.singletonList(tsFileResourceToBeMoved));
             break;
           }
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
index af9c49eb5b9..03ac69e3c0d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
@@ -220,7 +220,11 @@ public class CrossSpaceCompactionTask extends 
AbstractCompactionTask {
           if (!targetResource.isDeleted()) {
             FileMetrics.getInstance()
                 .addFile(
-                    targetResource.getTsFileSize(), true, 
targetResource.getTsFile().getName());
+                    targetResource.getDatabaseName(),
+                    targetResource.getDataRegionId(),
+                    targetResource.getTsFileSize(),
+                    true,
+                    targetResource.getTsFile().getName());
 
             // set target resources to CLOSED, so that they can be selected to 
compact
             targetResource.setStatus(TsFileResourceStatus.NORMAL);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
index 301f7b16634..8fa7481654e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
@@ -258,6 +258,8 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
         if (!targetTsFileResource.isDeleted()) {
           FileMetrics.getInstance()
               .addFile(
+                  targetTsFileResource.getDatabaseName(),
+                  targetTsFileResource.getDataRegionId(),
                   targetTsFileResource.getTsFile().length(),
                   sequence,
                   targetTsFileResource.getTsFile().getName());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
index ae76fc1a0cf..a44730501ad 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
@@ -54,7 +54,6 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -446,9 +445,7 @@ public class CompactionUtils {
 
   public static void deleteSourceTsFileAndUpdateFileMetrics(
       List<TsFileResource> resources, boolean seq) {
-    long[] fileSizes = new long[resources.size()];
-    List<String> fileNames = new ArrayList<>(resources.size());
-    int removeSuccessFileNum = 0;
+    List<TsFileResource> removeResources = new ArrayList<>();
     for (TsFileResource resource : resources) {
       if (!resource.remove()) {
         logger.warn(
@@ -456,14 +453,9 @@ public class CompactionUtils {
             resource.getTsFile().getAbsolutePath());
       } else {
         logger.info("[Compaction] delete file: {}", 
resource.getTsFile().getAbsolutePath());
-        fileSizes[removeSuccessFileNum] = resource.getTsFileSize();
-        fileNames.add(resource.getTsFile().getName());
-        removeSuccessFileNum++;
+        removeResources.add(resource);
       }
     }
-    if (removeSuccessFileNum != 0) {
-      fileSizes = Arrays.copyOfRange(fileSizes, 0, removeSuccessFileNum);
-      FileMetrics.getInstance().deleteFile(fileSizes, seq, fileNames);
-    }
+    FileMetrics.getInstance().deleteFile(seq, resources);
   }
 }

Reply via email to