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 392b64e [IOTDB-738] Fix measurements has blank (#1308)
392b64e is described below
commit 392b64e756ec24f7403d2f966561278ce10417ad
Author: Jialin Qiao <[email protected]>
AuthorDate: Wed Jun 3 18:10:12 2020 +0800
[IOTDB-738] Fix measurements has blank (#1308)
* fix auto create InternalMNode for sg
* fix do not trim measurement
---
.../iotdb/db/engine/memtable/AbstractMemTable.java | 2 +-
.../engine/storagegroup/StorageGroupProcessor.java | 6 ++--
.../org/apache/iotdb/db/metadata/MManager.java | 18 ++----------
.../java/org/apache/iotdb/db/metadata/MTree.java | 11 ++++++--
.../iotdb/db/metadata/mnode/InternalMNode.java | 6 ++--
.../apache/iotdb/db/metadata/mnode/LeafMNode.java | 8 +++++-
.../iotdb/db/metadata/mnode/StorageGroupMNode.java | 4 +--
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 32 ++++++++++------------
.../iotdb/db/qp/physical/crud/InsertPlan.java | 10 ++++---
.../db/qp/physical/crud/InsertTabletPlan.java | 6 ++--
.../org/apache/iotdb/db/service/TSServiceImpl.java | 3 +-
11 files changed, 53 insertions(+), 53 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index f5bfe5e..4629023 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -100,7 +100,7 @@ public abstract class AbstractMemTable implements IMemTable
{
public void insert(InsertPlan insertPlan) {
for (int i = 0; i < insertPlan.getValues().length; i++) {
- if (insertPlan.getSchemas()[i] == null) {
+ if (insertPlan.getValues()[i] == null) {
continue;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 6d8a3fe..dabc095 100755
---
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -768,7 +768,7 @@ public class StorageGroupProcessor {
String[] measurementList = plan.getMeasurements();
for (int i = 0; i < measurementList.length; i++) {
// Update cached last value with high priority
- ((LeafMNode) manager.getChild(node, measurementList[i],
plan.getDeviceId()))
+ ((LeafMNode) node.getChild(measurementList[i]))
.updateCachedLast(plan.composeLastTimeValuePair(i), true,
latestFlushedTime);
}
} catch (MetadataException e) {
@@ -819,11 +819,11 @@ public class StorageGroupProcessor {
node =
manager.getDeviceNodeWithAutoCreateAndReadLock(plan.getDeviceId());
String[] measurementList = plan.getMeasurements();
for (int i = 0; i < measurementList.length; i++) {
- if (plan.getSchemas()[i] == null) {
+ if (plan.getValues()[i] == null) {
continue;
}
// Update cached last value with high priority
- ((LeafMNode) manager.getChild(node, measurementList[i],
plan.getDeviceId()))
+ ((LeafMNode) node.getChild(measurementList[i]))
.updateCachedLast(plan.composeTimeValuePair(i), true,
latestFlushedTime);
}
} catch (MetadataException e) {
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 e7ae081..0c48fe5 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
@@ -19,6 +19,7 @@
package org.apache.iotdb.db.metadata;
import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.conf.adapter.ActiveTimeSeriesCounter;
import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
@@ -863,19 +864,6 @@ public class MManager {
}
}
- public MNode getChild(MNode parent, String child, String info) {
- MNode childNode = parent.getChild(child);
- int tempCount = 0;
- while (childNode == null) {
- tempCount ++;
- if (tempCount % 10000 == 0) {
- logger.warn("try to get child {} 10000 times from {}", child, info);
- }
- childNode = parent.getChild(child);
- }
- return childNode;
- }
-
/**
* Get storage group node by path. If storage group is not set,
StorageGroupNotSetException will
* be thrown
@@ -928,11 +916,11 @@ public class MManager {
String storageGroupName = MetaUtils.getStorageGroupNameByLevel(path,
sgLevel);
setStorageGroup(storageGroupName);
}
- node = mtree.getDeviceNodeWithAutoCreating(path);
+ node = mtree.getDeviceNodeWithAutoCreating(path, sgLevel);
return node;
} catch (StorageGroupAlreadySetException e) {
// ignore set storage group concurrently
- node = mtree.getDeviceNodeWithAutoCreating(path);
+ node = mtree.getDeviceNodeWithAutoCreating(path, sgLevel);
return node;
} finally {
if (node != null) {
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 4551f0a..86134b3 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
@@ -138,7 +138,7 @@ public class MTree implements Serializable {
*
* <p>e.g., get root.sg.d1, get or create all internal nodes and return the
node of d1
*/
- MNode getDeviceNodeWithAutoCreating(String deviceId) throws
MetadataException {
+ MNode getDeviceNodeWithAutoCreating(String deviceId, int sgLevel) throws
MetadataException {
String[] nodeNames = MetaUtils.getNodeNames(deviceId);
if (nodeNames.length <= 1 || !nodeNames[0].equals(root.getName())) {
throw new IllegalPathException(deviceId);
@@ -146,7 +146,12 @@ public class MTree implements Serializable {
MNode cur = root;
for (int i = 1; i < nodeNames.length; i++) {
if (!cur.hasChild(nodeNames[i])) {
- cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
+ if (i == sgLevel) {
+ cur.addChild(nodeNames[i], new StorageGroupMNode(cur, nodeNames[i],
+ IoTDBDescriptor.getInstance().getConfig().getDefaultTTL()));
+ } else {
+ cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
+ }
}
cur = cur.getChild(nodeNames[i]);
}
@@ -205,7 +210,7 @@ public class MTree implements Serializable {
} else {
StorageGroupMNode storageGroupMNode =
new StorageGroupMNode(
- cur, nodeNames[i], path,
IoTDBDescriptor.getInstance().getConfig().getDefaultTTL());
+ cur, nodeNames[i],
IoTDBDescriptor.getInstance().getConfig().getDefaultTTL());
cur.addChild(nodeNames[i], storageGroupMNode);
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index 2d199cb..67c2537 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -18,9 +18,9 @@
*/
package org.apache.iotdb.db.metadata.mnode;
+import java.util.LinkedHashMap;
import org.apache.iotdb.db.exception.metadata.DeleteFailedException;
-import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@@ -49,7 +49,7 @@ public class InternalMNode extends MNode {
}
@Override
- public void addChild(String name, MNode child) {
+ public synchronized void addChild(String name, MNode child) {
children.put(name, child);
}
@@ -89,7 +89,7 @@ public class InternalMNode extends MNode {
}
@Override
- public MNode getChild(String name) {
+ public synchronized MNode getChild(String name) {
return children.containsKey(name) ? children.get(name) :
aliasChildren.get(name);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
index bb64a10..3f65929 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
@@ -26,9 +26,13 @@ import
org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
import java.util.Collections;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class LeafMNode extends MNode {
+ private static final Logger logger =
LoggerFactory.getLogger(LeafMNode.class);
+
private static final long serialVersionUID = -1199657856921206435L;
/**
@@ -73,7 +77,9 @@ public class LeafMNode extends MNode {
@Override
public MNode getChild(String name) {
- return null;
+ logger.warn("current node {} is a LeafMNode, can not get child {}",
super.name, name);
+ throw new RuntimeException(
+ String.format("current node %s is a LeafMNode, can not get child %s",
super.name, name));
}
@Override
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
index a122d95..02c668f 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/StorageGroupMNode.java
@@ -29,10 +29,10 @@ public class StorageGroupMNode extends InternalMNode {
private long dataTTL;
- public StorageGroupMNode(MNode parent, String name, String fullPath, long
dataTTL) {
+ public StorageGroupMNode(MNode parent, String name, long dataTTL) {
super(parent, name);
this.dataTTL = dataTTL;
- this.fullPath = fullPath;
+ this.fullPath = getFullPath();
}
public long getDataTTL() {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index dde4957..2358311 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -875,7 +875,7 @@ public class PlanExecutor implements IPlanExecutor {
MeasurementSchema[] schemas = new
MeasurementSchema[measurementList.length];
for (int i = 0; i < measurementList.length; i++) {
- String measurement = measurementList[i];
+ String measurement = measurementList[i].trim();
try {
if (!node.hasChild(measurement)) {
if
(!IoTDBDescriptor.getInstance().getConfig().isAutoCreateSchemaEnabled()) {
@@ -886,7 +886,7 @@ public class PlanExecutor implements IPlanExecutor {
Path path = new Path(deviceId, measurement);
internalCreateTimeseries(path.toString(), dataType);
}
- LeafMNode measurementNode = (LeafMNode)
MManager.getInstance().getChild(node, measurement, deviceId);
+ LeafMNode measurementNode = (LeafMNode) node.getChild(measurement);
schemas[i] = measurementNode.getSchema();
// reset measurement to common name instead of alias
@@ -977,10 +977,8 @@ public class PlanExecutor implements IPlanExecutor {
Collections.emptyMap());
} catch (PathAlreadyExistException e) {
if (logger.isDebugEnabled()) {
- logger.debug(
- "Ignore PathAlreadyExistException when Concurrent inserting"
- + " a non-exist time series {}",
- path);
+ logger.debug("Ignore PathAlreadyExistException when Concurrent
inserting"
+ + " a non-exist time series {}", path);
}
}
}
@@ -1020,31 +1018,31 @@ public class PlanExecutor implements IPlanExecutor {
IoTDBConfig conf = IoTDBDescriptor.getInstance().getConfig();
MeasurementSchema[] schemas = new
MeasurementSchema[measurementList.length];
+ String measurement;
for (int i = 0; i < measurementList.length; i++) {
+ measurement = measurementList[i].trim();
// check if timeseries exists
- if (!node.hasChild(measurementList[i])) {
+ if (!node.hasChild(measurement)) {
if (!conf.isAutoCreateSchemaEnabled()) {
- throw new QueryProcessException(
- String.format(
- "Current deviceId[%s] does not contain measurement:%s",
- deviceId, measurementList[i]));
+ throw new QueryProcessException(String.format(
+ "Current deviceId[%s] does not contain measurement:%s",
deviceId, measurement));
}
- Path path = new Path(deviceId, measurementList[i]);
+ Path path = new Path(deviceId, measurement);
TSDataType dataType = dataTypes[i];
internalCreateTimeseries(path.getFullPath(), dataType);
}
- LeafMNode measurementNode = (LeafMNode)
MManager.getInstance().getChild(node, measurementList[i], deviceId);
+ LeafMNode measurementNode = (LeafMNode) node.getChild(measurement);
// check data type
if (measurementNode.getSchema().getType() !=
insertTabletPlan.getDataTypes()[i]) {
- throw new QueryProcessException(
- String.format(
+ throw new QueryProcessException(String.format(
"Datatype mismatch, Insert measurement %s type %s, metadata
tree type %s",
- measurementList[i],
- insertTabletPlan.getDataTypes()[i],
+ measurement, insertTabletPlan.getDataTypes()[i],
measurementNode.getSchema().getType()));
}
schemas[i] = measurementNode.getSchema();
+ // reset measurement to common name instead of alias
+ measurementList[i] = measurementNode.getName();
}
insertTabletPlan.setSchemas(schemas);
return StorageEngine.getInstance().insertTablet(insertTabletPlan);
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
index c28095c..119cc53 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
@@ -188,6 +188,7 @@ public class InsertPlan extends PhysicalPlan {
measurements[i], values[i], types[i]);
if
(IoTDBDescriptor.getInstance().getConfig().isEnablePartialInsert()) {
markMeasurementInsertionFailed(i);
+ schemas[i] = null;
} else {
throw e;
}
@@ -204,7 +205,6 @@ public class InsertPlan extends PhysicalPlan {
failedMeasurements = new ArrayList<>();
}
failedMeasurements.add(measurements[index]);
- schemas[index] = null;
measurements[index] = null;
types[index] = null;
values[index] = null;
@@ -225,7 +225,7 @@ public class InsertPlan extends PhysicalPlan {
}
public void setDeviceId(String deviceId) {
- this.deviceId = deviceId;
+ this.deviceId = deviceId.trim();
}
public String[] getMeasurements() {
@@ -279,8 +279,10 @@ public class InsertPlan extends PhysicalPlan {
}
}
- for (MeasurementSchema schema : schemas) {
- schema.serializeTo(stream);
+ for (MeasurementSchema schema: schemas) {
+ if (schema != null) {
+ schema.serializeTo(stream);
+ }
}
try {
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
index 4fcd813..20ab59b 100644
---
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertTabletPlan.java
@@ -73,18 +73,18 @@ public class InsertTabletPlan extends PhysicalPlan {
public InsertTabletPlan(String deviceId, List<String> measurements) {
super(false, OperatorType.BATCHINSERT);
- this.deviceId = deviceId;
+ this.deviceId = deviceId.trim();
setMeasurements(measurements);
}
public InsertTabletPlan(String deviceId, String[] measurements) {
super(false, OperatorType.BATCHINSERT);
- this.deviceId = deviceId;
+ this.deviceId = deviceId.trim();
setMeasurements(measurements);
}
public InsertTabletPlan(String deviceId, String[] measurements,
List<Integer> dataTypes) {
super(false, OperatorType.BATCHINSERT);
- this.deviceId = deviceId;
+ this.deviceId = deviceId.trim();
this.measurements = measurements;
setDataTypes(dataTypes);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index 27cfd44..93d6770 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -1331,6 +1331,7 @@ public class TSServiceImpl implements TSIService.Iface,
ServerContext {
if (status != null) {
return status;
}
+ logger.info("createTimeseries {}", req.getPath());
return executePlan(plan);
}
@@ -1340,7 +1341,7 @@ public class TSServiceImpl implements TSIService.Iface,
ServerContext {
logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
return
RpcUtils.getTSBatchExecuteStatementResp(TSStatusCode.NOT_LOGIN_ERROR);
}
-
+ logger.info("createMultiTimeseries, first is {}", req.getPaths().get(0));
List<TSStatus> statusList = new ArrayList<>(req.paths.size());
for (int i = 0; i < req.paths.size(); i++) {
CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(new
Path(req.getPaths().get(i)),