use of com.vip.saturn.job.console.domain.container.ContainerScaleJob in project Saturn by vipshop.
the class DashboardServiceImpl method isContainerInstanceMismatch.
private AbnormalContainer isContainerInstanceMismatch(AbnormalContainer abnormalContainer, CuratorFrameworkOp curatorFrameworkOp) {
try {
String taskId = abnormalContainer.getTaskId();
String dcosTaskConfigNodePath = ContainerNodePath.getDcosTaskConfigNodePath(taskId);
long configMtime = curatorFrameworkOp.getMtime(dcosTaskConfigNodePath);
String dcosTaskScaleJobsNodePath = ContainerNodePath.getDcosTaskScaleJobsNodePath(taskId);
List<String> scaleJobs = curatorFrameworkOp.getChildren(dcosTaskScaleJobsNodePath);
long maxItemMtime = 0L;
String lastScalaJob = null;
if (scaleJobs != null && !taskId.isEmpty()) {
for (String scaleJob : scaleJobs) {
// 如果存在running节点,则不做检查
if (curatorFrameworkOp.checkExists(JobNodePath.getExecutionNodePath(scaleJob, "0", "running"))) {
return null;
}
String completedNodePath = JobNodePath.getExecutionNodePath(scaleJob, "0", "completed");
long completedMtime = curatorFrameworkOp.getMtime(completedNodePath);
if (completedMtime > maxItemMtime) {
lastScalaJob = scaleJob;
maxItemMtime = completedMtime;
}
}
}
Integer myInstance = -1;
long lastMtime = 0L;
if (configMtime > maxItemMtime) {
String taskConfigData = curatorFrameworkOp.getData(dcosTaskConfigNodePath);
if (taskConfigData != null && taskConfigData.trim().length() > 0) {
ContainerConfig containerConfig = JSON.parseObject(taskConfigData, ContainerConfig.class);
myInstance = containerConfig.getInstances();
lastMtime = configMtime;
}
} else if (configMtime < maxItemMtime) {
String dcosTaskScaleJobNodePath = ContainerNodePath.getDcosTaskScaleJobNodePath(taskId, lastScalaJob);
String scaleJobData = curatorFrameworkOp.getData(dcosTaskScaleJobNodePath);
if (scaleJobData != null && scaleJobData.trim().length() > 0) {
ContainerScaleJob containerScaleJob = JSON.parseObject(scaleJobData, ContainerScaleJob.class);
myInstance = containerScaleJob.getContainerScaleJobConfig().getInstances();
lastMtime = maxItemMtime;
}
}
if (myInstance != -1) {
boolean timeAllowed = Math.abs(System.currentTimeMillis() - lastMtime) <= ALLOW_CONTAINER_DELAY_MILLIONSECONDS;
if (timeAllowed) {
return null;
}
int count = containerService.getContainerRunningInstances(taskId, curatorFrameworkOp);
if (myInstance != count) {
abnormalContainer.setCause(AbnormalContainer.Cause.CONTAINER_INSTANCE_MISMATCH.name());
abnormalContainer.setConfigInstances(myInstance);
abnormalContainer.setRunningInstances(count);
try {
reportAlarmService.dashboardContainerInstancesMismatch(abnormalContainer.getDomainName(), abnormalContainer.getTaskId(), abnormalContainer.getConfigInstances(), abnormalContainer.getRunningInstances());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return abnormalContainer;
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
Aggregations