You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/01/07 13:42:49 UTC
[iotdb] 01/01: [IOTDB-2301] Fix IndexOutOfBoundException when delete aligned values
This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch iotdb_2301
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 56934936ddd02c90107f848343bfd2083083dd7e
Author: HTHou <hh...@outlook.com>
AuthorDate: Fri Jan 7 21:41:51 2022 +0800
[IOTDB-2301] Fix IndexOutOfBoundException when delete aligned values
---
.../iotdb/db/integration/IoTDBDeletionIT.java | 27 +++++++++++++++++++
.../db/integration/aligned/IoTDBDeletionIT.java | 30 ++++++++++++++++++++++
.../engine/memtable/AlignedWritableMemChunk.java | 12 +++------
.../memtable/AlignedWritableMemChunkGroup.java | 7 +++--
.../db/utils/datastructure/AlignedTVList.java | 17 ++++++------
5 files changed, 75 insertions(+), 18 deletions(-)
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDeletionIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDeletionIT.java
index f5b8799..17389e0 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDeletionIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDeletionIT.java
@@ -396,6 +396,33 @@ public class IoTDBDeletionIT {
}
@Test
+ public void testDeleteAll() throws SQLException {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute("insert into root.lz.dev.GPS(time, latitude, longitude) values(9,3.2,9.8)");
+ statement.execute("insert into root.lz.dev.GPS(time, latitude) values(11,4.5)");
+
+ try (ResultSet resultSet = statement.executeQuery("select * from root.lz.dev.GPS")) {
+ int cnt = 0;
+ while (resultSet.next()) {
+ cnt++;
+ }
+ Assert.assertEquals(2, cnt);
+ }
+
+ statement.execute("delete from root.lz.**");
+
+ try (ResultSet resultSet = statement.executeQuery("select * from root.lz.dev.GPS")) {
+ int cnt = 0;
+ while (resultSet.next()) {
+ cnt++;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
+ @Test
@Category({ClusterTest.class})
public void testDelSeriesWithSpecialSymbol() throws SQLException {
try (Connection connection = EnvFactory.getEnv().getConnection();
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeletionIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeletionIT.java
index 38444a7..8a3c63c 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeletionIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IoTDBDeletionIT.java
@@ -451,6 +451,36 @@ public class IoTDBDeletionIT {
}
}
+ @Test
+ public void testDeleteAll() throws SQLException {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(
+ "CREATE ALIGNED TIMESERIES root.lz.dev.GPS(latitude FLOAT encoding=PLAIN compressor=SNAPPY, longitude FLOAT encoding=PLAIN compressor=SNAPPY)");
+ statement.execute(
+ "insert into root.lz.dev.GPS(time, latitude, longitude) aligned values(9,3.2,9.8)");
+ statement.execute("insert into root.lz.dev.GPS(time, latitude) aligned values(11,4.5)");
+
+ try (ResultSet resultSet = statement.executeQuery("select * from root.lz.dev.GPS")) {
+ int cnt = 0;
+ while (resultSet.next()) {
+ cnt++;
+ }
+ Assert.assertEquals(2, cnt);
+ }
+
+ statement.execute("delete from root.lz.**");
+
+ try (ResultSet resultSet = statement.executeQuery("select * from root.lz.dev.GPS")) {
+ int cnt = 0;
+ while (resultSet.next()) {
+ cnt++;
+ }
+ Assert.assertEquals(0, cnt);
+ }
+ }
+ }
+
private static void prepareSeries() {
String sq = null;
try (Connection connection = EnvFactory.getEnv().getConnection();
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
index 0723a4d..99edd4a 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunk.java
@@ -251,14 +251,10 @@ public class AlignedWritableMemChunk implements IWritableMemChunk {
return list.delete(lowerBound, upperBound, measurementIndexMap.get(measurementId));
}
- public void removeColumns(List<String> measurements) {
- List<IMeasurementSchema> schemasToBeRemoved = new ArrayList<>();
- for (String measurement : measurements) {
- schemasToBeRemoved.add(schemaList.get(measurementIndexMap.get(measurement)));
- }
- for (IMeasurementSchema schema : schemasToBeRemoved) {
- schemaList.remove(schema);
- }
+ public void removeColumn(String measurementId) {
+ list.deleteColumn(measurementIndexMap.get(measurementId));
+ IMeasurementSchema schemaToBeRemoved = schemaList.get(measurementIndexMap.get(measurementId));
+ schemaList.remove(schemaToBeRemoved);
measurementIndexMap.clear();
for (int i = 0; i < schemaList.size(); i++) {
measurementIndexMap.put(schemaList.get(i).getMeasurementId(), i);
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunkGroup.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunkGroup.java
index b19a59d..11f0853 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunkGroup.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AlignedWritableMemChunkGroup.java
@@ -71,6 +71,9 @@ public class AlignedWritableMemChunkGroup implements IWritableMemChunkGroup {
@Override
public Map<String, IWritableMemChunk> getMemChunkMap() {
+ if (memChunk.count() == 0) {
+ return Collections.EMPTY_MAP;
+ }
return Collections.singletonMap("", memChunk);
}
@@ -91,8 +94,8 @@ public class AlignedWritableMemChunkGroup implements IWritableMemChunkGroup {
}
}
}
- if (!columnsToBeRemoved.isEmpty()) {
- memChunk.removeColumns(columnsToBeRemoved);
+ for (String columnToBeRemoved : columnsToBeRemoved) {
+ memChunk.removeColumn(columnToBeRemoved);
}
return deletedPointsNumber;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
index f94ad83..6392ff9 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AlignedTVList.java
@@ -459,17 +459,18 @@ public class AlignedTVList extends TVList {
deleteColumn = false;
}
}
- if (deleteColumn) {
- dataTypes.remove(columnIndex);
- for (Object array : values.get(columnIndex)) {
- PrimitiveArrayManager.release(array);
- }
- values.remove(columnIndex);
- bitMaps.remove(columnIndex);
- }
return new Pair<>(deletedNumber, deleteColumn);
}
+ public void deleteColumn(int columnIndex) {
+ dataTypes.remove(columnIndex);
+ for (Object array : values.get(columnIndex)) {
+ PrimitiveArrayManager.release(array);
+ }
+ values.remove(columnIndex);
+ bitMaps.remove(columnIndex);
+ }
+
private void set(int index, long timestamp, int value) {
int arrayIndex = index / ARRAY_SIZE;
int elementIndex = index % ARRAY_SIZE;