package com.alibaba.doris.admin.service.failover.processor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.alibaba.doris.admin.core.AdminServiceLocator; import com.alibaba.doris.admin.dataobject.PhysicalNodeDO; import com.alibaba.doris.admin.service.common.AdminServiceException; import com.alibaba.doris.admin.service.common.migrate.MigrateThread; import com.alibaba.doris.admin.service.common.migrate.manager.MigrateManager; import com.alibaba.doris.admin.service.common.node.NodesManager; import com.alibaba.doris.common.StoreNodeSequenceEnum; /** * 失效恢复processor基类 * * @author frank */ public abstract class FailoverProcessor { private static final Log log = LogFactory.getLog(FailoverProcessor.class); protected boolean isMainAdmin = AdminServiceLocator.getAdminService().isMasterAdmin(); /** * 失效恢复处理,processor的主方法 * * @param failPhysicalNodeId 失效恢复节点 * @return 是否启动失效恢复迁移调度 */ public synchronized void failResolve(String failPhysicalNodeId) throws AdminServiceException { if (!isMainAdmin) { if (log.isErrorEnabled()) { log.error("This is backup admin server, doesn't support expansion migrating task."); } throw new AdminServiceException("This is backup admin server, doesn't support expansion migrating task."); } PhysicalNodeDO node = NodesManager.getInstance().getNode(failPhysicalNodeId); if (failPhysicalNodeId == null || node == null || node.getSerialId() < StoreNodeSequenceEnum.NORMAL_SEQUENCE_1.getValue() || node.getSerialId() > StoreNodeSequenceEnum.NORMAL_SEQUENCE_4.getValue()) { if (log.isWarnEnabled()) { log.warn("illegal input parameters:" + failPhysicalNodeId); } throw new AdminServiceException("illegal input parameters:" + failPhysicalNodeId + ", it's sequence:" + node.getSerialId()); } NodesManager.getInstance().reLoadNodes(); canFailoverMigerate(failPhysicalNodeId); if (MigrateManager.getInstance().isMigrating(failPhysicalNodeId)) {// 节点正在失效迁移中,kill MigrateThread migThread = MigrateManager.getInstance().getMigerateThread(failPhysicalNodeId); if (migThread != null) { migThread.over(); } if (log.isWarnEnabled()) { log.warn(NodesManager.getInstance().getLogFormatNodeId(failPhysicalNodeId) + " is migerating,kill and restart."); } } // 启动迁移线程 startMigerateThread(failPhysicalNodeId); if (log.isInfoEnabled()) { log.info("execute failover migerate in " + failPhysicalNodeId); } } /** * 是否允许失效恢复迁移 * * @param failPhysicalNodeId * @return */ protected abstract boolean canFailoverMigerate(String failPhysicalNodeId) throws AdminServiceException; /** * 启动迁移调度线程 * * @param failPhysicalNodeId */ protected abstract void startMigerateThread(String failPhysicalNodeId); }