You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2023/08/04 02:46:49 UTC

[iotdb] branch rel/1.2 updated: [IOTDB-6098] Fix a possible flush error when using aligned timeseries (#10769)

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

xingtanzjr pushed a commit to branch rel/1.2
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.2 by this push:
     new 3f27b70eba7 [IOTDB-6098] Fix a possible flush error when using aligned timeseries (#10769)
3f27b70eba7 is described below

commit 3f27b70eba7fec0161842c202f7e991c8cea07d4
Author: Haonan <hh...@outlook.com>
AuthorDate: Fri Aug 4 10:46:42 2023 +0800

    [IOTDB-6098] Fix a possible flush error when using aligned timeseries (#10769)
---
 .../db/it/aligned/IoTDBInsertAlignedValues2IT.java | 12 +++++
 .../iotdb/tsfile/write/page/TimePageWriter.java    |  4 +-
 .../tsfile/write/writer/TimeChunkWriterTest.java   | 55 ++++++++++++++++++++++
 3 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValues2IT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValues2IT.java
index 85a0e952394..331bd1cf3ff 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValues2IT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValues2IT.java
@@ -113,4 +113,16 @@ public class IoTDBInsertAlignedValues2IT {
       }
     }
   }
+
+  @Test
+  public void testInsertAlignedWithEmptyPage2() throws SQLException {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute("insert into root.sg.d1(time, s1,s2) aligned values(1,'aa','bb')");
+      statement.execute("insert into root.sg.d1(time, s1,s2) aligned values(1,'aa','bb')");
+      statement.execute("insert into root.sg.d1(time, s1,s2) aligned values(1,'aa','bb')");
+      statement.execute("flush");
+      statement.execute("insert into root.sg.d1(time, s1,s2) aligned values(1,'aa','bb')");
+    }
+  }
 }
diff --git a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/TimePageWriter.java b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/TimePageWriter.java
index a865feeb629..ccaaf72c27d 100644
--- a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/TimePageWriter.java
+++ b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/write/page/TimePageWriter.java
@@ -71,7 +71,9 @@ public class TimePageWriter {
     for (int i = arrayOffset; i < batchSize + arrayOffset; i++) {
       timeEncoder.encode(timestamps[i], timeOut);
     }
-    statistics.update(timestamps, batchSize, arrayOffset);
+    if (batchSize != 0) {
+      statistics.update(timestamps, batchSize, arrayOffset);
+    }
   }
 
   /** flush all data remained in encoders. */
diff --git a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
index 8978c2e25cc..e2457b44652 100644
--- a/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
+++ b/iotdb-core/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/TimeChunkWriterTest.java
@@ -107,4 +107,59 @@ public class TimeChunkWriterTest {
       fail();
     }
   }
+
+  @Test
+  public void testWrite3() {
+    Encoder timeEncoder = new PlainEncoder(TSDataType.INT64, 0);
+    TimeChunkWriter chunkWriter =
+        new TimeChunkWriter("c1", CompressionType.UNCOMPRESSED, TSEncoding.PLAIN, timeEncoder);
+    long[] times = new long[10];
+    for (int i = 0; i < 10; i++) {
+      times[i] = i + 1;
+    }
+    chunkWriter.write(times, 10, 0);
+    chunkWriter.sealCurrentPage();
+    for (int i = 0; i < 10; i++) {
+      times[i] = i + 11;
+    }
+    chunkWriter.write(times, 10, 0);
+    chunkWriter.sealCurrentPage();
+    assertEquals(2, chunkWriter.getNumOfPages());
+    // two pages with statistics size: (82 + 17) * 2 + chunk header size: 9
+    assertEquals(207L, chunkWriter.getCurrentChunkSize());
+
+    try {
+      TestTsFileOutput testTsFileOutput = new TestTsFileOutput();
+      TsFileIOWriter writer = new TsFileIOWriter(testTsFileOutput, true);
+      chunkWriter.writeAllPagesOfChunkToTsFile(writer);
+      PublicBAOS publicBAOS = testTsFileOutput.publicBAOS;
+      ByteBuffer buffer = ByteBuffer.wrap(publicBAOS.getBuf(), 0, publicBAOS.size());
+      assertEquals(MetaMarker.TIME_CHUNK_HEADER, ReadWriteIOUtils.readByte(buffer));
+      assertEquals("c1", ReadWriteIOUtils.readVarIntString(buffer));
+      assertEquals(198, ReadWriteForEncodingUtils.readUnsignedVarInt(buffer));
+      assertEquals(TSDataType.VECTOR.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(CompressionType.UNCOMPRESSED.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(TSEncoding.PLAIN.serialize(), ReadWriteIOUtils.readByte(buffer));
+      assertEquals(198, buffer.remaining());
+    } catch (IOException e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
+  @Test
+  public void testWriteEmptyPage() {
+    Encoder timeEncoder = new PlainEncoder(TSDataType.INT64, 0);
+    TimeChunkWriter chunkWriter =
+        new TimeChunkWriter("c1", CompressionType.UNCOMPRESSED, TSEncoding.PLAIN, timeEncoder);
+    long[] times = new long[10];
+    for (int i = 0; i < 10; i++) {
+      times[i] = i + 1;
+    }
+    chunkWriter.write(times, 10, 0);
+    chunkWriter.sealCurrentPage();
+    chunkWriter.write(times, 0, 0);
+    chunkWriter.sealCurrentPage();
+    assertEquals(1, chunkWriter.getNumOfPages());
+  }
 }