package org.apache.hadoop.corona;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Scheduler {
public static final Log LOG = LogFactory.getLog(Scheduler.class);
final private Map<String, SchedulerForType> schedulersForTypes;
final private ConfigManager configManager;
final private Collection<String> types;
private CoronaConf conf;
public Scheduler(NodeManager nodeManager, SessionManager sessionManager,
SessionNotifier sessionNotifier, Collection<String> types) {
this(nodeManager, sessionManager, sessionNotifier, types,
new ConfigManager(types));
}
/**
* Used by unit test to fake the ConfigManager
*/
public Scheduler(NodeManager nodeManager, SessionManager sessionManager,
SessionNotifier sessionNotifier, Collection<String> types,
ConfigManager configManager) {
this.configManager = configManager;
this.schedulersForTypes = new HashMap<String, SchedulerForType>();
this.types = types;
for (String type : types) {
SchedulerForType schedulerForType = new SchedulerForType(
type, sessionManager, sessionNotifier, nodeManager, configManager);
schedulerForType.setDaemon(true);
schedulerForType.setName("Scheduler-" + type);
schedulersForTypes.put(type, schedulerForType);
}
}
public void addSession(String id, Session session) {
for (SchedulerForType scheduleThread : schedulersForTypes.values()) {
scheduleThread.addSession(id, session);
}
}
public void start() {
for (Thread schedulerForType : schedulersForTypes.values()) {
LOG.info("Starting " + schedulerForType.getName());
schedulerForType.start();
}
configManager.start();
}
public void setConf(CoronaConf conf) {
this.conf = conf;
}
public CoronaConf getConf() {
return conf;
}
public void close() {
for (SchedulerForType scheduleThread : schedulersForTypes.values()) {
scheduleThread.close();
}
for (Thread scheduleThread : schedulersForTypes.values()) {
Utilities.waitThreadTermination(scheduleThread);
}
configManager.close();
}
public void notifyScheduler() {
for (SchedulerForType scheduleThread : schedulersForTypes.values()) {
synchronized (scheduleThread) {
scheduleThread.notifyAll();
}
}
}
public Map<String, PoolMetrics> getPoolMetrics(String type) {
return schedulersForTypes.get(type).getPoolMetrics();
}
public List<String> getPoolNames() {
Set<String> poolNames = new HashSet<String>();
for (String type : types) {
poolNames.addAll(getPoolMetrics(type).keySet());
}
List<String> result = new ArrayList<String>();
result.addAll(poolNames);
Collections.sort(result);
return result;
}
}