package com.hubspot.singularity.scheduler;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.hubspot.singularity.SingularityDeleteResult;
import com.hubspot.singularity.config.SingularityConfiguration;
import com.hubspot.singularity.data.TaskManager;
import com.hubspot.singularity.data.UsageManager;
public class SingularityUsageCleanerPoller extends SingularityLeaderOnlyPoller {
private static final Logger LOG = LoggerFactory.getLogger(SingularityUsageCleanerPoller.class);
private final SingularityUsageHelper usageHelper;
private final UsageManager usageManager;
private final TaskManager taskManager;
@Inject
SingularityUsageCleanerPoller(SingularityConfiguration configuration, SingularityUsageHelper usageHelper, UsageManager usageManager, TaskManager taskManager) {
super(configuration.getCleanUsageEveryMillis(), TimeUnit.MILLISECONDS);
this.usageHelper = usageHelper;
this.usageManager = usageManager;
this.taskManager = taskManager;
}
@Override
public void runActionOnPoll() {
deleteObsoleteSlaveUsage();
deleteObsoleteTaskUsage();
}
private void deleteObsoleteSlaveUsage() {
Set<String> slaveIdsToTrackUsageFor = usageHelper.getSlaveIdsToTrackUsageFor();
for (String slaveIdWithUsage : usageManager.getSlavesWithUsage()) {
if (slaveIdsToTrackUsageFor.contains(slaveIdWithUsage)) {
continue;
}
SingularityDeleteResult result = usageManager.deleteSlaveUsage(slaveIdWithUsage);
LOG.debug("Deleted obsolete slave usage {} - {}", slaveIdWithUsage, result);
}
}
private void deleteObsoleteTaskUsage() {
Set<String> taskIds = new HashSet<>(taskManager.getActiveTaskIdsAsStrings());
List<String> taskIdsWithUsage = usageManager.getTasksWithUsage();
for (String taskIdWithUsage : taskIdsWithUsage) {
if (taskIds.contains(taskIdWithUsage)) {
continue;
}
SingularityDeleteResult result = usageManager.deleteTaskUsage(taskIdWithUsage);
LOG.debug("Deleted obsolete task usage {} - {}", taskIdWithUsage, result);
}
}
}