You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ta...@apache.org on 2021/08/19 05:38:29 UTC
[iotdb] branch master updated: [IOTDB-1473] Fix the bug that run
SessionExample.java will be failed in (#3770)
This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 582e742 [IOTDB-1473] Fix the bug that run SessionExample.java will be failed in (#3770)
582e742 is described below
commit 582e742bbc8235514f1c5001019a1765edc37adb
Author: Jianyun Cheng <ch...@outlook.com>
AuthorDate: Thu Aug 19 13:38:07 2021 +0800
[IOTDB-1473] Fix the bug that run SessionExample.java will be failed in (#3770)
cluster mode. Root cause is auto create schema fail in cluster mode.
Co-authored-by: chengjianyun <ch...@360.cn>
---
.../iotdb/cluster/coordinator/Coordinator.java | 30 ++----------
.../cluster/server/member/DataGroupMember.java | 54 ++++++++++++++++++++++
2 files changed, 59 insertions(+), 25 deletions(-)
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
index aedb080..f4a28c2 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
@@ -461,20 +461,6 @@ public class Coordinator {
} else {
status = forwardToMultipleGroup(planGroupMap);
}
- boolean hasCreated = false;
- try {
- if (plan instanceof InsertPlan
- && status.getCode() == TSStatusCode.TIMESERIES_NOT_EXIST.getStatusCode()
- && ClusterDescriptor.getInstance().getConfig().isEnableAutoCreateSchema()) {
- hasCreated = createTimeseriesForFailedInsertion(((InsertPlan) plan));
- }
- } catch (MetadataException | CheckConsistencyException e) {
- logger.error("{}: Cannot auto-create timeseries for {}", name, plan, e);
- return StatusUtils.getStatus(StatusUtils.EXECUTE_STATEMENT_ERROR, e.getMessage());
- }
- if (hasCreated) {
- status = forwardPlan(planGroupMap, plan);
- }
if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
&& status.isSetRedirectNode()) {
status.setCode(TSStatusCode.NEED_REDIRECTION.getStatusCode());
@@ -483,15 +469,6 @@ public class Coordinator {
return status;
}
- private boolean createTimeseriesForFailedInsertion(InsertPlan plan)
- throws CheckConsistencyException, IllegalPathException {
- // try to create timeseries
- if (plan.getFailedMeasurements() != null) {
- plan.getPlanFromFailed();
- }
- return ((CMManager) IoTDB.metaManager).createTimeseries(plan);
- }
-
private TSStatus forwardToSingleGroup(Map.Entry<PhysicalPlan, PartitionGroup> entry) {
TSStatus result;
if (entry.getValue().contains(thisNode)) {
@@ -499,12 +476,15 @@ public class Coordinator {
long startTime =
Timer.Statistic.META_GROUP_MEMBER_EXECUTE_NON_QUERY_IN_LOCAL_GROUP
.getOperationStartTime();
- logger.debug(
- "Execute {} in a local group of {}", entry.getKey(), entry.getValue().getHeader());
result =
metaGroupMember
.getLocalDataMember(entry.getValue().getHeader())
.executeNonQueryPlan(entry.getKey());
+ logger.debug(
+ "Execute {} in a local group of {}, {}",
+ entry.getKey(),
+ entry.getValue().getHeader(),
+ result);
Timer.Statistic.META_GROUP_MEMBER_EXECUTE_NON_QUERY_IN_LOCAL_GROUP
.calOperationCostTimeFromStart(startTime);
} else {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
index 4b46e97..0cb09cf 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
@@ -47,6 +47,7 @@ import org.apache.iotdb.cluster.log.snapshot.FileSnapshot;
import org.apache.iotdb.cluster.log.snapshot.PartitionedSnapshot;
import org.apache.iotdb.cluster.log.snapshot.PullSnapshotTask;
import org.apache.iotdb.cluster.log.snapshot.PullSnapshotTaskDescriptor;
+import org.apache.iotdb.cluster.metadata.CMManager;
import org.apache.iotdb.cluster.partition.NodeAdditionResult;
import org.apache.iotdb.cluster.partition.NodeRemovalResult;
import org.apache.iotdb.cluster.partition.PartitionGroup;
@@ -79,16 +80,21 @@ import org.apache.iotdb.db.engine.StorageEngine;
import org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor.TimePartitionFilter;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.metadata.IllegalPathException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.exception.metadata.PathNotExistException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.exception.metadata.UndefinedTemplateException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.qp.executor.PlanExecutor;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertMultiTabletPlan;
import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
+import org.apache.iotdb.db.qp.physical.crud.InsertTabletPlan;
import org.apache.iotdb.db.qp.physical.sys.FlushPlan;
import org.apache.iotdb.db.qp.physical.sys.LogPlan;
import org.apache.iotdb.db.service.IoTDB;
import org.apache.iotdb.db.utils.TestOnly;
+import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.service.rpc.thrift.EndPoint;
import org.apache.iotdb.service.rpc.thrift.TSStatus;
import org.apache.iotdb.tsfile.utils.Pair;
@@ -709,6 +715,21 @@ public class DataGroupMember extends RaftMember {
return handleLogExecutionException(plan, IOUtils.getRootCause(ne));
}
}
+ if (cause instanceof PathNotExistException) {
+ boolean hasCreated = false;
+ try {
+ if (plan instanceof InsertPlan
+ && ClusterDescriptor.getInstance().getConfig().isEnableAutoCreateSchema()) {
+ hasCreated = createTimeseriesForFailedInsertion(((InsertPlan) plan));
+ }
+ } catch (MetadataException | CheckConsistencyException ex) {
+ logger.error("{}: Cannot auto-create timeseries for {}", name, plan, e);
+ return StatusUtils.getStatus(StatusUtils.EXECUTE_STATEMENT_ERROR, ex.getMessage());
+ }
+ if (hasCreated) {
+ return executeNonQueryPlan(plan);
+ }
+ }
return handleLogExecutionException(plan, cause);
}
} else {
@@ -751,6 +772,20 @@ public class DataGroupMember extends RaftMember {
if (character == NodeCharacter.LEADER) {
long startTime = Statistic.DATA_GROUP_MEMBER_LOCAL_EXECUTION.getOperationStartTime();
TSStatus status = processPlanLocally(plan);
+ boolean hasCreated = false;
+ try {
+ if (plan instanceof InsertPlan
+ && status.getCode() == TSStatusCode.TIMESERIES_NOT_EXIST.getStatusCode()
+ && ClusterDescriptor.getInstance().getConfig().isEnableAutoCreateSchema()) {
+ hasCreated = createTimeseriesForFailedInsertion(((InsertPlan) plan));
+ }
+ } catch (MetadataException | CheckConsistencyException e) {
+ logger.error("{}: Cannot auto-create timeseries for {}", name, plan, e);
+ return StatusUtils.getStatus(StatusUtils.EXECUTE_STATEMENT_ERROR, e.getMessage());
+ }
+ if (hasCreated) {
+ status = processPlanLocally(plan);
+ }
Statistic.DATA_GROUP_MEMBER_LOCAL_EXECUTION.calOperationCostTimeFromStart(startTime);
if (status != null) {
return status;
@@ -768,6 +803,25 @@ public class DataGroupMember extends RaftMember {
return StatusUtils.NO_LEADER;
}
+ private boolean createTimeseriesForFailedInsertion(InsertPlan plan)
+ throws CheckConsistencyException, IllegalPathException {
+ logger.info("create time series for failed insertion {}", plan);
+ // apply measurements according to failed measurements
+ if (plan instanceof InsertMultiTabletPlan) {
+ for (InsertTabletPlan insertPlan : ((InsertMultiTabletPlan) plan).getInsertTabletPlanList()) {
+ if (insertPlan.getFailedMeasurements() != null) {
+ insertPlan.getPlanFromFailed();
+ }
+ }
+ }
+
+ if (plan.getFailedMeasurements() != null) {
+ plan.getPlanFromFailed();
+ }
+
+ return ((CMManager) IoTDB.metaManager).createTimeseries(plan);
+ }
+
/**
* When the node does not play a member in a group any more, the corresponding local data should
* be removed.