You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2025/12/18 04:20:02 UTC

(iotdb) branch delete_object_file created (now 5fa057d4b4b)

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

haonan pushed a change to branch delete_object_file
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 5fa057d4b4b optimize drop table

This branch includes the following new commits:

     new 000c24023fc deving
     new 393b5cd0ad7 dev
     new 3cfcd3ce977 remove empty object dir
     new 5fa057d4b4b optimize drop table

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(iotdb) 03/04: remove empty object dir

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3cfcd3ce9779b0cc380d02f6a17bb008965b1799
Author: HTHou <ha...@apache.org>
AuthorDate: Tue Dec 16 16:40:28 2025 +0800

    remove empty object dir
---
 .../iotdb/db/storageengine/rescon/disk/TierManager.java     | 11 +++++++++++
 .../java/org/apache/iotdb/db/utils/ObjectTypeUtils.java     | 13 ++++++++++++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
index a673e44dff9..3aff31a9631 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
@@ -39,6 +39,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileStore;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -174,6 +175,16 @@ public class TierManager {
       } catch (DiskSpaceInsufficientException e) {
         logger.error("All disks of tier {} are full.", tierLevel, e);
       }
+      // try to remove empty objectDirs
+      for (String dir : objectDirs) {
+        File dirFile = FSFactoryProducer.getFSFactory().getFile(dir);
+        if (dirFile.isDirectory() && Objects.requireNonNull(dirFile.list()).length == 0) {
+          try {
+            Files.delete(dirFile.toPath());
+          } catch (IOException ignore) {
+          }
+        }
+      }
     }
 
     tierDiskTotalSpace = getTierDiskSpace(DiskSpaceType.TOTAL);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
index f09d4472cd3..993cbec28f5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
@@ -56,6 +56,7 @@ import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 public class ObjectTypeUtils {
@@ -312,8 +313,18 @@ public class ObjectTypeUtils {
         logger.error("Failed to remove object file {}", file.getAbsolutePath(), e);
       }
     }
-    if (file.getParentFile().exists()) {
+    deleteEmptyParentDir(file);
+  }
 
+  private static void deleteEmptyParentDir(File file) {
+    File dir = file.getParentFile();
+    if (dir.isDirectory() && Objects.requireNonNull(dir.list()).length == 0) {
+      try {
+        Files.deleteIfExists(dir.toPath());
+        deleteEmptyParentDir(dir);
+      } catch (IOException e) {
+        logger.error("Failed to remove empty object dir {}", dir.getAbsolutePath(), e);
+      }
     }
   }
 


(iotdb) 04/04: optimize drop table

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5fa057d4b4b1814a9bedaa6744c0c891f72371d3
Author: HTHou <ha...@apache.org>
AuthorDate: Thu Dec 18 12:19:32 2025 +0800

    optimize drop table
---
 .../db/storageengine/dataregion/DataRegion.java    | 109 +++++++++++----------
 .../dataregion/modification/DeletionPredicate.java |   4 +
 .../modification/TableDeletionEntry.java           |   9 ++
 .../db/storageengine/rescon/disk/TierManager.java  |  11 +++
 4 files changed, 82 insertions(+), 51 deletions(-)

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 27a290b60fd..8de74e066ab 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
@@ -2766,10 +2766,21 @@ public class DataRegion implements IDataRegionForQuery {
         }
       }
 
-      List<File> matchedObjectDirs =
+      List<File> objectTableDirs =
           TierManager.getInstance().getAllMatchedObjectDirs(dataRegionIdString, tableName);
-      if (!matchedObjectDirs.isEmpty()) {
-        deleteObjectFiles(matchedObjectDirs, modEntries);
+      if (!objectTableDirs.isEmpty()) {
+        boolean droppingTable = false;
+        for (TableDeletionEntry entry : modEntries) {
+          if (entry.isDroppingTable()) {
+            for (File objectTableDir : objectTableDirs) {
+              droppingTable = true;
+              FileUtils.deleteQuietly(objectTableDir);
+            }
+          }
+        }
+        if (!droppingTable) {
+          deleteObjectFiles(objectTableDirs, modEntries);
+        }
       }
 
       List<List<TsFileResource>> sealedTsFileResourceLists = new ArrayList<>(modEntries.size());
@@ -2943,54 +2954,50 @@ public class DataRegion implements IDataRegionForQuery {
   private void deleteObjectFiles(List<File> matchedObjectDirs, List<TableDeletionEntry> modEntries)
       throws IOException {
     for (File matchedObjectDir : matchedObjectDirs) {
-      try (Stream<Path> paths = Files.walk(matchedObjectDir.toPath())) {
-        paths
-            .filter(Files::isRegularFile)
-            .filter(
-                path -> {
-                  String name = path.getFileName().toString();
-                  return name.endsWith(".bin");
-                })
-            .forEach(
-                path -> {
-                  Path relativePath = matchedObjectDir.getParentFile().toPath().relativize(path);
-                  String[] ideviceIdSegments = new String[relativePath.getNameCount() - 2];
-                  for (int i = 0; i < ideviceIdSegments.length; i++) {
-                    ideviceIdSegments[i] =
-                        config.getRestrictObjectLimit()
-                            ? relativePath.getName(i).toString()
-                            : new String(
-                                BaseEncoding.base32()
-                                    .omitPadding()
-                                    .decode(relativePath.getName(i).toString()),
-                                StandardCharsets.UTF_8);
-                  }
-                  IDeviceID iDeviceID = Factory.DEFAULT_FACTORY.create(ideviceIdSegments);
-                  String measurementId =
-                      config.getRestrictObjectLimit()
-                          ? relativePath.getName(relativePath.getNameCount() - 2).toString()
-                          : new String(
-                              BaseEncoding.base32()
-                                  .omitPadding()
-                                  .decode(
-                                      relativePath
-                                          .getName(relativePath.getNameCount() - 2)
-                                          .toString()),
-                              StandardCharsets.UTF_8);
-                  String fileName = path.getFileName().toString();
-                  long timestamp = Long.parseLong(fileName.substring(0, fileName.lastIndexOf('.')));
-                  logger.info(
-                      "timestamp {}, measurementId {}, ideviceId {}",
-                      timestamp,
-                      measurementId,
-                      iDeviceID);
-                  for (TableDeletionEntry modEntry : modEntries) {
-                    if (modEntry.affects(iDeviceID, timestamp, timestamp)
-                        && modEntry.affects(measurementId)) {
-                      ObjectTypeUtils.deleteObjectPath(path.toFile());
-                    }
-                  }
-                });
+      try (Stream<Path> paths =
+          Files.find(
+              matchedObjectDir.toPath(),
+              Integer.MAX_VALUE,
+              (path, attrs) ->
+                  attrs.isRegularFile() && path.getFileName().toString().endsWith(".bin"))) {
+        paths.forEach(
+            path -> {
+              Path relativePath = matchedObjectDir.getParentFile().toPath().relativize(path);
+              String[] ideviceIdSegments = new String[relativePath.getNameCount() - 2];
+              for (int i = 0; i < ideviceIdSegments.length; i++) {
+                ideviceIdSegments[i] =
+                    config.getRestrictObjectLimit()
+                        ? relativePath.getName(i).toString()
+                        : new String(
+                            BaseEncoding.base32()
+                                .omitPadding()
+                                .decode(relativePath.getName(i).toString()),
+                            StandardCharsets.UTF_8);
+              }
+              IDeviceID iDeviceID = Factory.DEFAULT_FACTORY.create(ideviceIdSegments);
+              String measurementId =
+                  config.getRestrictObjectLimit()
+                      ? relativePath.getName(relativePath.getNameCount() - 2).toString()
+                      : new String(
+                          BaseEncoding.base32()
+                              .omitPadding()
+                              .decode(
+                                  relativePath.getName(relativePath.getNameCount() - 2).toString()),
+                          StandardCharsets.UTF_8);
+              String fileName = path.getFileName().toString();
+              long timestamp = Long.parseLong(fileName.substring(0, fileName.lastIndexOf('.')));
+              logger.info(
+                  "timestamp {}, measurementId {}, ideviceId {}",
+                  timestamp,
+                  measurementId,
+                  iDeviceID);
+              for (TableDeletionEntry modEntry : modEntries) {
+                if (modEntry.affects(iDeviceID, timestamp, timestamp)
+                    && modEntry.affects(measurementId)) {
+                  ObjectTypeUtils.deleteObjectPath(path.toFile());
+                }
+              }
+            });
       }
     }
   }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
index 7e79e8f580d..0a22da2a90a 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
@@ -72,6 +72,10 @@ public class DeletionPredicate implements StreamSerializable, BufferSerializable
     this.idPredicate = idPredicate;
   }
 
+  public IDPredicate getIdPredicate() {
+    return idPredicate;
+  }
+
   public String getTableName() {
     return tableName;
   }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntry.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntry.java
index 858b6645b2f..61ec2e0d678 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntry.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntry.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.storageengine.dataregion.modification;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.queryengine.execution.MemoryEstimationHelper;
+import org.apache.iotdb.db.storageengine.dataregion.modification.IDPredicate.IDPredicateType;
 import org.apache.iotdb.db.utils.ModificationUtils;
 
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -136,6 +137,14 @@ public class TableDeletionEntry extends ModEntry {
     return predicate.getTableName();
   }
 
+  public boolean isDroppingTable() {
+    IDPredicate idPredicate = predicate.getIdPredicate();
+    return idPredicate.type == IDPredicateType.NOP
+        && predicate.getMeasurementNames().isEmpty()
+        && timeRange.getMin() == Long.MIN_VALUE
+        && timeRange.getMax() == Long.MAX_VALUE;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
index 3aff31a9631..f83bdc36b4b 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
@@ -287,6 +287,17 @@ public class TierManager {
 
   public List<File> getAllMatchedObjectDirs(String regionIdStr, String... path) {
     List<File> matchedDirs = new ArrayList<>();
+    boolean hasObjectDir = false;
+    for (String objectDir : objectDirs) {
+      File objectDirPath = FSFactoryProducer.getFSFactory().getFile(objectDir);
+      if (objectDirPath.exists()) {
+        hasObjectDir = true;
+        break;
+      }
+    }
+    if (!hasObjectDir) {
+      return matchedDirs;
+    }
     StringBuilder objectPath = new StringBuilder();
     objectPath.append(regionIdStr);
     for (String str : path) {


(iotdb) 01/04: deving

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 000c24023fcfc3367153b33588f3bd1931a9db16
Author: HTHou <ha...@apache.org>
AuthorDate: Mon Dec 15 14:17:01 2025 +0800

    deving
---
 .../db/storageengine/dataregion/DataRegion.java    | 14 +++++++++++--
 .../db/storageengine/rescon/disk/TierManager.java  | 24 ++++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)

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 09c9ee84304..639b7e4c214 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
@@ -2751,8 +2751,8 @@ public class DataRegion implements IDataRegionForQuery {
       if (deleted) {
         return;
       }
-      TableDeviceSchemaCache.getInstance()
-          .invalidateLastCache(getDatabaseName(), modEntries.get(0).getTableName());
+      String tableName = modEntries.get(0).getTableName();
+      TableDeviceSchemaCache.getInstance().invalidateLastCache(getDatabaseName(), tableName);
       List<WALFlushListener> walListeners = logDeletionInWAL(node);
 
       for (WALFlushListener walFlushListener : walListeners) {
@@ -2762,6 +2762,10 @@ public class DataRegion implements IDataRegionForQuery {
         }
       }
 
+      if (TierManager.getInstance().checkObjectPathExist(dataRegionIdString, tableName)) {
+        deleteObjectFiles(tableName, modEntries);
+      }
+
       List<List<TsFileResource>> sealedTsFileResourceLists = new ArrayList<>(modEntries.size());
       for (TableDeletionEntry modEntry : modEntries) {
         List<TsFileResource> sealedTsFileResource = new ArrayList<>();
@@ -2930,6 +2934,12 @@ public class DataRegion implements IDataRegionForQuery {
     return walFlushListeners;
   }
 
+  private void deleteObjectFiles(String tableName, List<TableDeletionEntry> modEntries) {
+    for (TableDeletionEntry modEntry : modEntries) {
+
+    }
+  }
+
   /**
    * For IoTConsensus sync. See <a href="https://github.com/apache/iotdb/pull/12955">github pull
    * request</a> for details.
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
index a5fa8b54e7b..e173bb0abaf 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.db.storageengine.rescon.disk.strategy.MinFolderOccupiedS
 import org.apache.iotdb.db.storageengine.rescon.disk.strategy.RandomOnDiskUsableSpaceStrategy;
 import org.apache.iotdb.metrics.utils.FileStoreUtils;
 
+import com.google.common.io.BaseEncoding;
 import org.apache.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.tsfile.fileSystem.FSType;
 import org.apache.tsfile.utils.FSUtils;
@@ -36,6 +37,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.FileStore;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -272,6 +274,28 @@ public class TierManager {
     return Optional.empty();
   }
 
+  public boolean checkObjectPathExist(String regionIdStr, String... path) {
+    StringBuilder objectPath = new StringBuilder();
+    objectPath.append(regionIdStr);
+    for (String str : path) {
+      objectPath
+          .append(File.separator)
+          .append(
+              config.getRestrictObjectLimit()
+                  ? str
+                  : BaseEncoding.base32()
+                      .omitPadding()
+                      .encode(str.getBytes(StandardCharsets.UTF_8)));
+    }
+    for (String objectDir : objectDirs) {
+      File objectFilePath = FSFactoryProducer.getFSFactory().getFile(objectDir, objectPath.toString());
+      if (objectFilePath.exists()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   public int getTiersNum() {
     return seqTiers.size();
   }


(iotdb) 02/04: dev

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 393b5cd0ad7e5a96d1330dd559c7a3d86e5c0376
Author: HTHou <ha...@apache.org>
AuthorDate: Tue Dec 16 09:53:55 2025 +0800

    dev
---
 .../db/storageengine/dataregion/DataRegion.java    | 65 ++++++++++++++++++++--
 .../db/storageengine/rescon/disk/TierManager.java  | 10 ++--
 .../org/apache/iotdb/db/utils/ObjectTypeUtils.java | 21 +++++++
 3 files changed, 87 insertions(+), 9 deletions(-)

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 639b7e4c214..27a290b60fd 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
@@ -158,6 +158,7 @@ import org.apache.iotdb.db.utils.CommonUtils;
 import org.apache.iotdb.db.utils.DateTimeUtils;
 import org.apache.iotdb.db.utils.EncryptDBUtils;
 import org.apache.iotdb.db.utils.ModificationUtils;
+import org.apache.iotdb.db.utils.ObjectTypeUtils;
 import org.apache.iotdb.db.utils.ObjectWriter;
 import org.apache.iotdb.metrics.utils.MetricLevel;
 import org.apache.iotdb.rpc.RpcUtils;
@@ -165,11 +166,13 @@ import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
+import com.google.common.io.BaseEncoding;
 import org.apache.thrift.TException;
 import org.apache.tsfile.external.commons.io.FileUtils;
 import org.apache.tsfile.external.commons.lang3.tuple.Triple;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.file.metadata.IDeviceID.Factory;
 import org.apache.tsfile.file.metadata.TableSchema;
 import org.apache.tsfile.fileSystem.FSFactoryProducer;
 import org.apache.tsfile.fileSystem.FSType;
@@ -186,6 +189,7 @@ import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -2762,8 +2766,10 @@ public class DataRegion implements IDataRegionForQuery {
         }
       }
 
-      if (TierManager.getInstance().checkObjectPathExist(dataRegionIdString, tableName)) {
-        deleteObjectFiles(tableName, modEntries);
+      List<File> matchedObjectDirs =
+          TierManager.getInstance().getAllMatchedObjectDirs(dataRegionIdString, tableName);
+      if (!matchedObjectDirs.isEmpty()) {
+        deleteObjectFiles(matchedObjectDirs, modEntries);
       }
 
       List<List<TsFileResource>> sealedTsFileResourceLists = new ArrayList<>(modEntries.size());
@@ -2934,9 +2940,58 @@ public class DataRegion implements IDataRegionForQuery {
     return walFlushListeners;
   }
 
-  private void deleteObjectFiles(String tableName, List<TableDeletionEntry> modEntries) {
-    for (TableDeletionEntry modEntry : modEntries) {
-
+  private void deleteObjectFiles(List<File> matchedObjectDirs, List<TableDeletionEntry> modEntries)
+      throws IOException {
+    for (File matchedObjectDir : matchedObjectDirs) {
+      try (Stream<Path> paths = Files.walk(matchedObjectDir.toPath())) {
+        paths
+            .filter(Files::isRegularFile)
+            .filter(
+                path -> {
+                  String name = path.getFileName().toString();
+                  return name.endsWith(".bin");
+                })
+            .forEach(
+                path -> {
+                  Path relativePath = matchedObjectDir.getParentFile().toPath().relativize(path);
+                  String[] ideviceIdSegments = new String[relativePath.getNameCount() - 2];
+                  for (int i = 0; i < ideviceIdSegments.length; i++) {
+                    ideviceIdSegments[i] =
+                        config.getRestrictObjectLimit()
+                            ? relativePath.getName(i).toString()
+                            : new String(
+                                BaseEncoding.base32()
+                                    .omitPadding()
+                                    .decode(relativePath.getName(i).toString()),
+                                StandardCharsets.UTF_8);
+                  }
+                  IDeviceID iDeviceID = Factory.DEFAULT_FACTORY.create(ideviceIdSegments);
+                  String measurementId =
+                      config.getRestrictObjectLimit()
+                          ? relativePath.getName(relativePath.getNameCount() - 2).toString()
+                          : new String(
+                              BaseEncoding.base32()
+                                  .omitPadding()
+                                  .decode(
+                                      relativePath
+                                          .getName(relativePath.getNameCount() - 2)
+                                          .toString()),
+                              StandardCharsets.UTF_8);
+                  String fileName = path.getFileName().toString();
+                  long timestamp = Long.parseLong(fileName.substring(0, fileName.lastIndexOf('.')));
+                  logger.info(
+                      "timestamp {}, measurementId {}, ideviceId {}",
+                      timestamp,
+                      measurementId,
+                      iDeviceID);
+                  for (TableDeletionEntry modEntry : modEntries) {
+                    if (modEntry.affects(iDeviceID, timestamp, timestamp)
+                        && modEntry.affects(measurementId)) {
+                      ObjectTypeUtils.deleteObjectPath(path.toFile());
+                    }
+                  }
+                });
+      }
     }
   }
 
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
index e173bb0abaf..a673e44dff9 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/rescon/disk/TierManager.java
@@ -274,7 +274,8 @@ public class TierManager {
     return Optional.empty();
   }
 
-  public boolean checkObjectPathExist(String regionIdStr, String... path) {
+  public List<File> getAllMatchedObjectDirs(String regionIdStr, String... path) {
+    List<File> matchedDirs = new ArrayList<>();
     StringBuilder objectPath = new StringBuilder();
     objectPath.append(regionIdStr);
     for (String str : path) {
@@ -288,12 +289,13 @@ public class TierManager {
                       .encode(str.getBytes(StandardCharsets.UTF_8)));
     }
     for (String objectDir : objectDirs) {
-      File objectFilePath = FSFactoryProducer.getFSFactory().getFile(objectDir, objectPath.toString());
+      File objectFilePath =
+          FSFactoryProducer.getFSFactory().getFile(objectDir, objectPath.toString());
       if (objectFilePath.exists()) {
-        return true;
+        matchedDirs.add(objectFilePath);
       }
     }
-    return false;
+    return matchedDirs;
   }
 
   public int getTiersNum() {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
index aebcaf9a4dd..f09d4472cd3 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ObjectTypeUtils.java
@@ -296,6 +296,27 @@ public class ObjectTypeUtils {
     }
   }
 
+  public static void deleteObjectPath(File file) {
+    File tmpFile = new File(file.getPath() + ".tmp");
+    File bakFile = new File(file.getPath() + ".back");
+    for (int i = 0; i < 2; i++) {
+      if (file.exists()) {
+        FileMetrics.getInstance().decreaseObjectFileNum(1);
+        FileMetrics.getInstance().decreaseObjectFileSize(file.length());
+      }
+      try {
+        deleteObjectFile(file);
+        deleteObjectFile(tmpFile);
+        deleteObjectFile(bakFile);
+      } catch (IOException e) {
+        logger.error("Failed to remove object file {}", file.getAbsolutePath(), e);
+      }
+    }
+    if (file.getParentFile().exists()) {
+
+    }
+  }
+
   private static void deleteObjectFile(File file) throws IOException {
     if (file.exists()) {
       logger.info("Remove object file {}, size is {}(byte)", file.getAbsolutePath(), file.length());