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 6b3b6a540a4 Keep fieldless TableSchema during compaction (#18997)
6b3b6a540a4 is described below

commit 6b3b6a540a4ce57ea3ed550ecd2c930e0511194a
Author: Zhenyu Luo <[email protected]>
AuthorDate: Mon Oct 26 09:33:43 2026 +0800

    Keep fieldless TableSchema during compaction (#18997)
    
    A table-model TsFile may contain only TAG/TIME columns. Do not drop such a 
TableSchema during compaction: TIME still exists, and the schema is needed as 
the table-model marker. Track tables that wrote data in the target and only 
remove no-FIELD, no-TIME schemas of tables absent from that target.
---
 .../compaction/io/CompactionTsFileWriter.java      | 17 +++++++----
 .../CompactionTableModelTestFileWriter.java        | 33 ++++++++++++++++++++++
 .../utils/CompactionTestFileWriterTest.java        | 23 +++++++++++++++
 3 files changed, 68 insertions(+), 5 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
index 1f822e3b934..45adb94cf8f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/io/CompactionTsFileWriter.java
@@ -47,6 +47,7 @@ import java.io.Serializable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 public class CompactionTsFileWriter extends TsFileIOWriter {
   CompactionType type;
@@ -181,15 +182,21 @@ public class CompactionTsFileWriter extends 
TsFileIOWriter {
   }
 
   private void removeUnusedTableSchema() {
-    Map<String, TableSchema> tableSchemaMap = getSchema().getTableSchemaMap();
-    Iterator<Map.Entry<String, TableSchema>> iterator = 
tableSchemaMap.entrySet().iterator();
+    final Map<String, TableSchema> tableSchemaMap = 
getSchema().getTableSchemaMap();
+    final Iterator<Map.Entry<String, TableSchema>> iterator = 
tableSchemaMap.entrySet().iterator();
     while (iterator.hasNext()) {
-      Map.Entry<String, TableSchema> entry = iterator.next();
-      List<ColumnCategory> columnTypes = entry.getValue().getColumnTypes();
-      if (columnTypes.contains(ColumnCategory.FIELD)) {
+      final Map.Entry<String, TableSchema> entry = iterator.next();
+      final List<ColumnCategory> columnTypes = 
entry.getValue().getColumnTypes();
+      if (hasFieldOrTimeColumn(columnTypes)) {
         continue;
       }
       iterator.remove();
     }
   }
+
+  private boolean hasFieldOrTimeColumn(final List<ColumnCategory> columnTypes) 
{
+    return Objects.nonNull(columnTypes)
+        && (columnTypes.contains(ColumnCategory.FIELD)
+            || columnTypes.contains(ColumnCategory.TIME));
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tablemodel/CompactionTableModelTestFileWriter.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tablemodel/CompactionTableModelTestFileWriter.java
index f586f6a5473..39f0b909856 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tablemodel/CompactionTableModelTestFileWriter.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/tablemodel/CompactionTableModelTestFileWriter.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.storageengine.dataregion.compaction.tablemodel;
 
+import org.apache.iotdb.commons.utils.TestOnly;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionTableSchema;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.utils.CompactionTestFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
@@ -30,12 +31,15 @@ import org.apache.tsfile.file.metadata.StringArrayDeviceID;
 import org.apache.tsfile.file.metadata.TableSchema;
 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.apache.tsfile.write.chunk.AlignedChunkWriterImpl;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 import org.apache.tsfile.write.schema.Schema;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class CompactionTableModelTestFileWriter extends 
CompactionTestFileWriter {
@@ -61,6 +65,22 @@ public class CompactionTableModelTestFileWriter extends 
CompactionTestFileWriter
     schema.registerTableSchema(tableSchema);
   }
 
+  public void registerTableSchemaWithTagAndTime(String tableName, List<String> 
idColumnNames) {
+    List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
+    List<ColumnCategory> columnTypes = new ArrayList<>();
+    for (String idColumnName : idColumnNames) {
+      measurementSchemas.add(
+          new MeasurementSchema(
+              idColumnName, TSDataType.STRING, TSEncoding.PLAIN, 
CompressionType.UNCOMPRESSED));
+      columnTypes.add(ColumnCategory.TAG);
+    }
+    measurementSchemas.add(
+        new MeasurementSchema(
+            "time", TSDataType.INT64, TSEncoding.PLAIN, 
CompressionType.UNCOMPRESSED));
+    columnTypes.add(ColumnCategory.TIME);
+    schema.registerTableSchema(new TableSchema(tableName, measurementSchemas, 
columnTypes));
+  }
+
   public void registerTableSchemaWithTagField(String tableName, List<String> 
columnNames) {
     List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
     List<ColumnCategory> columnTypes = new ArrayList<>();
@@ -75,6 +95,19 @@ public class CompactionTableModelTestFileWriter extends 
CompactionTestFileWriter
     schema.registerTableSchema(new TableSchema(tableName, measurementSchemas, 
columnTypes));
   }
 
+  @TestOnly
+  public void generateTimeOnlyDataToCurrentDevice(TimeRange[] timeRanges) 
throws IOException {
+    for (TimeRange timeRange : timeRanges) {
+      AlignedChunkWriterImpl chunkWriter = new 
AlignedChunkWriterImpl(Collections.emptyList());
+      currentDeviceStartTime = Math.min(timeRange.getMin(), 
currentDeviceStartTime);
+      currentDeviceEndTime = Math.max(timeRange.getMax(), 
currentDeviceEndTime);
+      for (long time = timeRange.getMin(); time <= timeRange.getMax(); time++) 
{
+        chunkWriter.getTimeChunkWriter().write(time);
+      }
+      chunkWriter.writeToFileWriter(fileWriter);
+    }
+  }
+
   public IDeviceID startChunkGroup(String tableName, List<String> 
idColumnFields)
       throws IOException {
     int idx = 0;
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionTestFileWriterTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionTestFileWriterTest.java
index 70431d61f07..05f345b7bbc 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionTestFileWriterTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/utils/CompactionTestFileWriterTest.java
@@ -22,11 +22,14 @@ package 
org.apache.iotdb.db.storageengine.dataregion.compaction.utils;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.AbstractCompactionTest;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.tablemodel.CompactionTableModelTestFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 
+import org.apache.tsfile.enums.ColumnCategory;
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.read.TsFileSequenceReader;
 import org.apache.tsfile.read.common.TimeRange;
 import org.junit.After;
 import org.junit.Assert;
@@ -35,6 +38,7 @@ import org.junit.Test;
 
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.Collections;
 
 public class CompactionTestFileWriterTest extends AbstractCompactionTest {
   @Before
@@ -196,4 +200,23 @@ public class CompactionTestFileWriterTest extends 
AbstractCompactionTest {
       Assert.fail();
     }
   }
+
+  @Test
+  public void testFieldlessTableSchemaWithTimeDataIsRetained() throws 
IOException {
+    final TsFileResource resource = createEmptyFileAndResource(true);
+    try (final CompactionTableModelTestFileWriter writer =
+        new CompactionTableModelTestFileWriter(resource)) {
+      writer.registerTableSchemaWithTagAndTime("table1", 
Collections.singletonList("tag1"));
+      writer.startChunkGroup("table1", 
Collections.singletonList("tag1_value"));
+      writer.generateTimeOnlyDataToCurrentDevice(new TimeRange[] {new 
TimeRange(1, 3)});
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    try (final TsFileSequenceReader reader =
+        new TsFileSequenceReader(resource.getTsFile().getAbsolutePath())) {
+      Assert.assertTrue(reader.getTableSchemaMap().containsKey("table1"));
+      Assert.assertFalse(
+          
reader.getTableSchemaMap().get("table1").getColumnTypes().contains(ColumnCategory.FIELD));
+    }
+  }
 }

Reply via email to