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 <[email protected]> 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")); + } + } }
