package com.alibaba.doris.admin.service.failover.migrate; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.alibaba.doris.admin.dataobject.PhysicalNodeDO; import com.alibaba.doris.admin.service.common.migrate.MigrateThread; import com.alibaba.doris.admin.service.common.migrate.command.MigrateCommand; import com.alibaba.doris.admin.service.common.migrate.command.MigrateCommandResult; import com.alibaba.doris.admin.service.common.migrate.manager.MigrateManager; import com.alibaba.doris.admin.service.common.migrate.status.MigrateStatus; import com.alibaba.doris.common.MigrateStatusEnum; import com.alibaba.doris.common.MigrateTypeEnum; /** * 失效迁移线程基类 * * @author frank */ public abstract class FailoverMigrateThread extends MigrateThread { private static final Log log = LogFactory .getLog(FailoverMigrateThread.class); protected List<String> failPhysicalNodeIdList = new ArrayList<String>(); protected List<String> commandParamList = new ArrayList<String>(); public FailoverMigrateThread() { } public FailoverMigrateThread(String failPhysicalNodeId) { this.failPhysicalNodeIdList.add(failPhysicalNodeId); } @Override public List<String> getMigeratingNodePhysicalIdList() { return failPhysicalNodeIdList; } protected boolean processSendCommand(List<PhysicalNodeDO> physicalNodeIdList, MigrateTypeEnum type) { List<MigrateStatus> tempList = new ArrayList<MigrateStatus>(); tempList.add(MigrateManager.getInstance().addMigerateNode(failPhysicalNodeIdList.get(0), type, MigrateStatusEnum.PREPARE)); boolean ok = true; commandParamList.clear(); for (PhysicalNodeDO physicalNode : physicalNodeIdList) { // 如果给前出节点发迁移命令,命令发送失败,则不启动迁移监控线程,使迁移无法完成。 MigrateCommandResult mcr= MigrateCommand.executeMigerate(physicalNode.getPhysicalId(), failPhysicalNodeIdList, type); Boolean sentResult = mcr.getResult(); commandParamList.add(mcr.getCommandParam()); if (sentResult == null) { if (log.isInfoEnabled()) { log.info("No command need send for temp fail over:" + physicalNode.getPhysicalId() + "-->" + failPhysicalNodeIdList); } continue; } if (sentResult) { // 初始化迁移状态,必需的,避免无数据迁移的临时节点立即返回完成导致迁移结束 MigrateManager.getInstance().updateMigerateStatus(physicalNode.getPhysicalId(), failPhysicalNodeIdList.get(0), 0, MigrateStatusEnum.PREPARE, "sent command."); } else { if (log.isWarnEnabled()) { log.warn("sent temp fail migrate command failed:" + physicalNode.getPhysicalId() + "-->" + failPhysicalNodeIdList); } ok = false; break; } } statusList = tempList; if (monitorThread != null) { monitorThread.setStatusList(tempList); } return ok; } }