/** * */ package com.alibaba.doris.dataserver.migrator; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.doris.dataserver.migrator.action.MigrationActionData; import com.alibaba.doris.dataserver.migrator.task.BaseMigrationTask; import com.alibaba.doris.dataserver.migrator.task.MigrationTask; /** * @author raymond */ public class MigrationTaskScheduler { private static final Logger logger = LoggerFactory.getLogger(MigrationTaskScheduler.class); protected volatile Map<String, MigrationTask> activeTaskMap = new ConcurrentHashMap<String, MigrationTask>(); protected volatile MigrationTask lastTask; public void addMigrationTask(BaseMigrationTask migrationTask) { activeTaskMap.put(migrationTask.getTaskKey(), migrationTask); this.lastTask = migrationTask; } public MigrationTask getTask(String taskKey) { return activeTaskMap.get(taskKey); } public MigrationTask getTask(MigrationActionData actionData) { String taskKey = BaseMigrationTask.buildTaskKey(actionData); return activeTaskMap.get(taskKey); } public boolean hasActiveTask() { return activeTaskMap.size() > 0; } public MigrationTask getLastTask() { return lastTask; } public void removeTask(MigrationTask task) { activeTaskMap.remove(task.getTaskKey()); } /** * checkAndTerminateActiveTask */ public void checkAndTerminateFinishedTask() { Iterator<String> itor = activeTaskMap.keySet().iterator(); while (itor.hasNext()) { String taskKey = itor.next(); BaseMigrationTask activeTask = (BaseMigrationTask) activeTaskMap.get(taskKey); if (activeTask != null && activeTask.isFinished()) { if (logger.isDebugEnabled()) { logger.debug("Clear last TERMINATED task thread. Set to null." + activeTask); } try { activeTask.join(); } catch (InterruptedException e) { activeTask.interrupt(); } removeTask(activeTask); activeTask = null; } } } public Map<String, MigrationTask> getActiveTaskMap() { return activeTaskMap; } /** * cancel all ActiveTask * * @param requestMigrationActionData * @return */ public boolean cancelAllActiveTask() { if (activeTaskMap.size() == 0) { if (logger.isDebugEnabled()) { logger.debug("No active migration task to be cancelled. "); } return false; } Iterator<String> itor = activeTaskMap.keySet().iterator(); while (itor.hasNext()) { String taskKey = itor.next(); BaseMigrationTask activeTask = (BaseMigrationTask) activeTaskMap.get(taskKey); cancelTask(activeTask); } return true; } public boolean cancelTask(BaseMigrationTask task) { if (task != null) { task.cancel(); // cancel task if (task.isCancel()) { MigrationActionData actionData = task.getMigrationActionData(); if (actionData != null) { actionData.setSuccess(true); } // retMsg = Message._MIGRATION_TASK_CANCEL + " " + migrateType ; if (logger.isDebugEnabled()) { logger.debug("Try to cancel active migration task. " + task); } task.interrupt(); if (logger.isDebugEnabled()) { logger.debug("Succeed to cancel active migration task successfully. " + task); } removeTask(task); } return true; } else { if (logger.isDebugEnabled()) { logger.debug("No active migration task to be cancelled. "); } // retMsg = Message._MIGRATION_NO_TASK_TO_CANCEL; return false; } } }