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

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


The following commit(s) were added to refs/heads/object_type by this push:
     new 618120aff09 add getAbsoluteObjectFilePath method
618120aff09 is described below

commit 618120aff094959137165edb539e2f8f387fdeea
Author: HTHou <hao...@apache.org>
AuthorDate: Mon Jul 7 17:55:55 2025 +0800

    add getAbsoluteObjectFilePath method
---
 .../main/java/org/apache/iotdb/ObjectExample.java  |   6 +-
 .../plan/planner/plan/node/PlanNodeType.java       |   6 +
 .../plan/planner/plan/node/write/FileNode.java     | 191 ++++++++++++++-------
 .../node/write/RelationalInsertTabletNode.java     |   1 +
 .../dataregion/memtable/TsFileProcessor.java       |  14 +-
 .../dataregion/wal/buffer/WALEntry.java            |   6 +
 .../dataregion/wal/buffer/WALEntryType.java        |   3 +-
 .../dataregion/wal/buffer/WALInfoEntry.java        |   4 +
 .../dataregion/wal/node/IWALNode.java              |   3 +
 .../dataregion/wal/node/WALFakeNode.java           |   6 +
 .../storageengine/dataregion/wal/node/WALNode.java |   7 +
 .../file/UnsealedTsFileRecoverPerformer.java       |   2 +
 .../db/storageengine/rescon/disk/TierManager.java  |  11 ++
 13 files changed, 192 insertions(+), 68 deletions(-)

diff --git a/example/session/src/main/java/org/apache/iotdb/ObjectExample.java 
b/example/session/src/main/java/org/apache/iotdb/ObjectExample.java
index 8017061114f..b040dc5313b 100644
--- a/example/session/src/main/java/org/apache/iotdb/ObjectExample.java
+++ b/example/session/src/main/java/org/apache/iotdb/ObjectExample.java
@@ -82,8 +82,7 @@ public class ObjectExample {
           true,
           0,
           Files.readAllBytes(
-              Paths.get(
-                  
"/Users/jackietien/Downloads/2_1746622362350_fa24aa15233f4e76bcda789a5771f43f")));
+              
Paths.get("/Users/ht/Downloads/2_1746622362350_fa24aa15233f4e76bcda789a5771f43f")));
       session.insert(tablet);
       tablet.reset();
 
@@ -100,8 +99,7 @@ public class ObjectExample {
           true,
           0,
           Files.readAllBytes(
-              Paths.get(
-                  
"/Users/jackietien/Downloads/2_1746622367063_8fb5ac8e21724140874195b60b878664")));
+              
Paths.get("/Users/ht/Downloads/2_1746622367063_8fb5ac8e21724140874195b60b878664")));
       session.insert(tablet);
       tablet.reset();
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
index 2f157a9086c..f227429c5b3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/PlanNodeType.java
@@ -106,6 +106,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.ShowQueries
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.TimeseriesRegionScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.ContinuousSameSearchIndexSeparatorNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertMultiTabletsNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
@@ -312,6 +313,7 @@ public enum PlanNodeType {
   RELATIONAL_INSERT_ROW((short) 2001),
   RELATIONAL_INSERT_ROWS((short) 2002),
   RELATIONAL_DELETE_DATA((short) 2003),
+  OBJECT_FILE_NODE((short) 2004),
   ;
 
   public static final int BYTES = Short.BYTES;
@@ -355,6 +357,8 @@ public enum PlanNodeType {
         return RelationalInsertRowsNode.deserializeFromWAL(stream);
       case 2003:
         return RelationalDeleteDataNode.deserializeFromWAL(stream);
+      case 2004:
+        return FileNode.deserializeFromWAL(stream);
       default:
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
@@ -381,6 +385,8 @@ public enum PlanNodeType {
         return RelationalInsertRowsNode.deserializeFromWAL(buffer);
       case 2003:
         return RelationalDeleteDataNode.deserializeFromWAL(buffer);
+      case 2004:
+        return FileNode.deserializeFromWAL(buffer);
       default:
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/FileNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/FileNode.java
index e91869e7e0b..55fbf337d39 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/FileNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/FileNode.java
@@ -19,8 +19,27 @@
 
 package org.apache.iotdb.db.queryengine.plan.planner.plan.node.write;
 
+import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.commons.consensus.index.ProgressIndex;
+import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
+import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
+import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
+
+import org.apache.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
 // TODO:[OBJECT] WAL serde
-public class FileNode {
+public class FileNode extends SearchNode implements WALEntryValue {
 
   private final boolean isEOF;
 
@@ -31,11 +50,19 @@ public class FileNode {
   private String filePath;
 
   public FileNode(boolean isEOF, long offset, byte[] content) {
+    super(new PlanNodeId(""));
     this.isEOF = isEOF;
     this.offset = offset;
     this.content = content;
   }
 
+  public FileNode(boolean isEOF, long offset, String filePath) {
+    super(new PlanNodeId(""));
+    this.isEOF = isEOF;
+    this.offset = offset;
+    this.filePath = filePath;
+  }
+
   public boolean isEOF() {
     return isEOF;
   }
@@ -55,64 +82,106 @@ public class FileNode {
   public String getFilePath() {
     return filePath;
   }
-  //
-  //  @Override
-  //  public void serializeToWAL(IWALByteBufferView buffer) {}
-  //
-  //  @Override
-  //  public int serializedSize() {
-  //    return 0;
-  //  }
-  //
-  //  @Override
-  //  public SearchNode merge(List<SearchNode> searchNodes) {
-  //    return null;
-  //  }
-  //
-  //  @Override
-  //  public ProgressIndex getProgressIndex() {
-  //    return null;
-  //  }
-  //
-  //  @Override
-  //  public void setProgressIndex(ProgressIndex progressIndex) {}
-  //
-  //  @Override
-  //  public List<WritePlanNode> splitByPartition(IAnalysis analysis) {
-  //    return List.of();
-  //  }
-  //
-  //  @Override
-  //  public TRegionReplicaSet getRegionReplicaSet() {
-  //    return null;
-  //  }
-  //
-  //  @Override
-  //  public List<PlanNode> getChildren() {
-  //    return List.of();
-  //  }
-  //
-  //  @Override
-  //  public void addChild(PlanNode child) {}
-  //
-  //  @Override
-  //  public PlanNode clone() {
-  //    return null;
-  //  }
-  //
-  //  @Override
-  //  public int allowedChildCount() {
-  //    return 0;
-  //  }
-  //
-  //  @Override
-  //  public List<String> getOutputColumnNames() {
-  //    return List.of();
-  //  }
-  //
-  //  @Override
-  //  protected void serializeAttributes(ByteBuffer byteBuffer) {}
-  //
-  //  @Override
-  //  protected void serializeAttributes(DataOutputStream stream) throws 
IOException {}
+
+  @Override
+  public void serializeToWAL(IWALByteBufferView buffer) {
+    buffer.putShort(getType().getNodeType());
+    buffer.putLong(searchIndex);
+    buffer.put((byte) (isEOF ? 1 : 0));
+    buffer.putLong(offset);
+    WALWriteUtils.write(filePath, buffer);
+  }
+
+  @Override
+  public int serializedSize() {
+    return Short.BYTES
+        + Long.BYTES
+        + Byte.BYTES
+        + Long.BYTES
+        + ReadWriteIOUtils.sizeToWrite(filePath);
+  }
+
+  public static FileNode deserializeFromWAL(DataInputStream stream) throws 
IOException {
+    long searchIndex = stream.readLong();
+    boolean isEOF = stream.readByte() == 1;
+    long offset = stream.readLong();
+    String filePath = ReadWriteIOUtils.readString(stream);
+
+    FileNode fileNode = new FileNode(isEOF, offset, filePath);
+    fileNode.setSearchIndex(searchIndex);
+    return fileNode;
+  }
+
+  public static FileNode deserializeFromWAL(ByteBuffer buffer) {
+    long searchIndex = buffer.getLong();
+    boolean isEOF = buffer.get() == 1;
+    long offset = buffer.getLong();
+    String filePath = ReadWriteIOUtils.readString(buffer);
+
+    FileNode fileNode = new FileNode(isEOF, offset, filePath);
+    fileNode.setSearchIndex(searchIndex);
+    return fileNode;
+  }
+
+  @Override
+  public SearchNode merge(List<SearchNode> searchNodes) {
+    return null;
+  }
+
+  @Override
+  public ProgressIndex getProgressIndex() {
+    return null;
+  }
+
+  @Override
+  public void setProgressIndex(ProgressIndex progressIndex) {}
+
+  @Override
+  public List<WritePlanNode> splitByPartition(IAnalysis analysis) {
+    return null;
+  }
+
+  @Override
+  public TRegionReplicaSet getRegionReplicaSet() {
+    return null;
+  }
+
+  @Override
+  public List<PlanNode> getChildren() {
+    return null;
+  }
+
+  @Override
+  public void addChild(PlanNode child) {}
+
+  @Override
+  public PlanNode clone() {
+    return null;
+  }
+
+  @Override
+  public int allowedChildCount() {
+    return NO_CHILD_ALLOWED;
+  }
+
+  @Override
+  public List<String> getOutputColumnNames() {
+    return null;
+  }
+
+  @Override
+  protected void serializeAttributes(ByteBuffer byteBuffer) {}
+
+  @Override
+  protected void serializeAttributes(DataOutputStream stream) throws 
IOException {}
+
+  @Override
+  public PlanNodeType getType() {
+    return PlanNodeType.OBJECT_FILE_NODE;
+  }
+
+  @Override
+  public long getMemorySize() {
+    return super.getMemorySize();
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
index fe8940bd5da..68fb6c4fbe9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
@@ -409,6 +409,7 @@ public class RelationalInsertTabletNode extends 
InsertTabletNode {
           byte[] content = new byte[value.getLength() - 9];
           System.arraycopy(value.getValues(), 9, content, 0, value.getLength() 
- 9);
           FileNode fileNode = new FileNode(isEoF, offset, content);
+          fileNode.setSearchIndex(this.getSearchIndex());
           fileNodes.add(fileNode);
           ((Binary[]) columns[i])[j] = null;
         }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
index 4c4392178f9..5b4e09b0154 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/TsFileProcessor.java
@@ -568,9 +568,8 @@ public class TsFileProcessor {
       long[] infoForMetrics)
       throws WriteProcessException {
 
-    handleWriteObject(insertTabletNode, rangeList, results);
-
     ensureMemTable(infoForMetrics);
+    handleWriteObject(insertTabletNode, rangeList, results);
 
     long[] memIncrements =
         scheduleMemoryBlock(insertTabletNode, rangeList, results, noFailure, 
infoForMetrics);
@@ -2414,6 +2413,17 @@ public class TsFileProcessor {
               System.arraycopy(filePathBytes, 0, valueBytes, Long.BYTES, 
filePathBytes.length);
               (relationalInsertTabletNode.getObjectColumns().get(j))[i] = new 
Binary(valueBytes);
             }
+
+            WALFlushListener walFlushListener;
+            try {
+              walFlushListener = walNode.log(workMemTable.getMemTableId(), 
fileNode);
+              if (walFlushListener.waitForResult() == 
WALFlushListener.Status.FAILURE) {
+                throw walFlushListener.getCause();
+              }
+            } catch (Exception e) {
+              results[i] = 
RpcUtils.getStatus(TSStatusCode.INTERNAL_SERVER_ERROR, e.getMessage());
+              throw new WriteProcessException(e);
+            }
           }
         }
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntry.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntry.java
index 88cfb8b1564..af00ab29781 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntry.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntry.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.ContinuousSameSearchIndexSeparatorNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
@@ -77,6 +78,8 @@ public abstract class WALEntry implements SerializedSize {
       this.type = WALEntryType.CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE;
     } else if (value instanceof RelationalDeleteDataNode) {
       this.type = WALEntryType.RELATIONAL_DELETE_DATA_NODE;
+    } else if (value instanceof FileNode) {
+      this.type = WALEntryType.OBJECT_FILE_NODE;
     } else {
       throw new RuntimeException("Unknown WALEntry type");
     }
@@ -134,6 +137,9 @@ public abstract class WALEntry implements SerializedSize {
       case CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE:
         value = (ContinuousSameSearchIndexSeparatorNode) 
PlanNodeType.deserializeFromWAL(stream);
         break;
+      case OBJECT_FILE_NODE:
+        value = (FileNode) PlanNodeType.deserializeFromWAL(stream);
+        break;
       default:
         throw new RuntimeException("Unknown WALEntry type " + type);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntryType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntryType.java
index ac490699547..829affd1b4e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntryType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALEntryType.java
@@ -72,7 +72,8 @@ public enum WALEntryType {
         || this == INSERT_ROW_NODE
         || this == INSERT_ROWS_NODE
         || this == DELETE_DATA_NODE
-        || this == RELATIONAL_DELETE_DATA_NODE;
+        || this == RELATIONAL_DELETE_DATA_NODE
+        || this == OBJECT_FILE_NODE;
   }
 
   public static WALEntryType valueOf(byte code) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
index 6da50edba4f..edfdf0411a2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
@@ -21,6 +21,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer;
 
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
 import org.apache.iotdb.db.storageengine.dataregion.memtable.IMemTable;
@@ -89,6 +90,7 @@ public class WALInfoEntry extends WALEntry {
       case RELATIONAL_DELETE_DATA_NODE:
       case MEMORY_TABLE_SNAPSHOT:
       case CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE:
+      case OBJECT_FILE_NODE:
         value.serializeToWAL(buffer);
         break;
       case MEMORY_TABLE_CHECKPOINT:
@@ -166,6 +168,8 @@ public class WALInfoEntry extends WALEntry {
       case CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE:
       case MEMORY_TABLE_CHECKPOINT:
         return RamUsageEstimator.sizeOfObject(value);
+      case OBJECT_FILE_NODE:
+        return ((FileNode) value).getMemorySize();
       default:
         throw new RuntimeException("Unsupported wal entry type " + type);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/IWALNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/IWALNode.java
index 0d0e0a527f0..aa8959e5abf 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/IWALNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/IWALNode.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.consensus.iot.log.ConsensusReqReader;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.ContinuousSameSearchIndexSeparatorNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
@@ -54,6 +55,8 @@ public interface IWALNode extends FlushListener, 
AutoCloseable, ConsensusReqRead
   /** Log BatchDoneNode */
   WALFlushListener log(long memTableId, ContinuousSameSearchIndexSeparatorNode 
separatorNode);
 
+  WALFlushListener log(long memTableId, FileNode fileNode);
+
   /** Callback when memTable created. */
   void onMemTableCreated(IMemTable memTable, String targetTsFile);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALFakeNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALFakeNode.java
index c13e066415b..5a2cbbc12d2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALFakeNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALFakeNode.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.storageengine.dataregion.wal.node;
 
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.ContinuousSameSearchIndexSeparatorNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
@@ -82,6 +83,11 @@ public class WALFakeNode implements IWALNode {
     return getResult();
   }
 
+  @Override
+  public WALFlushListener log(long memTableId, FileNode fileNode) {
+    return getResult();
+  }
+
   private WALFlushListener getResult() {
     switch (status) {
       case SUCCESS:
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALNode.java
index 69af5d62162..56551e898aa 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/node/WALNode.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.ContinuousSameSearchIndexSeparatorNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.FileNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertRowsNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.InsertTabletNode;
@@ -192,6 +193,12 @@ public class WALNode implements IWALNode {
     return log(walEntry);
   }
 
+  @Override
+  public WALFlushListener log(long memTableId, FileNode fileNode) {
+    WALEntry walEntry = new WALInfoEntry(memTableId, fileNode);
+    return log(walEntry);
+  }
+
   private WALFlushListener log(WALEntry walEntry) {
 
     buffer.write(walEntry);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/UnsealedTsFileRecoverPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/UnsealedTsFileRecoverPerformer.java
index c955f67c79c..38935f9fd62 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/UnsealedTsFileRecoverPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/recover/file/UnsealedTsFileRecoverPerformer.java
@@ -223,6 +223,8 @@ public class UnsealedTsFileRecoverPerformer extends 
AbstractTsFileRecoverPerform
         case CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE:
           // The CONTINUOUS_SAME_SEARCH_INDEX_SEPARATOR_NODE doesn't need redo
           break;
+        case OBJECT_FILE_NODE:
+          break;
         default:
           throw new RuntimeException("Unsupported type " + walEntry.getType());
       }
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 75c5d3b3c96..9fd7d2fb94b 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
@@ -45,6 +45,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -251,6 +252,16 @@ public class TierManager {
     return objectDirs;
   }
 
+  public Optional<File> getAbsoluteObjectFilePath(String filePath) {
+    for (String objectDir : objectDirs) {
+      File objectFile = FSFactoryProducer.getFSFactory().getFile(objectDir, 
filePath);
+      if (objectFile.exists()) {
+        return Optional.of(objectFile);
+      }
+    }
+    return Optional.empty();
+  }
+
   public int getTiersNum() {
     return seqTiers.size();
   }

Reply via email to