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(); }