未验证 提交 8addee0b 编写于 作者: I Itami Sho 提交者: GitHub

[IOTDB-4102] Refactor config node removal process (#6977)

上级 33952b83
......@@ -781,7 +781,7 @@ public class ConfigManager implements IManager {
TSStatus status = confirmLeader();
if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
status = nodeManager.checkConfigNode(removeConfigNodePlan);
status = nodeManager.checkConfigNodeBeforeRemove(removeConfigNodePlan);
if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
procedureManager.removeConfigNode(removeConfigNodePlan);
}
......
......@@ -284,28 +284,12 @@ public class NodeManager {
nodeInfo.addMetrics();
}
public TSStatus removeConfigNodePeer(TConfigNodeLocation tConfigNodeLocation) {
removeConfigNodeLock.tryLock();
try {
// Execute removePeer
if (getConsensusManager().removeConfigNodePeer(tConfigNodeLocation)) {
configManager
.getLoadManager()
.removeNodeHeartbeatHandCache(tConfigNodeLocation.getConfigNodeId());
return getConsensusManager()
.write(new RemoveConfigNodePlan(tConfigNodeLocation))
.getStatus();
} else {
return new TSStatus(TSStatusCode.REMOVE_CONFIGNODE_FAILED.getStatusCode())
.setMessage(
"Remove ConfigNode failed because update ConsensusGroup peer information failed.");
}
} finally {
removeConfigNodeLock.unlock();
}
}
public TSStatus checkConfigNode(RemoveConfigNodePlan removeConfigNodePlan) {
/**
* Only leader use this interface, check the ConfigNode before remove it
*
* @param removeConfigNodePlan RemoveConfigNodePlan
*/
public TSStatus checkConfigNodeBeforeRemove(RemoveConfigNodePlan removeConfigNodePlan) {
removeConfigNodeLock.tryLock();
try {
// Check OnlineConfigNodes number
......
......@@ -29,9 +29,11 @@ import org.apache.iotdb.confignode.client.sync.confignode.SyncConfigNodeClientPo
import org.apache.iotdb.confignode.client.sync.datanode.SyncDataNodeClientPool;
import org.apache.iotdb.confignode.consensus.request.write.DeleteStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.PreDeleteStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.RemoveConfigNodePlan;
import org.apache.iotdb.confignode.exception.AddConsensusGroupException;
import org.apache.iotdb.confignode.exception.AddPeerException;
import org.apache.iotdb.confignode.manager.ConfigManager;
import org.apache.iotdb.confignode.manager.ConsensusManager;
import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
import org.apache.iotdb.confignode.procedure.scheduler.LockQueue;
import org.apache.iotdb.confignode.procedure.scheduler.ProcedureScheduler;
......@@ -68,6 +70,8 @@ public class ConfigNodeProcedureEnv {
private static boolean invalidCacheResult = true;
private final ReentrantLock removeConfigNodeLock;
public static void setSkipForTest(boolean skipForTest) {
ConfigNodeProcedureEnv.skipForTest = skipForTest;
}
......@@ -80,6 +84,7 @@ public class ConfigNodeProcedureEnv {
this.configManager = configManager;
this.scheduler = scheduler;
this.dataNodeRemoveHandler = new DataNodeRemoveHandler(configManager);
this.removeConfigNodeLock = new ReentrantLock();
}
public ConfigManager getConfigManager() {
......@@ -193,9 +198,27 @@ public class ConfigNodeProcedureEnv {
*/
public void removeConfigNodePeer(TConfigNodeLocation tConfigNodeLocation)
throws ProcedureException {
TSStatus tsStatus = configManager.getNodeManager().removeConfigNodePeer(tConfigNodeLocation);
if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
throw new ProcedureException(tsStatus.getMessage());
removeConfigNodeLock.tryLock();
TSStatus tsStatus;
try {
// Execute removePeer
if (getConsensusManager().removeConfigNodePeer(tConfigNodeLocation)) {
configManager
.getLoadManager()
.removeNodeHeartbeatHandCache(tConfigNodeLocation.getConfigNodeId());
tsStatus =
getConsensusManager().write(new RemoveConfigNodePlan(tConfigNodeLocation)).getStatus();
} else {
tsStatus =
new TSStatus(TSStatusCode.REMOVE_CONFIGNODE_FAILED.getStatusCode())
.setMessage(
"Remove ConfigNode failed because update ConsensusGroup peer information failed.");
}
if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
throw new ProcedureException(tsStatus.getMessage());
}
} finally {
removeConfigNodeLock.unlock();
}
}
......@@ -287,4 +310,8 @@ public class ConfigNodeProcedureEnv {
public DataNodeRemoveHandler getDataNodeRemoveHandler() {
return dataNodeRemoveHandler;
}
private ConsensusManager getConsensusManager() {
return configManager.getConsensusManager();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册