This is an automated email from the ASF dual-hosted git repository.
caogaofei 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 43cbe3a2b8 [IOTDB-4631] [IOTDB-4777] Fixed the bug of concurrent
DataNode deletion (#7744)
43cbe3a2b8 is described below
commit 43cbe3a2b8203c20a631a4ed1209388773bc5b6d
Author: Caideyipi <[email protected]>
AuthorDate: Fri Oct 28 08:53:28 2022 +0800
[IOTDB-4631] [IOTDB-4777] Fixed the bug of concurrent DataNode deletion
(#7744)
---
.../iotdb/confignode/manager/ConfigManager.java | 2 +-
.../iotdb/confignode/manager/TriggerManager.java | 4 ++--
.../iotdb/confignode/manager/node/NodeManager.java | 16 ++++++-------
.../iotdb/confignode/procedure/Procedure.java | 6 ++---
.../confignode/procedure/ProcedureExecutor.java | 2 +-
.../procedure/env/ConfigNodeProcedureEnv.java | 12 +++++++++-
.../procedure/env/DataNodeRemoveHandler.java | 26 +++++++++++-----------
.../impl/node/RemoveDataNodeProcedure.java | 12 +++++++++-
.../confignode/procedure/scheduler/LockQueue.java | 10 +++------
.../procedure/state/RemoveDataNodeState.java | 1 +
.../thrift/ConfigNodeRPCServiceProcessor.java | 12 +++++-----
.../db/service/DataNodeServerCommandLine.java | 10 ++++-----
12 files changed, 64 insertions(+), 49 deletions(-)
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index ba9d226f65..7644299f30 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -1288,7 +1288,7 @@ public class ConfigManager implements IManager {
newUnknownDataList.forEach(
dataNodeLocation ->
runningDataNodeLocationMap.remove(dataNodeLocation.getDataNodeId()));
- LOGGER.info("start Transfer of {}", newUnknownDataList);
+ LOGGER.info("Start transfer of {}", newUnknownDataList);
// transfer trigger
TSStatus transferResult =
triggerManager.transferTrigger(newUnknownDataList,
runningDataNodeLocationMap);
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
index 3976d97f2f..0f3a263150 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/TriggerManager.java
@@ -165,8 +165,8 @@ public class TriggerManager {
*
* <p>Step2: Get all Transferring Triggers marked in Step1.
*
- * <p>Step3: For each trigger get in Step2, find the DataNode with the
lowest load, then transfer
- * the Stateful Trigger to it and update this information on all DataNodes.
+ * <p>Step3: For each trigger gotten in Step2, find the DataNode with the
lowest load, then
+ * transfer the Stateful Trigger to it and update this information on all
DataNodes.
*
* <p>Step4: Update the newest location on ConfigNodes.
*
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index c9c113f240..57e82c553e 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -248,9 +248,9 @@ public class NodeManager {
/**
* Remove DataNodes
*
- * @param removeDataNodePlan RemoveDataNodeReq
- * @return DataNodeToStatusResp, The TSStatue will be SUCCEED_STATUS when
request is accept,
- * DATANODE_NOT_EXIST when some datanode not exist.
+ * @param removeDataNodePlan removeDataNodePlan
+ * @return DataNodeToStatusResp, The TSStatus will be SUCCEED_STATUS if the
request is accepted,
+ * DATANODE_NOT_EXIST when some datanode does not exist.
*/
public DataSet removeDataNode(RemoveDataNodePlan removeDataNodePlan) {
LOGGER.info("NodeManager start to remove DataNode {}", removeDataNodePlan);
@@ -261,7 +261,7 @@ public class NodeManager {
dataNodeRemoveHandler.checkRemoveDataNodeRequest(removeDataNodePlan);
if (preCheckStatus.getStatus().getCode() !=
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
LOGGER.error(
- "the remove Data Node request check failed. req: {}, check result:
{}",
+ "The remove DataNode request check failed. req: {}, check result:
{}",
removeDataNodePlan,
preCheckStatus.getStatus());
return preCheckStatus;
@@ -282,10 +282,10 @@ public class NodeManager {
TSStatus status;
if (registerSucceed) {
status = new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
- status.setMessage("Server accept the request");
+ status.setMessage("Server accepted the request");
} else {
status = new
TSStatus(TSStatusCode.NODE_DELETE_FAILED_ERROR.getStatusCode());
- status.setMessage("Server reject the request, maybe request is too
much");
+ status.setMessage("Server rejected the request, maybe requests are too
many");
}
dataSet.setStatus(status);
@@ -465,7 +465,7 @@ public class NodeManager {
* @param removeConfigNodePlan RemoveConfigNodePlan
*/
public TSStatus checkConfigNodeBeforeRemove(RemoveConfigNodePlan
removeConfigNodePlan) {
- removeConfigNodeLock.tryLock();
+ removeConfigNodeLock.lock();
try {
// Check OnlineConfigNodes number
if (filterConfigNodeThroughStatus(NodeStatus.Running).size() <= 1) {
@@ -500,7 +500,7 @@ public class NodeManager {
}
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode())
- .setMessage("Success remove confignode.");
+ .setMessage("Successfully remove confignode.");
}
private TSStatus transferLeader(
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/Procedure.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/Procedure.java
index 61e7b4d48a..f06b4a084b 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/Procedure.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/Procedure.java
@@ -262,11 +262,11 @@ public abstract class Procedure<Env> implements
Comparable<Procedure<Env>> {
return clazz;
}
- public static Procedure newInstance(ByteBuffer byteBuffer) {
+ public static Procedure<?> newInstance(ByteBuffer byteBuffer) {
Class<?> procedureClass = deserializeTypeInfo(byteBuffer);
- Procedure procedure;
+ Procedure<?> procedure;
try {
- procedure = (Procedure) procedureClass.newInstance();
+ procedure = (Procedure<?>) procedureClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException("Instantiation failed", e);
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java
index 2dac1b0727..2b9d631541 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/ProcedureExecutor.java
@@ -700,7 +700,7 @@ public class ProcedureExecutor<Env> {
*/
private long pushProcedure(Procedure<Env> procedure) {
final long currentProcId = procedure.getProcId();
- RootProcedureStack stack = new RootProcedureStack();
+ RootProcedureStack<Env> stack = new RootProcedureStack<>();
rollbackStack.put(currentProcId, stack);
procedures.put(currentProcId, procedure);
scheduler.addBack(procedure);
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java
index 1467c1156d..c74fa4b680 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java
@@ -26,6 +26,7 @@ import
org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration;
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.commons.cluster.NodeStatus;
import org.apache.iotdb.commons.cluster.RegionStatus;
import org.apache.iotdb.commons.trigger.TriggerInformation;
import org.apache.iotdb.confignode.client.ConfigNodeRequestType;
@@ -48,6 +49,7 @@ import org.apache.iotdb.confignode.manager.load.LoadManager;
import org.apache.iotdb.confignode.manager.node.NodeManager;
import org.apache.iotdb.confignode.manager.partition.PartitionManager;
import org.apache.iotdb.confignode.manager.partition.RegionHeartbeatSample;
+import org.apache.iotdb.confignode.persistence.node.NodeInfo;
import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
import org.apache.iotdb.confignode.procedure.scheduler.LockQueue;
import org.apache.iotdb.confignode.procedure.scheduler.ProcedureScheduler;
@@ -170,6 +172,14 @@ public class ConfigNodeProcedureEnv {
.allMatch(tsStatus -> tsStatus.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode());
}
+ public boolean doubleCheckReplica() {
+ return configManager
+ .getNodeManager()
+ .filterDataNodeThroughStatus(NodeStatus.Running,
NodeStatus.ReadOnly)
+ .size()
+ > NodeInfo.getMinimumDataNode();
+ }
+
/**
* Let the remotely new ConfigNode build the ConsensusGroup
*
@@ -210,7 +220,7 @@ public class ConfigNodeProcedureEnv {
*/
public void removeConfigNodePeer(TConfigNodeLocation tConfigNodeLocation)
throws ProcedureException {
- removeConfigNodeLock.tryLock();
+ removeConfigNodeLock.lock();
TSStatus tsStatus;
try {
// Execute removePeer
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
index 5375a6840a..a2ad2e2cda 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/DataNodeRemoveHandler.java
@@ -36,7 +36,6 @@ import
org.apache.iotdb.confignode.consensus.response.DataNodeToStatusResp;
import org.apache.iotdb.confignode.manager.ConfigManager;
import org.apache.iotdb.confignode.manager.node.BaseNodeCache;
import org.apache.iotdb.confignode.persistence.node.NodeInfo;
-import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
import org.apache.iotdb.confignode.procedure.scheduler.LockQueue;
import org.apache.iotdb.consensus.ConsensusFactory;
import org.apache.iotdb.mpp.rpc.thrift.TCreatePeerReq;
@@ -274,7 +273,7 @@ public class DataNodeRemoveHandler {
TConsensusGroupId regionId) {
TSStatus status;
- TDataNodeLocation rpcClientDataNode = null;
+ TDataNodeLocation rpcClientDataNode;
// Here we pick the DataNode who contains one of the RegionReplica of the
specified
// ConsensusGroup except the origin one
@@ -313,8 +312,8 @@ public class DataNodeRemoveHandler {
public TSStatus deleteOldRegionPeer(
TDataNodeLocation originalDataNode, TConsensusGroupId regionId) {
- // when DataReplicationFactor==1, execute deleteOldRegionPeer method will
cause error
- // user must delete the related data manually
+ // When DataReplicationFactor==1, execute deleteOldRegionPeer method will
cause error
+ // User must delete the related data manually
// TODO if multi-leader supports deleteOldRegionPeer when
DataReplicationFactor==1?
if (CONF.getDataReplicationFactor() == 1
&& TConsensusGroupType.DataRegion.equals(regionId.getType())) {
@@ -411,10 +410,8 @@ public class DataNodeRemoveHandler {
* Stop old data node
*
* @param dataNode old data node
- * @return status
- * @throws ProcedureException procedure exception
*/
- public TSStatus stopDataNode(TDataNodeLocation dataNode) throws
ProcedureException {
+ public void stopDataNode(TDataNodeLocation dataNode) {
LOGGER.info("{}, Begin to stop Data Node {}", REMOVE_DATANODE_PROCESS,
dataNode);
AsyncDataNodeClientPool.getInstance().resetClient(dataNode.getInternalEndPoint());
TSStatus status =
@@ -423,7 +420,6 @@ public class DataNodeRemoveHandler {
dataNode.getInternalEndPoint(), dataNode,
DataNodeRequestType.STOP_DATA_NODE);
configManager.getNodeManager().removeNodeCache(dataNode.getDataNodeId());
LOGGER.info("{}, Stop Data Node {} result: {}", REMOVE_DATANODE_PROCESS,
dataNode, status);
- return status;
}
/**
@@ -489,8 +485,12 @@ public class DataNodeRemoveHandler {
private TSStatus checkRegionReplication(RemoveDataNodePlan
removeDataNodePlan) {
TSStatus status = new
TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
List<TDataNodeLocation> removedDataNodes =
removeDataNodePlan.getDataNodeLocations();
- int allDataNodeSize =
configManager.getNodeManager().getRegisteredDataNodeCount();
+ int availableDatanodeSize =
+ configManager
+ .getNodeManager()
+ .filterDataNodeThroughStatus(NodeStatus.Running,
NodeStatus.ReadOnly)
+ .size();
// when the configuration is one replication, it will be failed if the
data node is not in
// running state.
if (CONF.getSchemaReplicationFactor() == 1 ||
CONF.getDataReplicationFactor() == 1) {
@@ -513,15 +513,15 @@ public class DataNodeRemoveHandler {
}
int removedDataNodeSize = removeDataNodePlan.getDataNodeLocations().size();
- if (allDataNodeSize - removedDataNodeSize < NodeInfo.getMinimumDataNode())
{
+ if (availableDatanodeSize - removedDataNodeSize <
NodeInfo.getMinimumDataNode()) {
status.setCode(TSStatusCode.LACK_REPLICATION.getStatusCode());
status.setMessage(
String.format(
"Can't remove datanode due to the limit of replication factor, "
- + "allDataNodeSize: %s, maxReplicaFactor: %s, max allowed
removed Data Node size is: %s",
- allDataNodeSize,
+ + "availableDataNodeSize: %s, maxReplicaFactor: %s, max
allowed removed Data Node size is: %s",
+ availableDatanodeSize,
NodeInfo.getMinimumDataNode(),
- (allDataNodeSize - NodeInfo.getMinimumDataNode())));
+ (availableDatanodeSize - NodeInfo.getMinimumDataNode())));
}
return status;
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodeProcedure.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodeProcedure.java
index 1e824a0b59..d13b4abb60 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodeProcedure.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/node/RemoveDataNodeProcedure.java
@@ -65,6 +65,16 @@ public class RemoveDataNodeProcedure extends
AbstractNodeProcedure<RemoveDataNod
}
try {
switch (state) {
+ case REGION_REPLICA_CHECK:
+ if (env.doubleCheckReplica()) {
+ setNextState(RemoveDataNodeState.REMOVE_DATA_NODE_PREPARE);
+ } else {
+ LOG.error(
+ "{}, Can not remove DataNode {} because the number of
DataNodes is less or equal than region replica number",
+ REMOVE_DATANODE_PROCESS,
+ disableDataNodeLocation);
+ return Flow.NO_MORE_STATE;
+ }
case REMOVE_DATA_NODE_PREPARE:
// mark the datanode as removing status and broadcast region route
map
env.markDataNodeAsRemovingAndBroadCast(disableDataNodeLocation);
@@ -137,7 +147,7 @@ public class RemoveDataNodeProcedure extends
AbstractNodeProcedure<RemoveDataNod
@Override
protected RemoveDataNodeState getInitialState() {
- return RemoveDataNodeState.REMOVE_DATA_NODE_PREPARE;
+ return RemoveDataNodeState.REGION_REPLICA_CHECK;
}
@Override
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/scheduler/LockQueue.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/scheduler/LockQueue.java
index 6980a2054d..832e339c0a 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/scheduler/LockQueue.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/scheduler/LockQueue.java
@@ -25,7 +25,7 @@ import java.util.ArrayDeque;
/** Lock Queue for procedure of the same type */
public class LockQueue {
- private final ArrayDeque<Procedure> deque = new ArrayDeque<>();
+ private final ArrayDeque<Procedure<?>> deque = new ArrayDeque<>();
private Procedure<?> lockOwnerProcedure = null;
@@ -34,10 +34,7 @@ public class LockQueue {
lockOwnerProcedure = procedure;
return true;
}
- if (procedure.getProcId() == lockOwnerProcedure.getProcId()) {
- return true;
- }
- return false;
+ return procedure.getProcId() == lockOwnerProcedure.getProcId();
}
public boolean releaseLock(Procedure<?> procedure) {
@@ -48,7 +45,7 @@ public class LockQueue {
return true;
}
- public void waitProcedure(Procedure procedure) {
+ public void waitProcedure(Procedure<?> procedure) {
deque.addLast(procedure);
}
@@ -57,7 +54,6 @@ public class LockQueue {
while (!deque.isEmpty()) {
procedureScheduler.addFront(deque.pollFirst());
}
- deque.clear();
return count;
}
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/RemoveDataNodeState.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/RemoveDataNodeState.java
index 30d2476056..1716363511 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/RemoveDataNodeState.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/RemoveDataNodeState.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.confignode.procedure.state;
public enum RemoveDataNodeState {
+ REGION_REPLICA_CHECK,
REMOVE_DATA_NODE_PREPARE,
BROADCAST_DISABLE_DATA_NODE,
SUBMIT_REGION_MIGRATE,
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index dda892bd23..8af4f1df9e 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -340,8 +340,7 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
}
@Override
- public TDataPartitionTableResp
getOrCreateDataPartitionTable(TDataPartitionReq req)
- throws TException {
+ public TDataPartitionTableResp
getOrCreateDataPartitionTable(TDataPartitionReq req) {
GetOrCreateDataPartitionPlan getOrCreateDataPartitionReq =
GetOrCreateDataPartitionPlan.convertFromRpcTDataPartitionReq(req);
return configManager.getOrCreateDataPartition(getOrCreateDataPartitionReq);
@@ -410,7 +409,7 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
}
@Override
- public TConfigNodeRegisterResp registerConfigNode(TConfigNodeRegisterReq
req) throws TException {
+ public TConfigNodeRegisterResp registerConfigNode(TConfigNodeRegisterReq
req) {
TConfigNodeRegisterResp resp = configManager.registerConfigNode(req);
// Print log to record the ConfigNode that performs the
RegisterConfigNodeRequest
@@ -611,8 +610,7 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
}
@Override
- public TShowStorageGroupResp showStorageGroup(List<String>
storageGroupPathPattern)
- throws TException {
+ public TShowStorageGroupResp showStorageGroup(List<String>
storageGroupPathPattern) {
return configManager.showStorageGroup(new
GetStorageGroupPlan(storageGroupPathPattern));
}
@@ -642,7 +640,7 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
}
@Override
- public TSStatus deactivateSchemaTemplate(TDeactivateSchemaTemplateReq req)
throws TException {
+ public TSStatus deactivateSchemaTemplate(TDeactivateSchemaTemplateReq req) {
return configManager.deactivateSchemaTemplate(req);
}
@@ -692,7 +690,7 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
}
@Override
- public TGetAllPipeInfoResp getAllPipeInfo() throws TException {
+ public TGetAllPipeInfoResp getAllPipeInfo() {
return configManager.getAllPipeInfo();
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/DataNodeServerCommandLine.java
b/server/src/main/java/org/apache/iotdb/db/service/DataNodeServerCommandLine.java
index e952779f39..01b9a56a79 100644
---
a/server/src/main/java/org/apache/iotdb/db/service/DataNodeServerCommandLine.java
+++
b/server/src/main/java/org/apache/iotdb/db/service/DataNodeServerCommandLine.java
@@ -72,7 +72,7 @@ public class DataNodeServerCommandLine extends
ServerCommandLine {
}
DataNode dataNode = DataNode.getInstance();
- // check config of iotdb,and set some configs in cluster mode
+ // Check config of IoTDB, and set some configs in cluster mode
try {
dataNode.serverCheckAndInit();
} catch (ConfigurationException | IOException e) {
@@ -82,13 +82,13 @@ public class DataNodeServerCommandLine extends
ServerCommandLine {
String mode = args[0];
LOGGER.info("Running mode {}", mode);
- // initialize the current node and its services
+ // Initialize the current node and its services
if (!dataNode.initLocalEngines()) {
LOGGER.error("Init local engines error, stop process!");
return -1;
}
- // we start IoTDB kernel first. then we start the cluster module.
+ // Start IoTDB kernel first, then start the cluster module
if (MODE_START.equals(mode)) {
dataNode.doAddNode();
} else if (MODE_REMOVE.equals(mode)) {
@@ -129,9 +129,9 @@ public class DataNodeServerCommandLine extends
ServerCommandLine {
removeResp.getStatus().toString(),
removeResp.getStatus().getCode());
}
LOGGER.info(
- "Submit remove-datanode request successfully, "
+ "Submit remove-datanode request successfully, but the process may
fail. "
+ "more details are shown in the logs of confignode-leader and
removed-datanode, "
- + "and after the process of removing datanode is over, "
+ + "and after the process of removing datanode ends successfully,
"
+ "you are supposed to delete directory and data of the
removed-datanode manually");
}
}