use of com.hubspot.singularity.SingularityPendingTaskId in project Singularity by HubSpot.
the class SingularityWebCache method cachePendingTasks.
public void cachePendingTasks(List<SingularityPendingTask> pendingTasks) {
pendingMissMeter.mark();
Map<SingularityPendingTaskId, SingularityPendingTask> newPendingTasks = new HashMap<>(pendingTasks.size());
for (SingularityPendingTask pendingTask : pendingTasks) {
newPendingTasks.put(pendingTask.getPendingTaskId(), pendingTask);
}
cachedPendingTasks = newPendingTasks;
lastPendingTaskCache = System.currentTimeMillis();
}
use of com.hubspot.singularity.SingularityPendingTaskId in project Singularity by HubSpot.
the class StateManager method getNumTasks.
private Map<String, Long> getNumTasks(List<SingularityRequestWithState> requests) {
final CounterMap<String> numTasks = new CounterMap<>(requests.size());
for (SingularityTaskId taskId : taskManager.getActiveTaskIds()) {
numTasks.incr(taskId.getRequestId());
}
for (SingularityPendingTaskId pendingTaskId : taskManager.getPendingTaskIds()) {
numTasks.incr(pendingTaskId.getRequestId());
}
for (SingularityTaskId cleaningTaskId : taskManager.getCleanupTaskIds()) {
Optional<SingularityRequestWithState> request = requestManager.getRequest(cleaningTaskId.getRequestId());
if (request.isPresent() && request.get().getRequest().isScheduled()) {
continue;
}
numTasks.decr(cleaningTaskId.getRequestId());
}
return numTasks.toCountMap();
}
use of com.hubspot.singularity.SingularityPendingTaskId in project Singularity by HubSpot.
the class SingularityMesosOfferScheduler method checkOffers.
public Collection<SingularityOfferHolder> checkOffers(final Collection<Offer> offers) {
for (SingularityPendingTaskId taskId : taskManager.getPendingTasksMarkedForDeletion()) {
lock.runWithRequestLock(() -> taskManager.deletePendingTask(taskId), taskId.getRequestId(), String.format("%s#%s", getClass().getSimpleName(), "checkOffers -> pendingTaskDeletes"));
}
scheduler.checkForDecomissions();
scheduler.drainPendingQueue();
if (offers.isEmpty()) {
LOG.debug("No offers to check");
return Collections.emptyList();
}
final List<SingularityTaskRequestHolder> sortedTaskRequestHolders = getSortedDueTaskRequests();
final int numDueTasks = sortedTaskRequestHolders.size();
final Map<String, SingularityOfferHolder> offerHolders = offers.stream().collect(Collectors.groupingBy((o) -> o.getAgentId().getValue())).entrySet().stream().filter((e) -> e.getValue().size() > 0).map((e) -> {
List<Offer> offersList = e.getValue();
String slaveId = e.getKey();
return new SingularityOfferHolder(offersList, numDueTasks, slaveAndRackHelper.getRackIdOrDefault(offersList.get(0)), slaveId, offersList.get(0).getHostname(), slaveAndRackHelper.getTextAttributes(offersList.get(0)), slaveAndRackHelper.getReservedSlaveAttributes(offersList.get(0)));
}).collect(Collectors.toMap(SingularityOfferHolder::getSlaveId, Function.identity()));
if (sortedTaskRequestHolders.isEmpty()) {
return offerHolders.values();
}
final AtomicInteger tasksScheduled = new AtomicInteger(0);
Map<String, RequestUtilization> requestUtilizations = usageManager.getRequestUtilizations();
List<SingularityTaskId> activeTaskIds = taskManager.getActiveTaskIds();
final Map<String, SingularitySlaveUsageWithCalculatedScores> currentSlaveUsagesBySlaveId = usageManager.getCurrentSlaveUsages(offerHolders.values().stream().map(SingularityOfferHolder::getSlaveId).collect(Collectors.toList())).parallelStream().collect(Collectors.toMap(SingularitySlaveUsageWithId::getSlaveId, (usageWithId) -> new SingularitySlaveUsageWithCalculatedScores(usageWithId, configuration.getMesosConfiguration().getScoringStrategy(), configuration.getMesosConfiguration().getScoreUsingSystemLoad(), getMaxProbableUsageForSlave(activeTaskIds, requestUtilizations, offerHolders.get(usageWithId.getSlaveId()).getSanitizedHost()))));
LOG.trace("Found slave usages {}", currentSlaveUsagesBySlaveId);
Map<String, Integer> tasksPerOfferHost = new ConcurrentHashMap<>();
for (SingularityTaskRequestHolder taskRequestHolder : sortedTaskRequestHolders) {
lock.runWithRequestLock(() -> {
Map<String, Double> scorePerOffer = new ConcurrentHashMap<>();
List<SingularityTaskId> activeTaskIdsForRequest = leaderCache.getActiveTaskIdsForRequest(taskRequestHolder.getTaskRequest().getRequest().getId());
List<CompletableFuture<Void>> scoringFutures = new ArrayList<>();
AtomicReference<Throwable> scoringException = new AtomicReference<>(null);
for (SingularityOfferHolder offerHolder : offerHolders.values()) {
if (!isOfferFull(offerHolder)) {
scoringFutures.add(offerScoringSemaphore.call(() -> CompletableFuture.runAsync(() -> {
try {
double score = calculateScore(offerHolder, currentSlaveUsagesBySlaveId, tasksPerOfferHost, taskRequestHolder, activeTaskIdsForRequest);
if (score != 0) {
scorePerOffer.put(offerHolder.getSlaveId(), score);
}
} catch (Throwable t) {
LOG.error("Uncaught exception while scoring offers", t);
scoringException.set(t);
}
}, offerScoringExecutor)));
}
}
CompletableFutures.allOf(scoringFutures).join();
if (scoringException.get() != null) {
LOG.warn("Exception caught in offer scoring futures, semaphore info: (concurrentRequests: {}, queueSize: {})", offerScoringSemaphore.getConcurrentRequests(), offerScoringSemaphore.getQueueSize());
// This will be caught by either the LeaderOnlyPoller or resourceOffers uncaught exception code, causing an abort
throw new RuntimeException(scoringException.get());
}
if (!scorePerOffer.isEmpty()) {
SingularityOfferHolder bestOffer = offerHolders.get(Collections.max(scorePerOffer.entrySet(), Map.Entry.comparingByValue()).getKey());
LOG.info("Best offer {}/1 is on {}", scorePerOffer.get(bestOffer.getSlaveId()), bestOffer.getSanitizedHost());
SingularityMesosTaskHolder taskHolder = acceptTask(bestOffer, tasksPerOfferHost, taskRequestHolder);
tasksScheduled.getAndIncrement();
bestOffer.addMatchedTask(taskHolder);
updateSlaveUsageScores(taskRequestHolder, currentSlaveUsagesBySlaveId, bestOffer.getSlaveId(), requestUtilizations);
}
}, taskRequestHolder.getTaskRequest().getRequest().getId(), String.format("%s#%s", getClass().getSimpleName(), "checkOffers"));
}
LOG.info("{} tasks scheduled, {} tasks remaining after examining {} offers", tasksScheduled, numDueTasks - tasksScheduled.get(), offers.size());
return offerHolders.values();
}
use of com.hubspot.singularity.SingularityPendingTaskId in project Singularity by HubSpot.
the class SingularityCmdLineArgsMigration method checkPendingTasks.
private void checkPendingTasks() {
try {
if (curator.checkExists().forPath(TASK_PENDING_PATH) == null) {
return;
}
} catch (Exception e) {
throw Throwables.propagate(e);
}
try {
for (SingularityPendingTaskId pendingTaskId : taskManager.getPendingTaskIds()) {
Optional<String> cmdLineArgs = getCmdLineArgs(pendingTaskId);
SingularityCreateResult result = taskManager.savePendingTask(new SingularityPendingTaskBuilder().setPendingTaskId(pendingTaskId).setCmdLineArgsList(getCmdLineArgs(cmdLineArgs)).build());
LOG.info("Saving {} ({}) {}", pendingTaskId, cmdLineArgs, result);
}
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
use of com.hubspot.singularity.SingularityPendingTaskId in project Singularity by HubSpot.
the class SingularityPendingTaskIdMigration method applyMigration.
@Override
public void applyMigration() {
final long start = System.currentTimeMillis();
try {
if (curator.checkExists().forPath(PENDING_TASKS_ROOT) == null) {
return;
}
} catch (Exception e) {
throw Throwables.propagate(e);
}
try {
for (String pendingTaskId : curator.getChildren().forPath(PENDING_TASKS_ROOT)) {
SingularityPendingTaskId newPendingTaskId = createFrom(pendingTaskId, start);
if (!newPendingTaskId.toString().equals(pendingTaskId)) {
LOG.info("Migrating {} to {}", pendingTaskId, newPendingTaskId);
Optional<String> cmdLineArgs = getCmdLineArgs(pendingTaskId);
taskManager.savePendingTask(new SingularityPendingTaskBuilder().setPendingTaskId(newPendingTaskId).setCmdLineArgsList(cmdLineArgs.isPresent() ? Optional.of(Collections.singletonList(cmdLineArgs.get())) : Optional.<List<String>>absent()).build());
curator.delete().forPath(ZKPaths.makePath(PENDING_TASKS_ROOT, pendingTaskId));
}
}
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
Aggregations