ResourceRequestDeniedException {
final String invalidResponse = "Implementation problem: slot " +
"manager returned invalid response";
final Reservation res = this.slotManager.reserveSpace(req, preemptable);
if (res == null) {
throw new ResourceRequestDeniedException(
invalidResponse + ": null response");
}
if (res.getResponseLength() == 0) {
// Because reserveSpace will throw a request denied exception
// if there was a problem asking for space, no node assignments
// here we assume means best effort behavior is being used.
// Check that assumption:
if (!this.slotManager.isBestEffort()) {
throw new ResourceRequestDeniedException(
invalidResponse + ": no address(es) were returned " +
"but not using a best-effort slot manager");
}
return res;
}
// otherwise, this will be a 'concrete' reservation
if (res.getResponseLength() != req.getIds().length) {
logger.fatal("node selection response is length " +
res.getResponseLength() +
" which does not match requested length " +
req.getIds().length + " -- attempting backout.");
for (int i = 0; i < req.getIds().length; i++) {
try {
this.slotManager.releaseSpace(req.getIds()[i]);
} catch (ManageException e) {
if (logger.isDebugEnabled()) {
logger.error(e.getMessage(), e);
} else {
logger.error(e.getMessage());
}
}
}
throw new ResourceRequestDeniedException(
"internal service error when reserving space");
}
final Calendar start = Calendar.getInstance();
final Calendar stop = Calendar.getInstance();
stop.add(Calendar.SECOND, req.getDuration());
res.setStartTime(start);
res.setStopTime(stop);
for (int i = 0; i < req.getIds().length; i++) {
this.db.scheduleTasks(req.getIds()[i], stop);
}