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

Reply via email to