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