This is an automated email from the ASF dual-hosted git repository.
justinchen 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 3731e34526d Optimized the error log for schema execution (#16982)
3731e34526d is described below
commit 3731e34526d0847145e2f45c88ef99a8ab1e82f9
Author: Caideyipi <[email protected]>
AuthorDate: Tue Jan 6 16:32:34 2026 +0800
Optimized the error log for schema execution (#16982)
---
.../main/java/org/apache/iotdb/rpc/RpcUtils.java | 12 +
.../schema/AlterEncodingCompressorProcedure.java | 8 +-
.../impl/schema/AlterLogicalViewProcedure.java | 10 +-
.../schema/AlterTimeSeriesDataTypeProcedure.java | 8 +-
.../impl/schema/DataNodeRegionTaskExecutor.java | 17 +-
.../impl/schema/DataNodeTSStatusTaskExecutor.java | 39 +++
.../impl/schema/DeactivateTemplateProcedure.java | 32 +--
.../impl/schema/DeleteLogicalViewProcedure.java | 32 +--
.../impl/schema/DeleteTimeSeriesProcedure.java | 25 +-
.../procedure/impl/schema/SchemaUtils.java | 12 +-
.../impl/schema/SetTemplateProcedure.java | 12 +-
.../impl/schema/table/DeleteDevicesProcedure.java | 96 ++++---
.../schema/DataNodeRegionTaskExecutorTest.java | 81 ++++++
.../schemaregion/SchemaExecutionVisitor.java | 86 ++++---
.../schemaregion/impl/SchemaRegionMemoryImpl.java | 2 +-
.../schemaregion/SchemaExecutionVisitorTest.java | 277 +++++++++++++++++++++
16 files changed, 581 insertions(+), 168 deletions(-)
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
index 7541f500e45..7a7c7a5ed44 100644
--- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
+++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
@@ -190,6 +190,18 @@ public class RpcUtils {
return status;
}
+ public static TSStatus extractFailureStatues(final TSStatus input) {
+ return input.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()
+ ? new TSStatus(input.getCode())
+ .setMessage(input.getMessage())
+ .setSubStatus(
+ input.getSubStatus().stream()
+ .filter(
+ status -> status.getCode() !=
TSStatusCode.SUCCESS_STATUS.getStatusCode())
+ .collect(Collectors.toList()))
+ : input;
+ }
+
/**
* Convert from {@link TSStatusCode} to {@link TSStatus}, which has message
appended with existing
* status message
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java
index 6f6d4b162d4..e9e257ac254 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterEncodingCompressorProcedure.java
@@ -41,6 +41,7 @@ import
org.apache.iotdb.consensus.exception.ConsensusException;
import org.apache.iotdb.db.exception.metadata.PathNotExistException;
import org.apache.iotdb.mpp.rpc.thrift.TAlterEncodingCompressorReq;
import org.apache.iotdb.pipe.api.exception.PipeException;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -51,7 +52,6 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -176,8 +176,6 @@ public class AlterEncodingCompressorProcedure
.setCompressor(compressor)
.setEncoding(encoding))) {
- private final Map<TDataNodeLocation, TSStatus> failureMap = new
HashMap<>();
-
@Override
protected List<TConsensusGroupId> processResponseOfOneDataNode(
final TDataNodeLocation dataNodeLocation,
@@ -203,7 +201,7 @@ public class AlterEncodingCompressorProcedure
failedRegionList.addAll(consensusGroupIdList);
}
if (!failedRegionList.isEmpty()) {
- failureMap.put(dataNodeLocation, response);
+ failureMap.put(dataNodeLocation,
RpcUtils.extractFailureStatues(response));
} else {
failureMap.remove(dataNodeLocation);
}
@@ -219,7 +217,7 @@ public class AlterEncodingCompressorProcedure
new MetadataException(
String.format(
"Alter encoding compressor %s in schema regions
failed. Failures: %s",
- requestMessage, failureMap))));
+ requestMessage, printFailureMap()))));
interruptTask();
}
};
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterLogicalViewProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterLogicalViewProcedure.java
index d600db8207d..cc41d941c20 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterLogicalViewProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterLogicalViewProcedure.java
@@ -59,6 +59,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.BiFunction;
+import java.util.stream.Collectors;
public class AlterLogicalViewProcedure
extends StateMachineProcedure<ConfigNodeProcedureEnv,
AlterLogicalViewState> {
@@ -72,6 +73,8 @@ public class AlterLogicalViewProcedure
private transient PathPatternTree pathPatternTree;
private transient ByteBuffer patternTreeBytes;
+ protected final Map<TDataNodeLocation, TSStatus> failureMap = new
HashMap<>();
+
public AlterLogicalViewProcedure(final boolean isGeneratedByPipe) {
super(isGeneratedByPipe);
}
@@ -390,11 +393,14 @@ public class AlterLogicalViewProcedure
new ProcedureException(
new MetadataException(
String.format(
- "Alter view %s failed when [%s] because failed to
execute in all replicaset of schemaRegion %s. Failure nodes: %s",
+ "Alter view %s failed when [%s] because failed to
execute in all replicaset of schemaRegion %s. Failure nodes: %s, statuses: %s",
viewPathToSourceMap.keySet(),
taskName,
consensusGroupId.id,
- dataNodeLocationSet))));
+ dataNodeLocationSet.stream()
+ .map(TDataNodeLocation::getDataNodeId)
+ .collect(Collectors.toSet()),
+ failureStatusList))));
interruptTask();
}
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterTimeSeriesDataTypeProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterTimeSeriesDataTypeProcedure.java
index e31d8a3bbd5..ccd83014f64 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterTimeSeriesDataTypeProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/AlterTimeSeriesDataTypeProcedure.java
@@ -42,6 +42,7 @@ import
org.apache.iotdb.db.exception.metadata.PathNotExistException;
import org.apache.iotdb.mpp.rpc.thrift.TAlterTimeSeriesReq;
import org.apache.iotdb.mpp.rpc.thrift.TInvalidateMatchedSchemaCacheReq;
import org.apache.iotdb.pipe.api.exception.PipeException;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.enums.TSDataType;
@@ -54,7 +55,6 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -195,8 +195,6 @@ public class AlterTimeSeriesDataTypeProcedure
ByteBuffer.wrap(stream.toByteArray()));
})) {
- private final Map<TDataNodeLocation, TSStatus> failureMap = new
HashMap<>();
-
@Override
protected List<TConsensusGroupId> processResponseOfOneDataNode(
final TDataNodeLocation dataNodeLocation,
@@ -221,7 +219,7 @@ public class AlterTimeSeriesDataTypeProcedure
failedRegionList.addAll(consensusGroupIdList);
}
if (!failedRegionList.isEmpty()) {
- failureMap.put(dataNodeLocation, response);
+ failureMap.put(dataNodeLocation,
RpcUtils.extractFailureStatues(response));
} else {
failureMap.remove(dataNodeLocation);
}
@@ -240,7 +238,7 @@ public class AlterTimeSeriesDataTypeProcedure
measurementPath.getFullPath(),
measurementPath.getSeriesType(),
dataType,
- failureMap))));
+ printFailureMap()))));
interruptTask();
}
};
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutor.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutor.java
index f632f5f1305..104128a0424 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutor.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutor.java
@@ -22,11 +22,13 @@ package org.apache.iotdb.confignode.procedure.impl.schema;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.confignode.client.async.CnToDnAsyncRequestType;
import
org.apache.iotdb.confignode.client.async.CnToDnInternalServiceAsyncRequestManager;
import
org.apache.iotdb.confignode.client.async.handlers.DataNodeAsyncRequestContext;
import org.apache.iotdb.confignode.manager.ConfigManager;
import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.rpc.TSStatusCode;
import java.util.ArrayList;
import java.util.HashMap;
@@ -35,6 +37,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiFunction;
+import java.util.stream.Collectors;
import static
org.apache.iotdb.confignode.procedure.impl.schema.DataNodeRegionGroupUtil.getAllReplicaDataNodeRegionGroupMap;
import static
org.apache.iotdb.confignode.procedure.impl.schema.DataNodeRegionGroupUtil.getLeaderDataNodeRegionGroupMap;
@@ -48,7 +51,7 @@ public abstract class DataNodeRegionTaskExecutor<Q, R> {
protected final CnToDnAsyncRequestType dataNodeRequestType;
protected final BiFunction<TDataNodeLocation, List<TConsensusGroupId>, Q>
dataNodeRequestGenerator;
-
+ protected final Map<TDataNodeLocation, TSStatus> failureMap = new
HashMap<>();
private boolean isInterrupted = false;
protected DataNodeRegionTaskExecutor(
@@ -229,4 +232,16 @@ public abstract class DataNodeRegionTaskExecutor<Q, R> {
*/
protected abstract void onAllReplicasetFailure(
final TConsensusGroupId consensusGroupId, final Set<TDataNodeLocation>
dataNodeLocationSet);
+
+ protected String printFailureMap() {
+ return failureMap.entrySet().stream()
+ .collect(
+ Collectors.toMap(
+ entry -> "DataNodeId: " + entry.getKey().getDataNodeId(),
+ entry ->
+ entry.getValue().getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()
+ ? entry.getValue().getSubStatus()
+ : entry.getValue()))
+ .toString();
+ }
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java
index 700cb3a9a49..37c93b3941d 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeTSStatusTaskExecutor.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.confignode.client.async.CnToDnAsyncRequestType;
import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import java.util.ArrayList;
@@ -34,6 +35,7 @@ import java.util.function.BiFunction;
public abstract class DataNodeTSStatusTaskExecutor<Q>
extends DataNodeRegionTaskExecutor<Q, TSStatus> {
+ protected List<TSStatus> successResult = new ArrayList<>();
protected DataNodeTSStatusTaskExecutor(
final ConfigNodeProcedureEnv env,
@@ -56,6 +58,7 @@ public abstract class DataNodeTSStatusTaskExecutor<Q>
final TSStatus response) {
final List<TConsensusGroupId> failedRegionList = new ArrayList<>();
if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ failureMap.remove(dataNodeLocation);
return failedRegionList;
}
@@ -69,6 +72,42 @@ public abstract class DataNodeTSStatusTaskExecutor<Q>
} else {
failedRegionList.addAll(consensusGroupIdList);
}
+ if (!failedRegionList.isEmpty()) {
+ failureMap.put(dataNodeLocation,
RpcUtils.extractFailureStatues(response));
+ } else {
+ failureMap.remove(dataNodeLocation);
+ }
+ return failedRegionList;
+ }
+
+ protected List<TConsensusGroupId>
processResponseOfOneDataNodeWithSuccessResult(
+ final TDataNodeLocation dataNodeLocation,
+ final List<TConsensusGroupId> consensusGroupIdList,
+ final TSStatus response) {
+ final List<TConsensusGroupId> failedRegionList = new ArrayList<>();
+ if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ successResult.add(response);
+ } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+ List<TSStatus> subStatusList = response.getSubStatus();
+ for (int i = 0; i < subStatusList.size(); i++) {
+ if (subStatusList.get(i).getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ successResult.add(subStatusList.get(i));
+ } else {
+ failedRegionList.add(consensusGroupIdList.get(i));
+ }
+ }
+ } else {
+ failedRegionList.addAll(consensusGroupIdList);
+ }
+ if (!failedRegionList.isEmpty()) {
+ failureMap.put(dataNodeLocation,
RpcUtils.extractFailureStatues(response));
+ } else {
+ failureMap.remove(dataNodeLocation);
+ }
return failedRegionList;
}
+
+ public List<TSStatus> getSuccessResult() {
+ return successResult;
+ }
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
index 0e4a17887c9..54249754d7e 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
@@ -143,7 +143,6 @@ public class DeactivateTemplateProcedure
if (targetSchemaRegionGroup.isEmpty()) {
return 0;
}
- List<TSStatus> successResult = new ArrayList<>();
DeactivateTemplateRegionTaskExecutor<TConstructSchemaBlackListWithTemplateReq>
constructBlackListTask =
new
DeactivateTemplateRegionTaskExecutor<TConstructSchemaBlackListWithTemplateReq>(
@@ -156,26 +155,11 @@ public class DeactivateTemplateProcedure
consensusGroupIdList, dataNodeRequest))) {
@Override
protected List<TConsensusGroupId> processResponseOfOneDataNode(
- TDataNodeLocation dataNodeLocation,
- List<TConsensusGroupId> consensusGroupIdList,
- TSStatus response) {
- List<TConsensusGroupId> failedRegionList = new ArrayList<>();
- if (response.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(response);
- } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
- List<TSStatus> subStatusList = response.getSubStatus();
- for (int i = 0; i < subStatusList.size(); i++) {
- if (subStatusList.get(i).getCode()
- == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(subStatusList.get(i));
- } else {
- failedRegionList.add(consensusGroupIdList.get(i));
- }
- }
- } else {
- failedRegionList.addAll(consensusGroupIdList);
- }
- return failedRegionList;
+ final TDataNodeLocation dataNodeLocation,
+ final List<TConsensusGroupId> consensusGroupIdList,
+ final TSStatus response) {
+ return processResponseOfOneDataNodeWithSuccessResult(
+ dataNodeLocation, consensusGroupIdList, response);
}
};
constructBlackListTask.execute();
@@ -185,7 +169,7 @@ public class DeactivateTemplateProcedure
}
long preDeletedNum = 0;
- for (TSStatus resp : successResult) {
+ for (TSStatus resp : constructBlackListTask.getSuccessResult()) {
preDeletedNum += Long.parseLong(resp.getMessage());
}
return preDeletedNum;
@@ -465,12 +449,12 @@ public class DeactivateTemplateProcedure
new ProcedureException(
new MetadataException(
String.format(
- "Deactivate template of %s failed when [%s] because
failed to execute in all replicaset of %s %s. Failure nodes: %s",
+ "Deactivate template of %s failed when [%s] because
failed to execute in all replicaset of %s %s. Failure: %s",
requestMessage,
taskName,
consensusGroupId.type,
consensusGroupId.id,
- dataNodeLocationSet))));
+ printFailureMap()))));
interruptTask();
}
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
index 1cfead14fcf..0c68fa62e18 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
@@ -53,7 +53,6 @@ import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -135,7 +134,6 @@ public class DeleteLogicalViewProcedure
if (targetSchemaRegionGroup.isEmpty()) {
return 0;
}
- List<TSStatus> successResult = new ArrayList<>();
DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq>
constructBlackListTask =
new
DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq>(
"construct view schema engine black list",
@@ -146,25 +144,11 @@ public class DeleteLogicalViewProcedure
new TConstructViewSchemaBlackListReq(consensusGroupIdList,
patternTreeBytes))) {
@Override
protected List<TConsensusGroupId> processResponseOfOneDataNode(
- TDataNodeLocation dataNodeLocation,
- List<TConsensusGroupId> consensusGroupIdList,
- TSStatus response) {
- List<TConsensusGroupId> failedRegionList = new ArrayList<>();
- if (response.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(response);
- } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
- List<TSStatus> subStatusList = response.getSubStatus();
- for (int i = 0; i < subStatusList.size(); i++) {
- if (subStatusList.get(i).getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(subStatusList.get(i));
- } else {
- failedRegionList.add(consensusGroupIdList.get(i));
- }
- }
- } else {
- failedRegionList.addAll(consensusGroupIdList);
- }
- return failedRegionList;
+ final TDataNodeLocation dataNodeLocation,
+ final List<TConsensusGroupId> consensusGroupIdList,
+ final TSStatus response) {
+ return processResponseOfOneDataNodeWithSuccessResult(
+ dataNodeLocation, consensusGroupIdList, response);
}
};
constructBlackListTask.execute();
@@ -173,7 +157,7 @@ public class DeleteLogicalViewProcedure
return 0;
}
- return successResult.stream()
+ return constructBlackListTask.getSuccessResult().stream()
.mapToLong(resp -> Long.parseLong(resp.getMessage()))
.reduce(0L, Long::sum);
}
@@ -357,8 +341,8 @@ public class DeleteLogicalViewProcedure
new ProcedureException(
new MetadataException(
String.format(
- "Delete view %s failed when [%s] because failed to
execute in all replicaset of schemaRegion %s. Failure nodes: %s",
- requestMessage, taskName, consensusGroupId.id,
dataNodeLocationSet))));
+ "Delete view %s failed when [%s] because failed to
execute in all replicaset of schemaRegion %s. Failures: %s",
+ requestMessage, taskName, consensusGroupId.id,
printFailureMap()))));
interruptTask();
}
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java
index c49f80948fc..a8f4b6d53c8 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteTimeSeriesProcedure.java
@@ -55,6 +55,7 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -153,7 +154,6 @@ public class DeleteTimeSeriesProcedure
return 0;
}
isAllLogicalView = true;
- final List<TSStatus> successResult = new ArrayList<>();
final DeleteTimeSeriesRegionTaskExecutor<TConstructSchemaBlackListReq>
constructBlackListTask =
new DeleteTimeSeriesRegionTaskExecutor<TConstructSchemaBlackListReq>(
"construct schema engine black list",
@@ -167,31 +167,20 @@ public class DeleteTimeSeriesProcedure
final TDataNodeLocation dataNodeLocation,
final List<TConsensusGroupId> consensusGroupIdList,
final TSStatus response) {
- final List<TConsensusGroupId> failedRegionList = new ArrayList<>();
if (response.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
isAllLogicalView = false;
- successResult.add(response);
} else if (response.getCode() ==
TSStatusCode.ONLY_LOGICAL_VIEW.getStatusCode()) {
successResult.add(response);
- } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
- final List<TSStatus> subStatusList = response.getSubStatus();
- for (int i = 0; i < subStatusList.size(); i++) {
- if (subStatusList.get(i).getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(subStatusList.get(i));
- } else {
- failedRegionList.add(consensusGroupIdList.get(i));
- }
- }
- } else {
- failedRegionList.addAll(consensusGroupIdList);
+ return Collections.emptyList();
}
- return failedRegionList;
+ return processResponseOfOneDataNodeWithSuccessResult(
+ dataNodeLocation, consensusGroupIdList, response);
}
};
constructBlackListTask.execute();
return !isFailed()
- ? successResult.stream()
+ ? constructBlackListTask.getSuccessResult().stream()
.mapToLong(resp -> Long.parseLong(resp.getMessage()))
.reduce(Long::sum)
.orElse(0L)
@@ -446,12 +435,12 @@ public class DeleteTimeSeriesProcedure
new ProcedureException(
new MetadataException(
String.format(
- "Delete time series %s failed when [%s] because failed
to execute in all replicaset of %s %s. Failure nodes: %s",
+ "Delete time series %s failed when [%s] because failed
to execute in all replicaset of %s %s. Failures: %s",
requestMessage,
taskName,
consensusGroupId.type,
consensusGroupId.id,
- dataNodeLocationSet))));
+ printFailureMap()))));
interruptTask();
}
}
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SchemaUtils.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SchemaUtils.java
index e2ab08e9366..f5dcae9e739 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SchemaUtils.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SchemaUtils.java
@@ -43,6 +43,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TCheckSchemaRegionUsingTemplateResp;
import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateResp;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateTableReq;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -182,6 +183,7 @@ public class SchemaUtils {
respList.add(response);
List<TConsensusGroupId> failedRegionList = new ArrayList<>();
if (response.getStatus().getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ failureMap.remove(dataNodeLocation);
return failedRegionList;
}
@@ -195,6 +197,12 @@ public class SchemaUtils {
} else {
failedRegionList.addAll(consensusGroupIdList);
}
+ if (!failedRegionList.isEmpty()) {
+ failureMap.put(
+ dataNodeLocation,
RpcUtils.extractFailureStatues(response.getStatus()));
+ } else {
+ failureMap.remove(dataNodeLocation);
+ }
return failedRegionList;
}
@@ -204,8 +212,8 @@ public class SchemaUtils {
exception[0] =
new MetadataException(
String.format(
- "Failed to execute in all replicaset of
schemaRegion %s when checking templates on path %s. Failure nodes: %s",
- consensusGroupId.id, deleteDatabasePatternPaths,
dataNodeLocationSet));
+ "Failed to execute in all replicaset of
schemaRegion %s when checking templates on path %s. Failures: %s",
+ consensusGroupId.id, deleteDatabasePatternPaths,
printFailureMap()));
interruptTask();
}
};
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
index 5509037c6fa..27ccd77b03a 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java
@@ -51,6 +51,7 @@ import
org.apache.iotdb.db.schemaengine.template.TemplateInternalRPCUtil;
import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq;
import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceResp;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateTemplateReq;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -293,6 +294,7 @@ public class SetTemplateProcedure
respList.add(response);
final List<TConsensusGroupId> failedRegionList = new
ArrayList<>();
if (response.getStatus().getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ failureMap.remove(dataNodeLocation);
return failedRegionList;
}
@@ -308,6 +310,12 @@ public class SetTemplateProcedure
} else {
failedRegionList.addAll(consensusGroupIdList);
}
+ if (!failedRegionList.isEmpty()) {
+ failureMap.put(
+ dataNodeLocation,
RpcUtils.extractFailureStatues(response.getStatus()));
+ } else {
+ failureMap.remove(dataNodeLocation);
+ }
return failedRegionList;
}
@@ -320,11 +328,11 @@ public class SetTemplateProcedure
new MetadataException(
String.format(
"Set template %s to %s failed when [check time
series existence on DataNode] because "
- + "failed to check time series existence
in all replicaset of schemaRegion %s. Failure nodes: %s",
+ + "failed to check time series existence
in all replicaset of schemaRegion %s. Failures: %s",
templateName,
templateSetPath,
consensusGroupId.id,
- dataNodeLocationSet))));
+ printFailureMap()))));
interruptTask();
}
};
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
index c093084e1e0..b78b99539ed 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DeleteDevicesProcedure.java
@@ -33,7 +33,7 @@ import
org.apache.iotdb.confignode.consensus.request.write.pipe.payload.PipeEnri
import org.apache.iotdb.confignode.manager.ClusterManager;
import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
-import
org.apache.iotdb.confignode.procedure.impl.schema.DataNodeRegionTaskExecutor;
+import
org.apache.iotdb.confignode.procedure.impl.schema.DataNodeTSStatusTaskExecutor;
import org.apache.iotdb.confignode.procedure.state.schema.DeleteDevicesState;
import org.apache.iotdb.confignode.procedure.store.ProcedureType;
import org.apache.iotdb.consensus.exception.ConsensusException;
@@ -162,64 +162,52 @@ public class DeleteDevicesProcedure extends
AbstractAlterOrDropTableProcedure<De
deletedDevicesNum = 0;
return;
}
- final List<TSStatus> successResult = new ArrayList<>();
- new
DataNodeRegionTaskExecutor<TTableDeviceDeletionWithPatternAndFilterReq,
TSStatus>(
- env,
- relatedSchemaRegionGroup,
- false,
- CnToDnAsyncRequestType.CONSTRUCT_TABLE_DEVICE_BLACK_LIST,
- ((dataNodeLocation, consensusGroupIdList) ->
- new TTableDeviceDeletionWithPatternAndFilterReq(
- new ArrayList<>(consensusGroupIdList),
- tableName,
- ByteBuffer.wrap(patternBytes),
- ByteBuffer.wrap(filterBytes)))) {
- @Override
- protected List<TConsensusGroupId> processResponseOfOneDataNode(
- final TDataNodeLocation dataNodeLocation,
- final List<TConsensusGroupId> consensusGroupIdList,
- final TSStatus response) {
- final List<TConsensusGroupId> failedRegionList = new ArrayList<>();
- if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode())
{
- successResult.add(response);
- } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
- final List<TSStatus> subStatusList = response.getSubStatus();
- for (int i = 0; i < subStatusList.size(); i++) {
- if (subStatusList.get(i).getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- successResult.add(subStatusList.get(i));
- } else {
- failedRegionList.add(consensusGroupIdList.get(i));
- }
- }
- } else {
- failedRegionList.addAll(consensusGroupIdList);
- }
- return failedRegionList;
- }
-
- @Override
- protected void onAllReplicasetFailure(
- final TConsensusGroupId consensusGroupId,
- final Set<TDataNodeLocation> dataNodeLocationSet) {
- setFailure(
- new ProcedureException(
- new MetadataException(
- String.format(
- "[%s] for %s.%s failed when construct black list for
table because failed to execute in all replicaset of %s %s. Failure nodes: %s",
- this.getClass().getSimpleName(),
- database,
+ final
DataNodeTSStatusTaskExecutor<TTableDeviceDeletionWithPatternAndFilterReq>
+ deleteDevicesExecutor =
+ new
DataNodeTSStatusTaskExecutor<TTableDeviceDeletionWithPatternAndFilterReq>(
+ env,
+ relatedSchemaRegionGroup,
+ false,
+ CnToDnAsyncRequestType.CONSTRUCT_TABLE_DEVICE_BLACK_LIST,
+ ((dataNodeLocation, consensusGroupIdList) ->
+ new TTableDeviceDeletionWithPatternAndFilterReq(
+ new ArrayList<>(consensusGroupIdList),
tableName,
- consensusGroupId.type,
- consensusGroupId.id,
- dataNodeLocationSet))));
- interruptTask();
- }
- }.execute();
+ ByteBuffer.wrap(patternBytes),
+ ByteBuffer.wrap(filterBytes)))) {
+ @Override
+ protected List<TConsensusGroupId> processResponseOfOneDataNode(
+ final TDataNodeLocation dataNodeLocation,
+ final List<TConsensusGroupId> consensusGroupIdList,
+ final TSStatus response) {
+ return processResponseOfOneDataNodeWithSuccessResult(
+ dataNodeLocation, consensusGroupIdList, response);
+ }
+
+ @Override
+ protected void onAllReplicasetFailure(
+ final TConsensusGroupId consensusGroupId,
+ final Set<TDataNodeLocation> dataNodeLocationSet) {
+ setFailure(
+ new ProcedureException(
+ new MetadataException(
+ String.format(
+ "[%s] for %s.%s failed when construct black
list for table because failed to execute in all replicaset of %s %s. Failures:
%s",
+ this.getClass().getSimpleName(),
+ database,
+ tableName,
+ consensusGroupId.type,
+ consensusGroupId.id,
+ printFailureMap()))));
+ interruptTask();
+ }
+ };
+ deleteDevicesExecutor.execute();
setNextState(CONSTRUCT_BLACK_LIST);
deletedDevicesNum =
!isFailed()
- ? successResult.stream()
+ ? deleteDevicesExecutor.getSuccessResult().stream()
.mapToLong(resp -> Long.parseLong(resp.getMessage()))
.reduce(Long::sum)
.orElse(0L)
diff --git
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutorTest.java
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutorTest.java
new file mode 100644
index 00000000000..d1286cc3587
--- /dev/null
+++
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/schema/DataNodeRegionTaskExecutorTest.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.procedure.impl.schema;
+
+import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
+import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
+import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.utils.StatusUtils;
+import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.TSStatusCode;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+
+public class DataNodeRegionTaskExecutorTest {
+
+ @Test
+ public void testPrintFailureMap() {
+ final TestRegionTaskExecutor executor = new TestRegionTaskExecutor();
+ executor.processResponseOfOneDataNode(
+ new TDataNodeLocation().setDataNodeId(0),
+ Collections.singletonList(new
TConsensusGroupId(TConsensusGroupType.DataRegion, 3)),
+ StatusUtils.OK);
+ executor.processResponseOfOneDataNode(
+ new TDataNodeLocation().setDataNodeId(0),
+ Arrays.asList(
+ new TConsensusGroupId(TConsensusGroupType.DataRegion, 1),
+ new TConsensusGroupId(TConsensusGroupType.DataRegion, 2)),
+ RpcUtils.getStatus(
+ Arrays.asList(
+ StatusUtils.OK, new
TSStatus(TSStatusCode.ILLEGAL_PATH.getStatusCode()))));
+ Assert.assertEquals("{DataNodeId: 0=[TSStatus(code:509)]}",
executor.printFailureMap());
+
+ executor.processResponseOfOneDataNodeWithSuccessResult(
+ new TDataNodeLocation().setDataNodeId(0),
+ Arrays.asList(
+ new TConsensusGroupId(TConsensusGroupType.DataRegion, 1),
+ new TConsensusGroupId(TConsensusGroupType.DataRegion, 2)),
+ RpcUtils.getStatus(
+ Arrays.asList(
+ StatusUtils.OK, new
TSStatus(TSStatusCode.ILLEGAL_PATH.getStatusCode()))));
+ Assert.assertTrue(StatusUtils.OK == executor.getSuccessResult().get(0));
+ }
+
+ private static class TestRegionTaskExecutor extends
DataNodeTSStatusTaskExecutor<Void> {
+
+ private TestRegionTaskExecutor() {
+ super(new ConfigNodeProcedureEnv(null, null), null, false, null, null);
+ }
+
+ @Override
+ protected void onAllReplicasetFailure(
+ final TConsensusGroupId consensusGroupId,
+ final Set<TDataNodeLocation> dataNodeLocationSet) {
+ interruptTask();
+ }
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
index de92827457a..261b4908a90 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitor.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.template.Template;
import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
import org.apache.iotdb.commons.utils.MetadataUtils;
+import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.db.exception.metadata.MeasurementAlreadyExistException;
import
org.apache.iotdb.db.exception.metadata.template.TemplateIsInUseException;
import org.apache.iotdb.db.pipe.agent.PipeDataNodeAgent;
@@ -86,6 +87,8 @@ import org.apache.tsfile.utils.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.annotation.Nonnull;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -94,7 +97,7 @@ import java.util.Objects;
/** Schema write {@link PlanNode} visitor */
public class SchemaExecutionVisitor extends PlanVisitor<TSStatus,
ISchemaRegion> {
- private static final Logger logger =
LoggerFactory.getLogger(SchemaExecutionVisitor.class);
+ private static Logger logger =
LoggerFactory.getLogger(SchemaExecutionVisitor.class);
@Override
public TSStatus visitCreateTimeSeries(
@@ -102,7 +105,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
try {
schemaRegion.createTimeSeries(node, -1);
} catch (final MetadataException e) {
- logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
+ logMetaDataException(String.format("%s: MetaData error: ",
IoTDBConstant.GLOBAL_DB_NAME), e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, "Execute
successfully");
@@ -129,7 +132,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.createAlignedTimeSeries(node);
}
} catch (final MetadataException e) {
- logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
+ logMetaDataException(String.format("%s: MetaData error: ",
IoTDBConstant.GLOBAL_DB_NAME), e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, "Execute
successfully");
@@ -155,7 +158,8 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
((CreateTimeSeriesPlanImpl)
createTimeSeriesPlan).setWithMerge(node.isGeneratedByPipe());
schemaRegion.createTimeSeries(createTimeSeriesPlan, -1);
} catch (final MetadataException e) {
- logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME,
e);
+ logMetaDataException(
+ String.format("%s: MetaData error: ",
IoTDBConstant.GLOBAL_DB_NAME), e);
failingStatus.add(RpcUtils.getStatus(e.getErrorCode(),
e.getMessage()));
}
}
@@ -297,7 +301,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
RpcUtils.getStatus(
e.getErrorCode(),
PartialPath.transformDataToString(e.getMeasurementPath())));
} catch (final MetadataException e) {
- logger.warn("{}: MetaData error: ", e.getMessage(), e);
+ logMetaDataException(String.format("%s: MetaData error: ",
e.getMessage()), e);
failingStatus.add(RpcUtils.getStatus(e.getErrorCode(),
e.getMessage()));
}
}
@@ -445,7 +449,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
break;
}
} catch (MetadataException e) {
- logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
+ logMetaDataException(String.format("%s: MetaData error: ",
IoTDBConstant.GLOBAL_DB_NAME), e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
} catch (IOException e) {
logger.error("{}: IO error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
@@ -468,7 +472,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.activateSchemaTemplate(node, template);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -496,7 +500,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
if (e.getErrorCode() ==
TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) {
alreadyActivatedDeviceList.add(entry.getKey());
} else {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
statusList.add(RpcUtils.getStatus(e.getErrorCode(), e.getMessage()));
}
}
@@ -504,7 +508,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
if (!alreadyActivatedDeviceList.isEmpty()) {
final TemplateIsInUseException e =
new TemplateIsInUseException(alreadyActivatedDeviceList.toString());
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
statusList.add(RpcUtils.getStatus(e.getErrorCode(), e.getMessage()));
}
return statusList.isEmpty() ? RpcUtils.SUCCESS_STATUS :
RpcUtils.getStatus(statusList);
@@ -533,7 +537,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
"Device Template has already been activated on path %s,
there's no need to activate again.",
entry.getKey()));
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -552,7 +556,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
: TSStatusCode.SUCCESS_STATUS,
String.valueOf(preDeletedNumAndIsAllLogicalView.getLeft()));
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -564,7 +568,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.rollbackSchemaBlackList(node.getPatternTree());
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -576,7 +580,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.deleteTimeseriesInBlackList(node.getPatternTree());
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -589,7 +593,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
if (e.getErrorCode() != TSStatusCode.PATH_NOT_EXIST.getStatusCode()) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
}
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
@@ -603,7 +607,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
TSStatusCode.SUCCESS_STATUS,
String.valueOf(schemaRegion.constructSchemaBlackListWithTemplate(node)));
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -615,7 +619,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.rollbackSchemaBlackListWithTemplate(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -627,7 +631,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.deactivateTemplateInBlackList(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -682,7 +686,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
TSStatusCode.SUCCESS_STATUS,
String.valueOf(schemaRegion.constructLogicalViewBlackList(node.getPatternTree())));
} catch (MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -694,7 +698,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.rollbackLogicalViewBlackList(node.getPatternTree());
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -705,7 +709,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.deleteLogicalView(node.getPatternTree());
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -718,7 +722,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.createOrUpdateTableDevice(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -730,7 +734,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.updateTableDeviceAttribute(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -742,7 +746,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.commitUpdateAttribute(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -754,7 +758,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.addNodeLocation(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -766,7 +770,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.deleteTableDevice(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -778,7 +782,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.dropTableAttribute(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -790,7 +794,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
final long preDeletedNum =
schemaRegion.constructTableDevicesBlackList(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS,
String.valueOf(preDeletedNum));
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -802,7 +806,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.rollbackTableDevicesBlackList(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -814,7 +818,7 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
schemaRegion.deleteTableDevicesInBlackList(node);
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} catch (final MetadataException e) {
- logger.error(e.getMessage(), e);
+ logMetaDataException(e);
return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
}
}
@@ -851,7 +855,29 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
}
@Override
- public TSStatus visitPlan(PlanNode node, ISchemaRegion context) {
+ public TSStatus visitPlan(final PlanNode node, final ISchemaRegion context) {
return null;
}
+
+ public static void logMetaDataException(
+ final @Nonnull String message, final @Nonnull MetadataException e) {
+ if (e.isUserException()) {
+ logger.info(message);
+ } else {
+ logger.error(message, e);
+ }
+ }
+
+ public static void logMetaDataException(final @Nonnull MetadataException e) {
+ if (e.isUserException()) {
+ logger.info(e.getMessage());
+ } else {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ @TestOnly
+ public static void setLogger(final Logger logger) {
+ SchemaExecutionVisitor.logger = logger;
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
index 7ddf1618223..230ed8330ca 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
@@ -978,7 +978,7 @@ public class SchemaRegionMemoryImpl implements
ISchemaRegion {
mTree.alterEncodingCompressor(pathPattern, node.getEncoding(),
node.getCompressionType());
}
if (!exist) {
- throw new
PathNotExistException(node.getPatternTree().getAllPathPatterns().toString(),
false);
+ throw new
PathNotExistException(node.getPatternTree().getAllPathPatterns().toString(),
true);
}
writeToMLog(node);
}
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitorTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitorTest.java
new file mode 100644
index 00000000000..b36f585e117
--- /dev/null
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/consensus/statemachine/schemaregion/SchemaExecutionVisitorTest.java
@@ -0,0 +1,277 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.consensus.statemachine.schemaregion;
+
+import org.apache.iotdb.commons.exception.MetadataException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+
+public class SchemaExecutionVisitorTest {
+ @Test
+ public void testAuthLogger() {
+ SchemaExecutionVisitor.setLogger(
+ new Logger() {
+ @Override
+ public String getName() {
+ return null;
+ }
+
+ @Override
+ public boolean isTraceEnabled() {
+ return false;
+ }
+
+ @Override
+ public void trace(String msg) {}
+
+ @Override
+ public void trace(String format, Object arg) {}
+
+ @Override
+ public void trace(String format, Object arg1, Object arg2) {}
+
+ @Override
+ public void trace(String format, Object... arguments) {}
+
+ @Override
+ public void trace(String msg, Throwable t) {}
+
+ @Override
+ public boolean isTraceEnabled(Marker marker) {
+ return false;
+ }
+
+ @Override
+ public void trace(Marker marker, String msg) {}
+
+ @Override
+ public void trace(Marker marker, String format, Object arg) {}
+
+ @Override
+ public void trace(Marker marker, String format, Object arg1, Object
arg2) {}
+
+ @Override
+ public void trace(Marker marker, String format, Object... argArray)
{}
+
+ @Override
+ public void trace(Marker marker, String msg, Throwable t) {}
+
+ @Override
+ public boolean isDebugEnabled() {
+ return false;
+ }
+
+ @Override
+ public void debug(String msg) {}
+
+ @Override
+ public void debug(String format, Object arg) {}
+
+ @Override
+ public void debug(String format, Object arg1, Object arg2) {}
+
+ @Override
+ public void debug(String format, Object... arguments) {}
+
+ @Override
+ public void debug(String msg, Throwable t) {}
+
+ @Override
+ public boolean isDebugEnabled(Marker marker) {
+ return false;
+ }
+
+ @Override
+ public void debug(Marker marker, String msg) {}
+
+ @Override
+ public void debug(Marker marker, String format, Object arg) {}
+
+ @Override
+ public void debug(Marker marker, String format, Object arg1, Object
arg2) {}
+
+ @Override
+ public void debug(Marker marker, String format, Object... arguments)
{}
+
+ @Override
+ public void debug(Marker marker, String msg, Throwable t) {}
+
+ @Override
+ public boolean isInfoEnabled() {
+ return true;
+ }
+
+ @Override
+ public void info(String msg) {}
+
+ @Override
+ public void info(String format, Object arg) {}
+
+ @Override
+ public void info(String format, Object arg1, Object arg2) {}
+
+ @Override
+ public void info(String format, Object... arguments) {}
+
+ @Override
+ public void info(String msg, Throwable t) {}
+
+ @Override
+ public boolean isInfoEnabled(Marker marker) {
+ return true;
+ }
+
+ @Override
+ public void info(Marker marker, String msg) {}
+
+ @Override
+ public void info(Marker marker, String format, Object arg) {}
+
+ @Override
+ public void info(Marker marker, String format, Object arg1, Object
arg2) {}
+
+ @Override
+ public void info(Marker marker, String format, Object... arguments)
{}
+
+ @Override
+ public void info(Marker marker, String msg, Throwable t) {}
+
+ // Warn
+ @Override
+ public boolean isWarnEnabled() {
+ return true;
+ }
+
+ @Override
+ public void warn(String msg) {}
+
+ @Override
+ public void warn(String format, Object arg) {}
+
+ @Override
+ public void warn(String format, Object... arguments) {}
+
+ @Override
+ public void warn(String format, Object arg1, Object arg2) {}
+
+ @Override
+ public void warn(String msg, Throwable t) {}
+
+ @Override
+ public boolean isWarnEnabled(Marker marker) {
+ return false;
+ }
+
+ @Override
+ public void warn(Marker marker, String msg) {}
+
+ @Override
+ public void warn(Marker marker, String format, Object arg) {}
+
+ @Override
+ public void warn(Marker marker, String format, Object arg1, Object
arg2) {}
+
+ @Override
+ public void warn(Marker marker, String format, Object... arguments)
{}
+
+ @Override
+ public void warn(Marker marker, String msg, Throwable t) {}
+
+ @Override
+ public boolean isErrorEnabled() {
+ return true;
+ }
+
+ @Override
+ public void error(String msg) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(String format, Object arg) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(String format, Object arg1, Object arg2) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(String format, Object... arguments) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(String msg, Throwable t) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isErrorEnabled(Marker marker) {
+ return true;
+ }
+
+ @Override
+ public void error(Marker marker, String msg) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(Marker marker, String format, Object arg) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(Marker marker, String format, Object arg1, Object
arg2) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(Marker marker, String format, Object... arguments)
{
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void error(Marker marker, String msg, Throwable t) {
+ throw new UnsupportedOperationException();
+ }
+ });
+ SchemaExecutionVisitor.logMetaDataException(new MetadataException("",
true));
+ SchemaExecutionVisitor.logMetaDataException("", new MetadataException("",
true));
+ try {
+ SchemaExecutionVisitor.logMetaDataException(new MetadataException("",
false));
+ Assert.fail();
+ } catch (final UnsupportedOperationException e) {
+ // Expected
+ }
+ try {
+ SchemaExecutionVisitor.logMetaDataException(new MetadataException("",
false));
+ Assert.fail();
+ } catch (final UnsupportedOperationException e) {
+ // Expected
+ }
+
SchemaExecutionVisitor.setLogger(LoggerFactory.getLogger(SchemaExecutionVisitor.class));
+ }
+}