This is an automated email from the ASF dual-hosted git repository.
shuwenwei 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 763fd09e103 fix bug
763fd09e103 is described below
commit 763fd09e10318eec21f1a858d2b6a52dcd559959
Author: shuwenwei <[email protected]>
AuthorDate: Wed Jul 9 12:29:39 2025 +0800
fix bug
---
.../plan/planner/plan/node/write/ObjectNode.java | 25 ++++++++++++++++
.../node/write/RelationalInsertTabletNode.java | 3 +-
.../db/storageengine/dataregion/DataRegion.java | 6 ++++
.../tsfile/generator/TsFileNameGenerator.java | 4 +--
.../compaction/CompactionDeleteObjectFileTest.java | 35 +++++++++++++++++++---
5 files changed, 66 insertions(+), 7 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/ObjectNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/ObjectNode.java
index 26897a126a4..a9d1ef456d0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/ObjectNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/ObjectNode.java
@@ -64,6 +64,10 @@ public class ObjectNode extends SearchNode implements
WALEntryValue {
private boolean isGeneratedByRemoteConsensusLeader;
+ private Long time = null;
+
+ private String table = null;
+
public ObjectNode(boolean isEOF, long offset, byte[] content, String
filePath) {
super(new PlanNodeId(""));
this.isEOF = isEOF;
@@ -81,6 +85,27 @@ public class ObjectNode extends SearchNode implements
WALEntryValue {
this.contentLength = contentLength;
}
+ public long getTimestamp() {
+ calculateTimeAndTableName();
+ return time;
+ }
+
+ public String getTable() {
+ calculateTimeAndTableName();
+ return table;
+ }
+
+ private void calculateTimeAndTableName() {
+ if (time != null && table != null) {
+ return;
+ }
+ File file = new File(filePath);
+ String fileName = new File(filePath).getName();
+ String timeStr = fileName.substring(0, fileName.length() -
".bin".length());
+ time = Long.parseLong(timeStr);
+ table =
file.getParentFile().getParentFile().getParentFile().getParentFile().getName();
+ }
+
public boolean isEOF() {
return isEOF;
}
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 2e113c5c28f..58047ca5664 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
@@ -410,7 +410,8 @@ public class RelationalInsertTabletNode extends
InsertTabletNode {
long offset = buffer.getLong();
byte[] content = ReadWriteIOUtils.readBytes(buffer,
buffer.remaining());
String relativePath =
- TsFileNameGenerator.generateObjectFilePath(times[j],
getDeviceID(j));
+ TsFileNameGenerator.generateObjectFilePath(
+ dataRegionReplicaSet.regionId.getId(), times[j],
getDeviceID(j));
ObjectNode objectNode = new ObjectNode(isEoF, offset, content,
relativePath);
objectNode.setDataRegionReplicaSet(entry.getKey());
result.add(objectNode);
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 7b378f6e58b..ddd56380a14 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
@@ -3030,6 +3030,12 @@ public class DataRegion implements IDataRegionForQuery {
}
public void writeObject(ObjectNode objectNode) throws Exception {
+ long ttl =
+ DataNodeTTLCache.getInstance().getTTLForTable(this.databaseName,
objectNode.getTable());
+ long nodeTimestamp = objectNode.getTimestamp();
+ if (!CommonUtils.isAlive(nodeTimestamp, ttl)) {
+ throw new OutOfTTLException(nodeTimestamp,
(CommonDateTimeUtils.currentTime() - ttl));
+ }
writeLock("writeObject");
try {
String relativeTmpPathString = objectNode.getFilePath() + ".tmp";
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java
index 4208d7f4092..4bcc46d1a01 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java
@@ -168,10 +168,10 @@ public class TsFileNameGenerator {
}
}
- public static String generateObjectFilePath(long time, IDeviceID iDeviceID) {
+ public static String generateObjectFilePath(int regionId, long time,
IDeviceID iDeviceID) {
String objectFileName = time + ".bin";
Object[] segments = iDeviceID.getSegments();
- StringBuilder relativePathString = new StringBuilder();
+ StringBuilder relativePathString = new StringBuilder(regionId +
"").append(File.separator);
for (Object segment : segments) {
relativePathString.append(segment.toString().toLowerCase()).append(File.separator);
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionDeleteObjectFileTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionDeleteObjectFileTest.java
index 2ff7b0b3ba4..a4b35c01da6 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionDeleteObjectFileTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionDeleteObjectFileTest.java
@@ -20,7 +20,11 @@
package org.apache.iotdb.db.storageengine.dataregion.compaction;
import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
+import org.apache.iotdb.commons.schema.table.column.TagColumnSchema;
import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
import
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.SettleCompactionTask;
import
org.apache.iotdb.db.storageengine.dataregion.modification.DeletionPredicate;
@@ -29,8 +33,11 @@ import
org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFil
import
org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.exception.write.WriteProcessException;
import org.apache.tsfile.file.metadata.StringArrayDeviceID;
+import org.apache.tsfile.file.metadata.enums.CompressionType;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.read.common.TimeRange;
import org.junit.After;
import org.junit.Before;
@@ -57,6 +64,7 @@ public class CompactionDeleteObjectFileTest extends
AbstractCompactionTest {
@Test
public void test1() throws IOException {
+ createTable("tsfile_table", 100);
File dir = new File("/Users/shuww/Downloads/0708/1_副本");
List<TsFileResource> resources = new ArrayList<>();
for (File file : dir.listFiles()) {
@@ -64,6 +72,7 @@ public class CompactionDeleteObjectFileTest extends
AbstractCompactionTest {
continue;
}
TsFileResource resource = new TsFileResource(file);
+
try (ModificationFile modificationFile = resource.getExclusiveModFile())
{
modificationFile.write(
new TableDeletionEntry(
@@ -72,15 +81,23 @@ public class CompactionDeleteObjectFileTest extends
AbstractCompactionTest {
new IDPredicate.FullExactMatch(
new StringArrayDeviceID(new String[] {"tsfile_table",
"1", "5", "3"})),
Arrays.asList("file")),
- new TimeRange(1, 20)));
+ new TimeRange(-1, 0)));
+ modificationFile.write(
+ new TableDeletionEntry(
+ new DeletionPredicate(
+ "tsfile_table",
+ new IDPredicate.FullExactMatch(
+ new StringArrayDeviceID(new String[] {"tsfile_table",
"1", "5", "3"})),
+ Arrays.asList("file")),
+ new TimeRange(2, 2)));
}
resource.deserialize();
resources.add(resource);
}
- // InnerSpaceCompactionTask task =
- // new InnerSpaceCompactionTask(
- // 0, tsFileManager, resources, true, new
ReadChunkCompactionPerformer(), 0);
+ // InnerSpaceCompactionTask task =
+ // new InnerSpaceCompactionTask(
+ // 0, tsFileManager, resources, true, new
ReadChunkCompactionPerformer(), 0);
SettleCompactionTask task =
new SettleCompactionTask(
0,
@@ -92,4 +109,14 @@ public class CompactionDeleteObjectFileTest extends
AbstractCompactionTest {
0);
task.start();
}
+
+ public void createTable(String tableName, long ttl) {
+ TsTable tsTable = new TsTable(tableName);
+ tsTable.addColumnSchema(new TagColumnSchema("id_column",
TSDataType.STRING));
+ tsTable.addColumnSchema(
+ new FieldColumnSchema("s1", TSDataType.STRING, TSEncoding.PLAIN,
CompressionType.LZ4));
+ tsTable.addProp(TsTable.TTL_PROPERTY, ttl + "");
+ DataNodeTableCache.getInstance().preUpdateTable("Downloads", tsTable,
null);
+ DataNodeTableCache.getInstance().commitUpdateTable("Downloads", tableName,
null);
+ }
}