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 2020/04/27 06:44:08 UTC

[incubator-iotdb] branch TagUpsert created (now d6cc32c)

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

jackietien pushed a change to branch TagUpsert
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at d6cc32c  update inverted index map while delete storage group

This branch includes the following new commits:

     new d6cc32c  update inverted index map while delete storage group

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 01/01: update inverted index map while delete storage group

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d6cc32c8c0700ce93694d9ad67bec0baa027f23e
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Mon Apr 27 14:43:54 2020 +0800

    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 3deceb3..924effc 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"));
+    }
+  }
 }