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