You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/01/10 01:30:18 UTC

[iotdb] branch master updated: [IOTDB-2301] Fix IndexOutOfBoundException when delete aligned values (#4730)

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

jackietien 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 3334c53  [IOTDB-2301] Fix IndexOutOfBoundException when delete aligned values (#4730)
3334c53 is described below

commit 3334c532d54e3ad8530bb834ce1bad5d0b9006a7
Author: Haonan <hh...@outlook.com>
AuthorDate: Mon Jan 10 09:29:43 2022 +0800

    [IOTDB-2301] Fix IndexOutOfBoundException when delete aligned values (#4730)
---
 .../iotdb/db/integration/IoTDBDeletionIT.java      | 27 +++++++++++++++++++
 .../db/integration/aligned/IoTDBDeletionIT.java    | 31 ++++++++++++++++++++++
 .../engine/memtable/AlignedWritableMemChunk.java   | 12 +++------
 .../memtable/AlignedWritableMemChunkGroup.java     |  7 +++--
 .../db/utils/datastructure/AlignedTVList.java      | 17 ++++++------
 5 files changed, 76 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..f411622 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,37 @@ 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);
+      }
+      statement.execute("flush");
+    }
+  }
+
   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..adcf172 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.emptyMap();
+    }
     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;