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"));
+ }
+ }
}