package com.alibaba.doris.admin.service.common.migrate.status;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.alibaba.doris.admin.monitor.MonitorEnum;
import com.alibaba.doris.admin.monitor.SystemLogMonitor;
import com.alibaba.doris.admin.service.common.migrate.manager.MigrateManager;
import com.alibaba.doris.common.MigrateStatusEnum;
import com.alibaba.doris.common.MonitorWarnConstants;
/**
* 迁移状态监控线程,如果发生特定事件,callback迁移执行线程<br>
* 该线程的终止被执行线程控制
*
* @author frank
*/
public class MigrateStatusMonitorThread extends Thread {
private static final Log log = LogFactory.getLog(MigrateStatusMonitorThread.class);
private MigrateStatusCallback callback;
private List<MigrateStatus> statusList;
private boolean isGoOn = true;
private static int sleepTime = 1000; // 监控时间间隔
private long taskId; // 监控线程任务ID,用时间戳生成,由于迁移任务进行同步控制并耗时较长,该ID不会重复。
public MigrateStatusMonitorThread(List<MigrateStatus> statusList, MigrateStatusCallback callback) {
this.callback = callback;
this.statusList = statusList;
this.taskId = System.currentTimeMillis();
}
public void run() {
if (log.isInfoEnabled()) {
log.info(taskId + "Migerate monitor thread start:" + statusList);
}
while (isGoOn) {
boolean allFinish = true;
boolean error = false;
for (MigrateStatus status : statusList) {
status.resetReportTime();
if (log.isDebugEnabled()) {
log.debug(taskId + " " + status.toString());
}
if (!status.getMigerateStatus().equals(MigrateStatusEnum.FINISH)) {// 至少有一个迁移没有完成
allFinish = false;
}
if (status.getMigerateStatus().equals(MigrateStatusEnum.MIGERATE_ERROR)) {// 至少有一个迁移报告错误
error = true;
allFinish = false;
}
if (status.isTimeout()) {
// message 'Migrate Report Timeout:' is used as dragoon warning rule, should be consistent.
SystemLogMonitor.error(MonitorEnum.MIGRATION, MonitorWarnConstants.MIGRATE_REPORT_TIMEOUT + ":"
+ status.getPhysicalId() + ",Mig-Type:" + status.getMigerateType());
}
}
if (allFinish) {
callback.finishAll();
}
if (error) {
callback.notifyError();
}
try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void over() {
clear();
this.isGoOn = false;
}
/**
* 清理现场
*/
private void clear() {
// 移除迁移监控
for (MigrateStatus status : statusList) {
MigrateManager.getInstance().removeMigerateNode(status.getPhysicalId());
}
}
public List<MigrateStatus> getStatusList() {
return statusList;
}
public void setStatusList(List<MigrateStatus> statusList) {
this.statusList = statusList;
}
}