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

haonan pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new c8a2204  [IOTDB-1556] Abort auto create device while setStorageGroup 
exception (#3707)
c8a2204 is described below

commit c8a2204c185a72b5602beebe2955ecce030a6ef9
Author: zyk990424 <[email protected]>
AuthorDate: Tue Aug 10 14:51:10 2021 +0800

    [IOTDB-1556] Abort auto create device while setStorageGroup exception 
(#3707)
---
 .../metadata/StorageGroupAlreadySetException.java  |  7 +++++++
 .../org/apache/iotdb/db/metadata/MManager.java     |  5 +++++
 .../iotdb/db/metadata/MManagerBasicTest.java       | 24 ++++++++++++++++++++++
 3 files changed, 36 insertions(+)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/exception/metadata/StorageGroupAlreadySetException.java
 
b/server/src/main/java/org/apache/iotdb/db/exception/metadata/StorageGroupAlreadySetException.java
index 4222489..bcf8970 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/exception/metadata/StorageGroupAlreadySetException.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/exception/metadata/StorageGroupAlreadySetException.java
@@ -25,12 +25,19 @@ public class StorageGroupAlreadySetException extends 
MetadataException {
 
   private static final long serialVersionUID = 9110669164701929779L;
 
+  private boolean hasChild = false;
+
   public StorageGroupAlreadySetException(String path) {
     super(getMessage(path, false), 
TSStatusCode.PATH_ALREADY_EXIST_ERROR.getStatusCode());
   }
 
   public StorageGroupAlreadySetException(String path, boolean hasChild) {
     super(getMessage(path, hasChild), 
TSStatusCode.PATH_ALREADY_EXIST_ERROR.getStatusCode());
+    this.hasChild = hasChild;
+  }
+
+  public boolean isHasChild() {
+    return hasChild;
   }
 
   private static String getMessage(String path, boolean hasChild) {
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 06ab615..4de8eb2 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
@@ -1098,6 +1098,11 @@ public class MManager {
       }
       return node;
     } catch (StorageGroupAlreadySetException e) {
+      if (e.isHasChild()) {
+        // if setStorageGroup failure is because of child, the deviceNode 
should not be created.
+        // Timeseries can't be create under a deviceNode without storageGroup.
+        throw e;
+      }
       // ignore set storage group concurrently
       node = mtree.getDeviceNodeWithAutoCreating(path, sgLevel);
       if (!(node.left instanceof StorageGroupMNode)) {
diff --git 
a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java 
b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index 925f2bf..4d30bab 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -1331,4 +1331,28 @@ public class MManagerBasicTest {
     return new CreateTemplatePlan(
         "template1", schemaNames, measurementList, dataTypeList, encodingList, 
compressionTypes);
   }
+
+  @Test
+  public void testDeviceNodeAfterAutoCreateTimeseriesFailure() throws 
Exception {
+    MManager manager = IoTDB.metaManager;
+
+    PartialPath sg1 = new PartialPath("root.a.sg");
+    manager.setStorageGroup(sg1);
+
+    PartialPath deviceId = new PartialPath("root.a.d");
+    String[] measurementList = {"s"};
+    String[] values = {"1"};
+    MeasurementMNode[] measurementMNodes = new MeasurementMNode[1];
+    InsertPlan insertPlan = new InsertRowPlan(deviceId, 1L, measurementList, 
values);
+    insertPlan.setMeasurementMNodes(measurementMNodes);
+
+    try {
+      manager.getSeriesSchemasAndReadLockDevice(insertPlan);
+      fail();
+    } catch (MetadataException e) {
+      Assert.assertEquals(
+          "some children of root.a have already been set to storage group", 
e.getMessage());
+      Assert.assertFalse(manager.isPathExist(new PartialPath("root.a.d")));
+    }
+  }
 }

Reply via email to