package org.dcache.srm.scheduler;
import com.google.common.collect.ImmutableMap;
import java.util.Collection;
import java.util.Map.Entry;
import org.dcache.srm.request.Job;
/**
* The SchedulerContainer class groups together different Scheduler objects
* and allows operations that can (potentially) span more than one scheduler.
*/
public class SchedulerContainer
{
private ImmutableMap<Class<? extends Job>, Scheduler<?>> schedulers;
public SchedulerContainer()
{
schedulers = ImmutableMap.of();
}
public SchedulerContainer(Scheduler<?>... schedulers)
{
ImmutableMap.Builder<Class<? extends Job>, Scheduler<?>> builder =
ImmutableMap.builder();
for (Scheduler<?> scheduler : schedulers) {
builder.put(scheduler.getType(), scheduler);
}
this.schedulers = builder.build();
}
public void setSchedulers(Collection<Scheduler<?>> schedulers)
{
ImmutableMap.Builder<Class<? extends Job>, Scheduler<?>> builder =
ImmutableMap.builder();
for (Scheduler<?> scheduler : schedulers) {
builder.put(scheduler.getType(), scheduler);
}
this.schedulers = builder.build();
}
public double getLoad(Class<? extends Job> type)
{
return getScheduler(type).getLoad();
}
public void setMaxReadyJobs(Class<? extends Job> type, int value)
{
Scheduler<?> scheduler = getScheduler(type);
scheduler.setMaxReadyJobs(value);
}
public void schedule(Job job) throws InterruptedException, IllegalStateException, IllegalStateTransition
{
Scheduler<?> scheduler = getScheduler(job.getSchedulerType());
job.scheduleWith(scheduler);
}
private Scheduler<?> getScheduler(Class<? extends Job> type)
{
return getScheduler(null, type);
}
private Scheduler<?> getScheduler(Scheduler<?> suggestion, Class<? extends Job> type)
throws UnsupportedOperationException
{
if (suggestion == null || !suggestion.getType().isAssignableFrom(type)) {
for (Entry<Class<? extends Job>, Scheduler<?>> entry : schedulers.entrySet()) {
if (entry.getKey().isAssignableFrom(type)) {
suggestion = entry.getValue();
break;
}
}
}
if (suggestion == null) {
throw new UnsupportedOperationException("Scheduler for " + type +
" is not supported");
}
return suggestion;
}
public CharSequence getInfo()
{
StringBuilder sb = new StringBuilder();
for (Scheduler<?> scheduler : schedulers.values()) {
scheduler.getInfo(sb);
}
return sb;
}
public CharSequence getDetailedInfo(Class<? extends Job> type)
{
Scheduler<?> scheduler = getScheduler(type);
StringBuilder sb = new StringBuilder();
scheduler.printThreadQueue(sb);
scheduler.printReadyQueue(sb);
return sb;
}
public void restoreJobsOnSrmStart(Iterable<? extends Job> activeJobs, boolean shouldFailJobs)
{
Scheduler<?> scheduler = null;
for (Job job : activeJobs) {
scheduler = getScheduler(scheduler, job.getSchedulerType());
if (scheduler.getId().equals(job.getSchedulerId())) {
job.onSrmRestart(scheduler, shouldFailJobs);
} // else another SRM instance is handling this job
}
}
}