package com.alibaba.doris.admin.service.failover.migrate; import java.util.ArrayList; import java.util.List; import com.alibaba.doris.admin.dataobject.PhysicalNodeDO; import com.alibaba.doris.admin.monitor.MonitorEnum; import com.alibaba.doris.admin.monitor.SystemLogMonitor; import com.alibaba.doris.admin.service.common.migrate.command.MigrateCommand; import com.alibaba.doris.admin.service.common.node.NodesManager; import com.alibaba.doris.admin.service.failover.node.check.NodeCheckManager; import com.alibaba.doris.admin.service.failover.node.check.NodeHealth; import com.alibaba.doris.common.MigrateTypeEnum; import com.alibaba.doris.common.MonitorWarnConstants; import com.alibaba.doris.common.NodeRouteStatus; import com.alibaba.doris.common.StoreNodeSequenceEnum; /** * 永久失效恢复迁移调度线程 * * @author frank */ public class ForeverFailoverMigrateThread extends FailoverMigrateThread { private List<PhysicalNodeDO> relativeNodeList; // private static final Log log = LogFactory.getLog(ForeverFailoverMigrateThread.class); PhysicalNodeDO standbyNode; public ForeverFailoverMigrateThread(String failPhysicalNodeId) { // processor保证这里一定能获得standbyNode standbyNode = NodesManager.getInstance().getStandbyNodeId(failPhysicalNodeId); if (standbyNode == null||NodeCheckManager.getInstance().checkNode(standbyNode.getPhysicalId(), false).equals(NodeHealth.NG)) { return; } PhysicalNodeDO node = NodesManager.getInstance().getNode(failPhysicalNodeId); int failNodeSequence = node.getSerialId(); int failNodeLogicId = node.getLogicalId(); standbyNode.setLogicalId(failNodeLogicId); standbyNode.setSerialId(failNodeSequence); standbyNode.setStatus(NodeRouteStatus.TEMP_FAILED.getValue()); node.setSerialId(StoreNodeSequenceEnum.UNUSE_SEQUENCE.getValue()); List<PhysicalNodeDO> nodes = new ArrayList<PhysicalNodeDO>(); nodes.add(standbyNode); nodes.add(node); nodeService.updatePhysicalNodeList(nodes); NodesManager.getInstance().reLoadNodes(); migrateKey = standbyNode.getPhysicalId(); this.failPhysicalNodeIdList.add(migrateKey); // 获得永久失效节点的对等节点,只考虑两个序列,考虑到序列长度不一样的情况,对等序列的所有节点都可能包含失效节点的数据 if (StoreNodeSequenceEnum.NORMAL_SEQUENCE_1.equals(StoreNodeSequenceEnum.getTypeByValue(failNodeSequence))) { relativeNodeList = NodesManager.getInstance().getNodeListBySequence(StoreNodeSequenceEnum.NORMAL_SEQUENCE_2); } else { relativeNodeList = NodesManager.getInstance().getNodeListBySequence(StoreNodeSequenceEnum.NORMAL_SEQUENCE_1); } this.start(); } @Override protected boolean sendMigerateCommand() { return processSendCommand(relativeNodeList, MigrateTypeEnum.FOREVER_FAILOVER); } @Override protected void sendMigerateFinishCommand() { for (int i = 0; i < relativeNodeList.size(); i++) { PhysicalNodeDO node = relativeNodeList.get(i); SystemLogMonitor.info(MonitorEnum.MIGRATION, MonitorWarnConstants.NODE_FOREVER_FAILURE_RESOLVED + node.getPhysicalId()); MigrateCommand.finishMigerate(node.getPhysicalId(), failPhysicalNodeIdList, commandParamList.get(i), MigrateTypeEnum.FOREVER_FAILOVER); } } public void notifyError() { // TODO Auto-generated method stub } protected void updateStoreNode() { standbyNode.setStatus(NodeRouteStatus.OK.getValue()); nodeService.updatePhysicalNode(standbyNode); } }