blob: d804198f5b3c0f835997af6693360b8376ccd865 [file] [log] [blame]
/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aurora.scheduler.state;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Multimap;
import com.google.common.eventbus.Subscribe;
import org.apache.aurora.scheduler.base.Tasks;
import org.apache.aurora.scheduler.events.PubsubEvent;
import org.apache.aurora.scheduler.events.PubsubEvent.TaskStateChange;
import org.apache.aurora.scheduler.preemptor.PreemptionVictim;
/**
* A cached view of cluster state, kept up to date by pubsub notifications.
*/
public class ClusterStateImpl implements ClusterState, PubsubEvent.EventSubscriber {
private final Multimap<String, PreemptionVictim> victims = HashMultimap.create();
@Override
public Multimap<String, PreemptionVictim> getSlavesToActiveTasks() {
synchronized (victims) {
return ImmutableSetMultimap.copyOf(victims);
}
}
@Subscribe
public void taskChangedState(TaskStateChange stateChange) {
synchronized (victims) {
String slaveId = stateChange.getTask().getAssignedTask().getSlaveId();
PreemptionVictim victim = PreemptionVictim.fromTask(stateChange.getTask().getAssignedTask());
if (Tasks.SLAVE_ASSIGNED_STATES.contains(stateChange.getNewState())) {
victims.put(slaveId, victim);
} else {
victims.remove(slaveId, victim);
}
}
}
}