You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/04/27 12:29:25 UTC

[incubator-iotdb] branch master updated: [IOTDB-619] Remove stale LeafMNodes in tag inverted index map while deleting storage group (#1106)

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

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new b7eeb44  [IOTDB-619] Remove stale LeafMNodes in tag inverted index map while deleting storage group (#1106)
b7eeb44 is described below

commit b7eeb44a7bdfdcf89d68d095fd4129c0770c0c07
Author: Jackie Tien <Ja...@foxmail.com>
AuthorDate: Mon Apr 27 20:29:14 2020 +0800

    [IOTDB-619] Remove stale LeafMNodes in tag inverted index map while deleting storage group (#1106)
    
    * update inverted index map while delete storage group
---
 .../org/apache/iotdb/db/metadata/MManager.java     | 11 ++++-
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 21 ++++++++-
 .../apache/iotdb/db/integration/IoTDBTagIT.java    | 55 ++++++++++++++++++----
 3 files changed, 77 insertions(+), 10 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 56d9177..f378135 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -421,6 +421,12 @@ public class MManager {
     if (tagMap != null) {
       for (Entry<String, String> entry : tagMap.entrySet()) {
         tagIndex.get(entry.getKey()).get(entry.getValue()).remove(node);
+        if (tagIndex.get(entry.getKey()).get(entry.getValue()).isEmpty()) {
+          tagIndex.get(entry.getKey()).remove(entry.getValue());
+          if (tagIndex.get(entry.getKey()).isEmpty()) {
+            tagIndex.remove(entry.getKey());
+          }
+        }
       }
     }
   }
@@ -502,7 +508,10 @@ public class MManager {
     try {
       for (String storageGroup : storageGroups) {
         // try to delete storage group
-        mtree.deleteStorageGroup(storageGroup);
+        List<LeafMNode> leafMNodes = mtree.deleteStorageGroup(storageGroup);
+        for (LeafMNode leafMNode : leafMNodes) {
+          removeFromTagInvertedIndex(leafMNode);
+        }
         mNodeCache.clear();
 
         if (config.isEnableParameterAdapter()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index 7acaf4b..ffa7bbb 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -30,9 +30,11 @@ import java.util.ArrayList;
 import java.util.Deque;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Queue;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.regex.Pattern;
@@ -209,7 +211,7 @@ public class MTree implements Serializable {
   }
 
   /** Delete a storage group */
-  void deleteStorageGroup(String path) throws MetadataException {
+  List<LeafMNode> deleteStorageGroup(String path) throws MetadataException {
     MNode cur = getNodeByPath(path);
     if (!(cur instanceof StorageGroupMNode)) {
       throw new StorageGroupNotSetException(path);
@@ -217,12 +219,29 @@ public class MTree implements Serializable {
     // Suppose current system has root.a.b.sg1, root.a.sg2, and delete root.a.b.sg1
     // delete the storage group node sg1
     cur.getParent().deleteChild(cur.getName());
+
+    // collect all the LeafMNode in this storage group
+    List<LeafMNode> leafMNodes = new LinkedList<>();
+    Queue<MNode> queue = new LinkedList<>();
+    queue.add(cur);
+    while (!queue.isEmpty()) {
+      MNode node = queue.poll();
+      for (MNode child : node.getChildren().values()) {
+        if (child instanceof LeafMNode) {
+          leafMNodes.add((LeafMNode) child);
+        } else {
+          queue.add(child);
+        }
+      }
+    }
+
     cur = cur.getParent();
     // delete node b while retain root.a.sg2
     while (!IoTDBConstant.PATH_ROOT.equals(cur.getName()) && cur.getChildren().size() == 0) {
       cur.getParent().deleteChild(cur.getName());
       cur = cur.getParent();
     }
+    return leafMNodes;
   }
 
   /**
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
index 51d0080..99b4161 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
@@ -18,11 +18,9 @@
  */
 package org.apache.iotdb.db.integration;
 
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-import org.apache.iotdb.jdbc.Config;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
@@ -30,8 +28,11 @@ import java.sql.ResultSet;
 import java.sql.Statement;
 import java.util.HashSet;
 import java.util.Set;
-
-import static org.junit.Assert.*;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.Config;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 public class IoTDBTagIT {
 
@@ -835,7 +836,6 @@ public class IoTDBTagIT {
 
   @Test
   public void sameNameTest() throws ClassNotFoundException {
-    String[] ret = {"root.turbine.d1.s1,temperature,root.turbine,FLOAT,RLE,SNAPPY,v1,v2,v1,v2"};
     String sql = "create timeseries root.turbine.d1.s1(temperature) with datatype=FLOAT, encoding=RLE, compression=SNAPPY " +
             "tags(tag1=v1, tag2=v2) attributes(tag1=v1, attr2=v2)";
     Class.forName(Config.JDBC_DRIVER_NAME);
@@ -848,4 +848,43 @@ public class IoTDBTagIT {
       assertTrue(e.getMessage().contains("Tag and attribute shouldn't have the same property key"));
     }
   }
+
+  @Test
+  public void deleteStorageGroupTest() throws ClassNotFoundException {
+    String[] ret = {"root.turbine.d1.s1,temperature,root.turbine,FLOAT,RLE,SNAPPY,v1,v2,v1,v2"};
+
+    String sql = "create timeseries root.turbine.d1.s1(temperature) with datatype=FLOAT, encoding=RLE, compression=SNAPPY " +
+        "tags(tag1=v1, tag2=v2) attributes(attr1=v1, attr2=v2)";
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    try (Connection connection = DriverManager
+        .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      statement.execute(sql);
+      boolean hasResult = statement.execute("show timeseries");
+      assertTrue(hasResult);
+      ResultSet resultSet = statement.getResultSet();
+      int count = 0;
+      while (resultSet.next()) {
+        String ans = resultSet.getString("timeseries")
+            + "," + resultSet.getString("alias")
+            + "," + resultSet.getString("storage group")
+            + "," + resultSet.getString("dataType")
+            + "," + resultSet.getString("encoding")
+            + "," + resultSet.getString("compression")
+            + "," + resultSet.getString("attr1")
+            + "," + resultSet.getString("attr2")
+            + "," + resultSet.getString("tag1")
+            + "," + resultSet.getString("tag2");
+        assertEquals(ret[count], ans);
+        count++;
+      }
+      assertEquals(ret.length, count);
+
+      statement.execute("delete storage group root.turbine");
+      statement.execute("show timeseries where tag1=v1");
+      fail();
+    } catch (Exception e) {
+      assertTrue(e.getMessage().contains("The key tag1 is not a tag"));
+    }
+  }
 }