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

jt2594838 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new ce9838da272 Fix duplicate TsFile metric updates (#18219)
ce9838da272 is described below

commit ce9838da272869f6514aad3b4896a0d0ed54114e
Author: Jiang Tian <[email protected]>
AuthorDate: Thu Jul 16 09:28:56 2026 +0800

    Fix duplicate TsFile metric updates (#18219)
    
    * refactor addFile
    
    * record whether a file is recorded by metric
    
    * remove redundant arg
---
 .../iotdb/db/service/metrics/FileMetrics.java      |  8 +--
 .../db/service/metrics/file/TsFileMetrics.java     | 19 +++++--
 .../db/storageengine/dataregion/DataRegion.java    | 61 ++++----------------
 .../execute/task/CrossSpaceCompactionTask.java     |  4 +-
 .../execute/task/InnerSpaceCompactionTask.java     |  5 +-
 .../task/InsertionCrossSpaceCompactionTask.java    | 12 +---
 .../execute/task/SettleCompactionTask.java         |  3 +-
 .../compaction/execute/utils/CompactionUtils.java  | 17 ++----
 .../dataregion/tsfile/TsFileResource.java          | 17 ++++++
 .../cross/InsertionCrossSpaceCompactionTest.java   | 16 +-----
 .../utils/CompactionUpdateFileCountTest.java       | 66 ++++++++++++++++++++--
 .../compaction/utils/CompactionUtilsTest.java      |  2 +-
 12 files changed, 122 insertions(+), 108 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 67cc75be749..a714adfe315 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
@@ -64,12 +64,12 @@ public class FileMetrics implements IMetricSet {
   }
 
   // region TsFile Related Metrics Update
-  public void addTsFile(String database, String regionId, long size, boolean 
seq, String name) {
-    TS_FILE_METRICS.addTsFile(database, regionId, size, seq, name);
+  public void addTsFile(TsFileResource tsFileResource) {
+    TS_FILE_METRICS.addTsFile(tsFileResource);
   }
 
-  public void deleteTsFile(boolean seq, List<TsFileResource> 
tsFileResourceList) {
-    TS_FILE_METRICS.deleteFile(seq, tsFileResourceList);
+  public void deleteTsFile(List<TsFileResource> tsFileResourceList) {
+    TS_FILE_METRICS.deleteFile(tsFileResourceList);
   }
 
   public void deleteRegion(String database, String regionId) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/TsFileMetrics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/TsFileMetrics.java
index 2d78e2f6baf..de0c0fd23d6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/TsFileMetrics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/metrics/file/TsFileMetrics.java
@@ -92,10 +92,17 @@ public class TsFileMetrics implements IMetricSet {
   }
 
   // region external update tsfile related metrics
-  public void addTsFile(String database, String regionId, long size, boolean 
seq, String name) {
-    updateGlobalTsFileCountAndSize(database, regionId, 1, size, seq);
+  public void addTsFile(TsFileResource tsFileResource) {
+    if (!tsFileResource.markAsRecordedByMetric()) {
+      return;
+    }
+    long size = tsFileResource.getTsFileSize();
+    boolean seq = tsFileResource.isSeq();
+    updateGlobalTsFileCountAndSize(
+        tsFileResource.getDatabaseName(), tsFileResource.getDataRegionId(), 1, 
size, seq);
     try {
-      TsFileNameGenerator.TsFileName tsFileName = 
TsFileNameGenerator.getTsFileName(name);
+      TsFileNameGenerator.TsFileName tsFileName =
+          
TsFileNameGenerator.getTsFileName(tsFileResource.getTsFile().getName());
       int level = tsFileName.getInnerCompactionCnt();
       updateLevelTsFileCountAndSize(size, 1, seq, level);
     } catch (IOException e) {
@@ -103,10 +110,14 @@ public class TsFileMetrics implements IMetricSet {
     }
   }
 
-  public void deleteFile(boolean seq, List<TsFileResource> tsFileResourceList) 
{
+  public void deleteFile(List<TsFileResource> tsFileResourceList) {
     for (TsFileResource tsFileResource : tsFileResourceList) {
+      if (!tsFileResource.markAsUnrecordedByMetric()) {
+        continue;
+      }
       String name = tsFileResource.getTsFile().getName();
       long size = tsFileResource.getTsFileSize();
+      boolean seq = tsFileResource.isSeq();
       updateGlobalTsFileCountAndSize(
           tsFileResource.getDatabaseName(), tsFileResource.getDataRegionId(), 
-1, -size, seq);
       try {
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 19686757e29..d2619a9de65 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
@@ -629,13 +629,7 @@ public class DataRegion implements IDataRegionForQuery {
         // tsFiles without resource file are unsealed
         for (TsFileResource resource : value) {
           if (resource.resourceFileExists()) {
-            FileMetrics.getInstance()
-                .addTsFile(
-                    resource.getDatabaseName(),
-                    resource.getDataRegionId(),
-                    resource.getTsFile().length(),
-                    true,
-                    resource.getTsFile().getName());
+            FileMetrics.getInstance().addTsFile(resource);
             if 
(ModificationFile.getExclusiveMods(resource.getTsFile()).exists()) {
               // update mods file metrics
               resource.getExclusiveModFile();
@@ -663,13 +657,7 @@ public class DataRegion implements IDataRegionForQuery {
         // tsFiles without resource file are unsealed
         for (TsFileResource resource : unseqTsFiles) {
           if (resource.resourceFileExists()) {
-            FileMetrics.getInstance()
-                .addTsFile(
-                    resource.getDatabaseName(),
-                    resource.getDataRegionId(),
-                    resource.getTsFile().length(),
-                    false,
-                    resource.getTsFile().getName());
+            FileMetrics.getInstance().addTsFile(resource);
           } else {
             WALRecoverListener recoverListener =
                 recoverUnsealedTsFile(resource, dataRegionRecoveryContext, 
false);
@@ -976,13 +964,7 @@ public class DataRegion implements IDataRegionForQuery {
         }
         updateDeviceLastFlushTime(tsFileResource);
         tsFileResourceManager.registerSealedTsFileResource(tsFileResource);
-        FileMetrics.getInstance()
-            .addTsFile(
-                tsFileResource.getDatabaseName(),
-                tsFileResource.getDataRegionId(),
-                tsFileResource.getTsFile().length(),
-                recoverPerformer.isSequence(),
-                tsFileResource.getTsFile().getName());
+        FileMetrics.getInstance().addTsFile(tsFileResource);
       } else {
         // the last file is not closed, continue writing to it
         RestorableTsFileIOWriter writer = recoverPerformer.getWriter();
@@ -2393,7 +2375,7 @@ public class DataRegion implements IDataRegionForQuery {
       tsFileResourceList.addAll(tsFileManager.getTsFileList(false));
       tsFileResourceList.forEach(
           x -> {
-            FileMetrics.getInstance().deleteTsFile(x.isSeq(), 
Collections.singletonList(x));
+            
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(x));
             try {
               x.removeModFile();
             } catch (IOException e) {
@@ -2669,13 +2651,7 @@ public class DataRegion implements IDataRegionForQuery {
         closedTsFileResources.add(tsFileProcessor.getTsFileResource());
       }
       for (TsFileResource resource : closedTsFileResources) {
-        FileMetrics.getInstance()
-            .addTsFile(
-                resource.getDatabaseName(),
-                resource.getDataRegionId(),
-                resource.getTsFileSize(),
-                resource.isSeq(),
-                resource.getTsFile().getName());
+        FileMetrics.getInstance().addTsFile(resource);
       }
       WritingMetrics.getInstance().recordActiveTimePartitionCount(-1);
       logger.info(StorageEngineMessages.FILES_WERE_CLOSED, 
closedTsFileResources.size());
@@ -3799,8 +3775,7 @@ public class DataRegion implements IDataRegionForQuery {
       tsFileManager.remove(tsFileResource, tsFileResource.isSeq());
       tsFileResource.writeLock();
       try {
-        FileMetrics.getInstance()
-            .deleteTsFile(tsFileResource.isSeq(), 
Collections.singletonList(tsFileResource));
+        
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(tsFileResource));
         tsFileResource.remove();
         logger.info(
             StorageEngineMessages.REMOVE_TSFILE_DIRECTLY_WHEN_DELETE_DATA,
@@ -3843,8 +3818,7 @@ public class DataRegion implements IDataRegionForQuery {
       tsFileManager.remove(tsFileResource, tsFileResource.isSeq());
       tsFileResource.writeLock();
       try {
-        FileMetrics.getInstance()
-            .deleteTsFile(tsFileResource.isSeq(), 
Collections.singletonList(tsFileResource));
+        
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(tsFileResource));
         tsFileResource.remove();
         logger.info(
             StorageEngineMessages.REMOVE_TSFILE_DIRECTLY_WHEN_DELETE_DATA,
@@ -3946,13 +3920,7 @@ public class DataRegion implements IDataRegionForQuery {
     }
     if (!isValidateTsFileFailed) {
       TsFileResource tsFileResource = tsFileProcessor.getTsFileResource();
-      FileMetrics.getInstance()
-          .addTsFile(
-              tsFileResource.getDatabaseName(),
-              tsFileResource.getDataRegionId(),
-              tsFileResource.getTsFileSize(),
-              tsFileProcessor.isSequence(),
-              tsFileResource.getTsFile().getName());
+      FileMetrics.getInstance().addTsFile(tsFileResource);
     }
   }
 
@@ -4317,13 +4285,7 @@ public class DataRegion implements IDataRegionForQuery {
               TableDiskUsageIndex.getInstance()
                   .write(databaseName, newTsFileResource.getTsFileID(), 
stringLongMap));
 
-      FileMetrics.getInstance()
-          .addTsFile(
-              newTsFileResource.getDatabaseName(),
-              newTsFileResource.getDataRegionId(),
-              newTsFileResource.getTsFile().length(),
-              false,
-              newTsFileResource.getTsFile().getName());
+      FileMetrics.getInstance().addTsFile(newTsFileResource);
 
       if (config.isEnableSeparateData()) {
         final DataRegionId dataRegionId =
@@ -4736,8 +4698,7 @@ public class DataRegion implements IDataRegionForQuery {
         if 
(sequenceResource.getTsFile().getName().equals(fileToBeUnloaded.getName())) {
           unloadedTsFileResource = sequenceResource;
           tsFileManager.remove(unloadedTsFileResource, true);
-          FileMetrics.getInstance()
-              .deleteTsFile(true, 
Collections.singletonList(unloadedTsFileResource));
+          
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(unloadedTsFileResource));
           break;
         }
       }
@@ -4749,7 +4710,7 @@ public class DataRegion implements IDataRegionForQuery {
             unloadedTsFileResource = unsequenceResource;
             tsFileManager.remove(unloadedTsFileResource, false);
             FileMetrics.getInstance()
-                .deleteTsFile(false, 
Collections.singletonList(unloadedTsFileResource));
+                
.deleteTsFile(Collections.singletonList(unloadedTsFileResource));
             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 1a6703e4b67..345bca19b31 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
@@ -357,8 +357,8 @@ public class CrossSpaceCompactionTask extends 
AbstractCompactionTask {
       throw new 
CompactionRecoverException(StorageEngineMessages.SOURCE_FILES_CANNOT_BE_DELETED);
     }
     if (recoverMemoryStatus) {
-      FileMetrics.getInstance().deleteTsFile(true, selectedSequenceFiles);
-      FileMetrics.getInstance().deleteTsFile(false, selectedUnsequenceFiles);
+      FileMetrics.getInstance().deleteTsFile(selectedSequenceFiles);
+      FileMetrics.getInstance().deleteTsFile(selectedUnsequenceFiles);
     }
   }
 
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 acc2ff500a9..1b0fb3205be 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
@@ -435,8 +435,7 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
       isHoldingWriteLock[i] = true;
     }
 
-    CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(
-        filesView.sourceFilesInLog, filesView.sequence);
+    
CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(filesView.sourceFilesInLog);
     updateTableSizeCache();
     CompactionMetrics.getInstance().recordSummaryInfo(summary);
   }
@@ -599,7 +598,7 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
       throw new 
CompactionRecoverException(StorageEngineMessages.SOURCE_FILES_CANNOT_BE_DELETED);
     }
     if (recoverMemoryStatus) {
-      FileMetrics.getInstance().deleteTsFile(filesView.sequence, 
filesView.sourceFilesInLog);
+      FileMetrics.getInstance().deleteTsFile(filesView.sourceFilesInLog);
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
index 6ae9791401a..60c1bdc106d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InsertionCrossSpaceCompactionTask.java
@@ -371,18 +371,10 @@ public class InsertionCrossSpaceCompactionTask extends 
AbstractCompactionTask {
   }
 
   private void updateFileMetrics() {
-    // Here the target file is used for updating metrics because the source 
file
-    // has been deleted here.
     // The statistics of the mods file can be left unchanged, as it does not
     // differentiate between sequence or unsequence.
-    FileMetrics.getInstance().deleteTsFile(false, 
Collections.singletonList(targetFile));
-    FileMetrics.getInstance()
-        .addTsFile(
-            targetFile.getDatabaseName(),
-            targetFile.getDataRegionId(),
-            targetFile.getTsFileSize(),
-            true,
-            targetFile.getTsFile().getName());
+    
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(unseqFileToInsert));
+    FileMetrics.getInstance().addTsFile(targetFile);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
index 388197e66e3..4de88103322 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
@@ -226,8 +226,7 @@ public class SettleCompactionTask extends 
InnerSpaceCompactionTask {
                 
.STORAGE_LOG_SETTLE_TASK_DELETES_FULLY_DIRTY_TSFILE_SUCCESSFULLY_18D81225,
             resource.getTsFile().getAbsolutePath());
         if (recoverMemoryStatus) {
-          FileMetrics.getInstance()
-              .deleteTsFile(resource.isSeq(), 
Collections.singletonList(resource));
+          
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(resource));
         }
       } else {
         LOGGER.error(
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 5798f8fd382..d26ecdb2129 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
@@ -268,13 +268,7 @@ public class CompactionUtils {
   }
 
   public static void addFilesToFileMetrics(TsFileResource resource) {
-    FileMetrics.getInstance()
-        .addTsFile(
-            resource.getDatabaseName(),
-            resource.getDataRegionId(),
-            resource.getTsFile().length(),
-            resource.isSeq(),
-            resource.getTsFile().getName());
+    FileMetrics.getInstance().addTsFile(resource);
   }
 
   private static void updateOneTargetMods(TsFileResource targetFile, 
Set<ModEntry> modifications)
@@ -396,16 +390,15 @@ public class CompactionUtils {
 
   public static void deleteSourceTsFileAndUpdateFileMetrics(
       List<TsFileResource> sourceSeqResourceList, List<TsFileResource> 
sourceUnseqResourceList) {
-    deleteSourceTsFileAndUpdateFileMetrics(sourceSeqResourceList, true);
-    deleteSourceTsFileAndUpdateFileMetrics(sourceUnseqResourceList, false);
+    deleteSourceTsFileAndUpdateFileMetrics(sourceSeqResourceList);
+    deleteSourceTsFileAndUpdateFileMetrics(sourceUnseqResourceList);
   }
 
-  public static void deleteSourceTsFileAndUpdateFileMetrics(
-      List<TsFileResource> resources, boolean seq) {
+  public static void 
deleteSourceTsFileAndUpdateFileMetrics(List<TsFileResource> resources) {
     for (TsFileResource resource : resources) {
       deleteTsFileResourceWithoutLock(resource);
     }
-    FileMetrics.getInstance().deleteTsFile(seq, resources);
+    FileMetrics.getInstance().deleteTsFile(resources);
   }
 
   public static void deleteTsFileResourceWithoutLock(TsFileResource resource) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
index bffa3a0f1eb..a5ec8a555eb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
@@ -92,6 +92,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -159,6 +160,8 @@ public class TsFileResource implements PersistentResource, 
Cloneable {
 
   private boolean isSeq;
 
+  private AtomicBoolean isRecordedByMetric = new AtomicBoolean(false);
+
   private final FSFactory fsFactory = FSFactoryProducer.getFSFactory();
 
   private DataRegion.SettleTsFileCallBack settleTsFileCallBack;
@@ -259,6 +262,7 @@ public class TsFileResource implements PersistentResource, 
Cloneable {
     this.originTsFileResource = originTsFileResource;
     this.tsFileID = originTsFileResource.tsFileID;
     this.isSeq = originTsFileResource.isSeq;
+    this.isRecordedByMetric = originTsFileResource.isRecordedByMetric;
     this.tierLevel = originTsFileResource.tierLevel;
   }
 
@@ -1372,6 +1376,18 @@ public class TsFileResource implements 
PersistentResource, Cloneable {
     return isSeq;
   }
 
+  public boolean isRecordedByMetric() {
+    return isRecordedByMetric.get();
+  }
+
+  public boolean markAsRecordedByMetric() {
+    return isRecordedByMetric.compareAndSet(false, true);
+  }
+
+  public boolean markAsUnrecordedByMetric() {
+    return isRecordedByMetric.compareAndSet(true, false);
+  }
+
   public int compareIndexDegradePriority(TsFileResource tsFileResource) {
     int cmp = timeIndex.compareDegradePriority(tsFileResource.timeIndex);
     return cmp == 0 ? 
file.getAbsolutePath().compareTo(tsFileResource.file.getAbsolutePath()) : cmp;
@@ -1665,6 +1681,7 @@ public class TsFileResource implements 
PersistentResource, Cloneable {
     cloned.sharedModFileOffset = this.sharedModFileOffset;
     cloned.compactionModFile = this.compactionModFile;
     cloned.isSeq = this.isSeq;
+    cloned.isRecordedByMetric = this.isRecordedByMetric;
     cloned.tsFileRepairStatus = this.tsFileRepairStatus;
     cloned.settleTsFileCallBack = this.settleTsFileCallBack;
     cloned.deviceTimeIndexRamSize = this.deviceTimeIndexRamSize;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/InsertionCrossSpaceCompactionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/InsertionCrossSpaceCompactionTest.java
index 0e0516a46c0..73c0bc2a721 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/InsertionCrossSpaceCompactionTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/InsertionCrossSpaceCompactionTest.java
@@ -564,13 +564,7 @@ public class InsertionCrossSpaceCompactionTest extends 
AbstractCompactionTest {
     TsFileResource unseqResource1 =
         generateSingleNonAlignedSeriesFileWithDevices(
             "2-2-0-0.tsfile", new String[] {"d1"}, new TimeRange[] {new 
TimeRange(1, 4)}, false);
-    FileMetrics.getInstance()
-        .addTsFile(
-            unseqResource1.getDatabaseName(),
-            unseqResource1.getDataRegionId(),
-            unseqResource1.getTsFileSize(),
-            false,
-            unseqResource1.getTsFile().getName());
+    FileMetrics.getInstance().addTsFile(unseqResource1);
 
     long seqFileNumBeforeCompaction = 
FileMetrics.getInstance().getFileCount(true);
     long unseqFileNumBeforeCompaction = 
FileMetrics.getInstance().getFileCount(false);
@@ -588,13 +582,7 @@ public class InsertionCrossSpaceCompactionTest extends 
AbstractCompactionTest {
     TsFileResource unseqResource2 =
         generateSingleNonAlignedSeriesFileWithDevices(
             "3-3-0-0.tsfile", new String[] {"d1"}, new TimeRange[] {new 
TimeRange(5, 6)}, false);
-    FileMetrics.getInstance()
-        .addTsFile(
-            unseqResource2.getDatabaseName(),
-            unseqResource2.getDataRegionId(),
-            unseqResource2.getTsFileSize(),
-            false,
-            unseqResource2.getTsFile().getName());
+    FileMetrics.getInstance().addTsFile(unseqResource2);
 
     seqFileNumBeforeCompaction = FileMetrics.getInstance().getFileCount(true);
     unseqFileNumBeforeCompaction = 
FileMetrics.getInstance().getFileCount(false);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUpdateFileCountTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUpdateFileCountTest.java
index 1740eb2f1c1..c79cd467603 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUpdateFileCountTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUpdateFileCountTest.java
@@ -27,6 +27,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.ReadChunkCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.CrossSpaceCompactionTask;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
+import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.junit.After;
@@ -35,6 +36,9 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 public class CompactionUpdateFileCountTest extends AbstractCompactionTest {
 
@@ -53,10 +57,11 @@ public class CompactionUpdateFileCountTest extends 
AbstractCompactionTest {
   public void testSeqSpaceCompactionFileMetric()
       throws MetadataException, IOException, WriteProcessException {
     registerTimeseriesInMManger(2, 3, false);
-    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
-    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     createFiles(1, 2, 3, 100, 1, 0, 50, 0, false, true);
     createFiles(1, 2, 3, 50, 200, 30000, 50, 50, false, true);
+    seqResources.forEach(FileMetrics.getInstance()::addTsFile);
+    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
+    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     tsFileManager.addAll(seqResources, true);
     InnerSpaceCompactionTask task =
         new InnerSpaceCompactionTask(
@@ -70,10 +75,11 @@ public class CompactionUpdateFileCountTest extends 
AbstractCompactionTest {
   public void testUnSeqSpaceCompactionFileMetric()
       throws MetadataException, IOException, WriteProcessException {
     registerTimeseriesInMManger(2, 3, false);
-    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
-    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     createFiles(1, 2, 3, 100, 1, 0, 50, 0, false, false);
     createFiles(1, 2, 3, 50, 20, 10000, 50, 50, false, false);
+    unseqResources.forEach(FileMetrics.getInstance()::addTsFile);
+    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
+    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     tsFileManager.addAll(unseqResources, false);
     InnerSpaceCompactionTask task =
         new InnerSpaceCompactionTask(
@@ -87,10 +93,12 @@ public class CompactionUpdateFileCountTest extends 
AbstractCompactionTest {
   public void testCrossSpaceCompactionFileMetric()
       throws MetadataException, IOException, WriteProcessException {
     registerTimeseriesInMManger(2, 3, false);
-    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
-    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     createFiles(1, 2, 3, 100, 1, 0, 50, 0, false, true);
     createFiles(3, 2, 3, 50, 20, 10000, 50, 50, false, false);
+    seqResources.forEach(FileMetrics.getInstance()::addTsFile);
+    unseqResources.forEach(FileMetrics.getInstance()::addTsFile);
+    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
+    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
     tsFileManager.addAll(seqResources, true);
     tsFileManager.addAll(unseqResources, false);
     CrossSpaceCompactionTask task =
@@ -106,4 +114,50 @@ public class CompactionUpdateFileCountTest extends 
AbstractCompactionTest {
     Assert.assertEquals(initSeqFileNum, 
FileMetrics.getInstance().getFileCount(true));
     Assert.assertEquals(initUnSeqFileNum - 3, 
FileMetrics.getInstance().getFileCount(false));
   }
+
+  @Test
+  public void testRepeatedlyUpdateFileMetric()
+      throws MetadataException, IOException, WriteProcessException {
+    registerTimeseriesInMManger(2, 3, false);
+    createFiles(1, 2, 3, 100, 1, 0, 50, 0, false, true);
+    TsFileResource resource = seqResources.get(0);
+    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
+
+    try {
+      FileMetrics.getInstance().addTsFile(resource);
+      FileMetrics.getInstance().addTsFile(resource);
+      Assert.assertTrue(resource.isRecordedByMetric());
+      Assert.assertEquals(initSeqFileNum + 1, 
FileMetrics.getInstance().getFileCount(true));
+
+      
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(resource));
+      
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(resource));
+      Assert.assertFalse(resource.isRecordedByMetric());
+      Assert.assertEquals(initSeqFileNum, 
FileMetrics.getInstance().getFileCount(true));
+    } finally {
+      
FileMetrics.getInstance().deleteTsFile(Collections.singletonList(resource));
+    }
+  }
+
+  @Test
+  public void testDeleteFileMetricByResourceSequence()
+      throws MetadataException, IOException, WriteProcessException {
+    registerTimeseriesInMManger(2, 3, false);
+    createFiles(1, 2, 3, 100, 1, 0, 50, 0, false, true);
+    createFiles(1, 2, 3, 50, 200, 30000, 50, 50, false, false);
+    List<TsFileResource> resources = Arrays.asList(seqResources.get(0), 
unseqResources.get(0));
+    long initSeqFileNum = FileMetrics.getInstance().getFileCount(true);
+    long initUnSeqFileNum = FileMetrics.getInstance().getFileCount(false);
+
+    try {
+      resources.forEach(FileMetrics.getInstance()::addTsFile);
+      Assert.assertEquals(initSeqFileNum + 1, 
FileMetrics.getInstance().getFileCount(true));
+      Assert.assertEquals(initUnSeqFileNum + 1, 
FileMetrics.getInstance().getFileCount(false));
+
+      FileMetrics.getInstance().deleteTsFile(resources);
+      Assert.assertEquals(initSeqFileNum, 
FileMetrics.getInstance().getFileCount(true));
+      Assert.assertEquals(initUnSeqFileNum, 
FileMetrics.getInstance().getFileCount(false));
+    } finally {
+      FileMetrics.getInstance().deleteTsFile(resources);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
index 2972c0ee929..97427b16321 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionUtilsTest.java
@@ -85,7 +85,7 @@ public class CompactionUtilsTest extends 
AbstractCompactionTest {
     Assert.assertEquals(
         modFileSizeBefore + totalModFileSize, 
FileMetrics.getInstance().getModFileSize());
 
-    CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(new 
ArrayList<>(seqResources), true);
+    CompactionUtils.deleteSourceTsFileAndUpdateFileMetrics(new 
ArrayList<>(seqResources));
 
     Assert.assertEquals(modFileNumBefore, 
FileMetrics.getInstance().getModFileNum());
     Assert.assertEquals(modFileSizeBefore, 
FileMetrics.getInstance().getModFileSize());

Reply via email to