You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by go...@apache.org on 2016/08/25 20:19:46 UTC
[17/46] incubator-slider git commit: SLIDER-1165 Create
yarn-native-services branch on Slider corresponding to the
yarn-native-services branch on Hadoop
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
deleted file mode 100644
index 37e9a7f..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.api.records.ContainerId;
-import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
-import org.apache.slider.api.ClusterDescription;
-import org.apache.slider.api.ClusterNode;
-import org.apache.slider.api.types.ApplicationLivenessInformation;
-import org.apache.slider.api.types.ComponentInformation;
-import org.apache.slider.api.types.NodeInformation;
-import org.apache.slider.api.types.RoleStatistics;
-import org.apache.slider.core.conf.AggregateConf;
-import org.apache.slider.core.conf.ConfTreeOperations;
-import org.apache.slider.core.exceptions.NoSuchNodeException;
-import org.apache.slider.core.registry.docstore.PublishedConfigSet;
-import org.apache.slider.core.registry.docstore.PublishedExportsSet;
-import org.apache.slider.server.appmaster.web.rest.RestPaths;
-import org.apache.slider.server.services.utility.PatternValidator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Implementation of {@link StateAccessForProviders}, which means
- * state access for providers, web UI and IPC/REST views.
- */
-public class ProviderAppState implements StateAccessForProviders {
-
-
- private final Map<String, PublishedConfigSet> publishedConfigSets =
- new ConcurrentHashMap<>(5);
- private final PublishedExportsSet publishedExportsSets = new PublishedExportsSet();
- private static final PatternValidator validator = new PatternValidator(
- RestPaths.PUBLISHED_CONFIGURATION_SET_REGEXP);
- private String applicationName;
-
- private final AppState appState;
-
- public ProviderAppState(String applicationName, AppState appState) {
- this.appState = appState;
- this.applicationName = applicationName;
- }
-
- public void setApplicationName(String applicationName) {
- this.applicationName = applicationName;
- }
-
- @Override
- public String getApplicationName() {
- return applicationName;
- }
-
- @Override
- public PublishedConfigSet getPublishedSliderConfigurations() {
- return getOrCreatePublishedConfigSet(RestPaths.SLIDER_CONFIGSET);
- }
-
- @Override
- public PublishedExportsSet getPublishedExportsSet() {
- return publishedExportsSets;
- }
-
- @Override
- public PublishedConfigSet getPublishedConfigSet(String name) {
- return publishedConfigSets.get(name);
- }
-
- @Override
- public PublishedConfigSet getOrCreatePublishedConfigSet(String name) {
- PublishedConfigSet set = publishedConfigSets.get(name);
- if (set == null) {
- validator.validate(name);
- synchronized (publishedConfigSets) {
- // synchronized double check to ensure that there is never an overridden
- // config set created
- set = publishedConfigSets.get(name);
- if (set == null) {
- set = new PublishedConfigSet();
- publishedConfigSets.put(name, set);
- }
- }
- }
- return set;
- }
-
- @Override
- public List<String> listConfigSets() {
-
- synchronized (publishedConfigSets) {
- List<String> sets = new ArrayList<>(publishedConfigSets.keySet());
- return sets;
- }
- }
-
- @Override
- public Map<Integer, RoleStatus> getRoleStatusMap() {
- return appState.getRoleStatusMap();
- }
-
-
- @Override
- public Map<ContainerId, RoleInstance> getFailedContainers() {
- return appState.getFailedContainers();
- }
-
- @Override
- public Map<ContainerId, RoleInstance> getLiveContainers() {
- return appState.getLiveContainers();
- }
-
- @Override
- public ClusterDescription getClusterStatus() {
- return appState.getClusterStatus();
- }
-
- @Override
- public ConfTreeOperations getResourcesSnapshot() {
- return appState.getResourcesSnapshot();
- }
-
- @Override
- public ConfTreeOperations getAppConfSnapshot() {
- return appState.getAppConfSnapshot();
- }
-
- @Override
- public ConfTreeOperations getInternalsSnapshot() {
- return appState.getInternalsSnapshot();
- }
-
- @Override
- public boolean isApplicationLive() {
- return appState.isApplicationLive();
- }
-
- @Override
- public long getSnapshotTime() {
- return appState.getSnapshotTime();
- }
-
- @Override
- public AggregateConf getInstanceDefinitionSnapshot() {
- return appState.getInstanceDefinitionSnapshot();
- }
-
- @Override
- public AggregateConf getUnresolvedInstanceDefinition() {
- return appState.getUnresolvedInstanceDefinition();
- }
-
- @Override
- public RoleStatus lookupRoleStatus(int key) {
- return appState.lookupRoleStatus(key);
- }
-
- @Override
- public RoleStatus lookupRoleStatus(Container c) throws YarnRuntimeException {
- return appState.lookupRoleStatus(c);
- }
-
- @Override
- public RoleStatus lookupRoleStatus(String name) throws YarnRuntimeException {
- return appState.lookupRoleStatus(name);
- }
-
- @Override
- public List<RoleInstance> cloneOwnedContainerList() {
- return appState.cloneOwnedContainerList();
- }
-
- @Override
- public int getNumOwnedContainers() {
- return appState.getNumOwnedContainers();
- }
-
- @Override
- public RoleInstance getOwnedContainer(ContainerId id) {
- return appState.getOwnedContainer(id);
- }
-
- @Override
- public RoleInstance getOwnedContainer(String id) throws NoSuchNodeException {
- return appState.getOwnedInstanceByContainerID(id);
- }
-
- @Override
- public List<RoleInstance> cloneLiveContainerInfoList() {
- return appState.cloneLiveContainerInfoList();
- }
-
- @Override
- public RoleInstance getLiveInstanceByContainerID(String containerId) throws
- NoSuchNodeException {
- return appState.getLiveInstanceByContainerID(containerId);
- }
-
- @Override
- public List<RoleInstance> getLiveInstancesByContainerIDs(Collection<String> containerIDs) {
- return appState.getLiveInstancesByContainerIDs(containerIDs);
- }
-
- @Override
- public ClusterDescription refreshClusterStatus() {
- return appState.refreshClusterStatus();
- }
-
- @Override
- public List<RoleStatus> cloneRoleStatusList() {
- return appState.cloneRoleStatusList();
- }
-
- @Override
- public ApplicationLivenessInformation getApplicationLivenessInformation() {
- return appState.getApplicationLivenessInformation();
- }
-
- @Override
- public Map<String, Integer> getLiveStatistics() {
- return appState.getLiveStatistics();
- }
-
- @Override
- public Map<String, ComponentInformation> getComponentInfoSnapshot() {
- return appState.getComponentInfoSnapshot();
- }
-
- @Override
- public Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping() {
- return appState.createRoleToClusterNodeMap();
- }
-
- @Override
- public List<RoleInstance> enumLiveInstancesInRole(String role) {
- List<RoleInstance> nodes = new ArrayList<>();
- Collection<RoleInstance> allRoleInstances = cloneLiveContainerInfoList();
- for (RoleInstance node : allRoleInstances) {
- if (role.isEmpty() || role.equals(node.role)) {
- nodes.add(node);
- }
- }
- return nodes;
- }
-
- @Override
- public List<RoleInstance> lookupRoleContainers(String component) {
- RoleStatus roleStatus = lookupRoleStatus(component);
- List<RoleInstance> ownedContainerList = cloneOwnedContainerList();
- List<RoleInstance> matching = new ArrayList<>(ownedContainerList.size());
- int roleId = roleStatus.getPriority();
- for (RoleInstance instance : ownedContainerList) {
- if (instance.roleId == roleId) {
- matching.add(instance);
- }
- }
- return matching;
- }
-
- @Override
- public ComponentInformation getComponentInformation(String component) {
- RoleStatus roleStatus = lookupRoleStatus(component);
- ComponentInformation info = roleStatus.serialize();
- List<RoleInstance> containers = lookupRoleContainers(component);
- info.containers = new ArrayList<>(containers.size());
- for (RoleInstance container : containers) {
- info.containers.add(container.id);
- }
- return info;
- }
-
- @Override
- public Map<String, NodeInformation> getNodeInformationSnapshot() {
- return appState.getRoleHistory()
- .getNodeInformationSnapshot(appState.buildNamingMap());
- }
-
- @Override
- public NodeInformation getNodeInformation(String hostname) {
- return appState.getRoleHistory()
- .getNodeInformation(hostname, appState.buildNamingMap());
- }
-
- @Override
- public RoleStatistics getRoleStatistics() {
- return appState.getRoleStatistics();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
deleted file mode 100644
index 4e8a4d7..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
+++ /dev/null
@@ -1,1101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.api.records.NodeReport;
-import org.apache.hadoop.yarn.api.records.NodeState;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.slider.api.types.NodeInformation;
-import org.apache.slider.common.tools.SliderUtils;
-import org.apache.slider.core.exceptions.BadConfigException;
-import org.apache.slider.providers.ProviderRole;
-import org.apache.slider.server.appmaster.management.BoolMetric;
-import org.apache.slider.server.appmaster.management.MetricsAndMonitoring;
-import org.apache.slider.server.appmaster.management.Timestamp;
-import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
-import org.apache.slider.server.avro.LoadedRoleHistory;
-import org.apache.slider.server.avro.NodeEntryRecord;
-import org.apache.slider.server.avro.RoleHistoryHeader;
-import org.apache.slider.server.avro.RoleHistoryWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * The Role History.
- * <p>
- * Synchronization policy: all public operations are synchronized.
- * Protected methods are in place for testing -no guarantees are made.
- * <p>
- * Inner classes have no synchronization guarantees; they should be manipulated
- * in these classes and not externally.
- * <p>
- * Note that as well as some methods marked visible for testing, there
- * is the option for the time generator method, {@link #now()} to
- * be overridden so that a repeatable time series can be used.
- *
- */
-public class RoleHistory {
- protected static final Logger log =
- LoggerFactory.getLogger(RoleHistory.class);
- private final List<ProviderRole> providerRoles;
- /** the roles in here are shared with App State */
- private final Map<Integer, RoleStatus> roleStatusMap = new HashMap<>();
- private final AbstractClusterServices recordFactory;
-
- private long startTime;
-
- /** Time when saved */
- private final Timestamp saveTime = new Timestamp(0);
-
- /** If the history was loaded, the time at which the history was saved.
- * That is: the time the data was valid */
- private final Timestamp thawedDataTime = new Timestamp(0);
-
- private NodeMap nodemap;
- private int roleSize;
- private final BoolMetric dirty = new BoolMetric(false);
- private FileSystem filesystem;
- private Path historyPath;
- private RoleHistoryWriter historyWriter = new RoleHistoryWriter();
-
- /**
- * When were the nodes updated in a {@link #onNodesUpdated(List)} call?
- * If zero: never.
- */
- private final Timestamp nodesUpdatedTime = new Timestamp(0);
- private final BoolMetric nodeUpdateReceived = new BoolMetric(false);
-
- private OutstandingRequestTracker outstandingRequests =
- new OutstandingRequestTracker();
-
- /**
- * For each role, lists nodes that are available for data-local allocation,
- * ordered by more recently released - to accelerate node selection.
- * That is, they are "recently used nodes"
- */
- private Map<Integer, LinkedList<NodeInstance>> recentNodes;
-
- /**
- * Instantiate
- * @param roles initial role list
- * @param recordFactory yarn record factory
- * @throws BadConfigException
- */
- public RoleHistory(Collection<RoleStatus> roles, AbstractClusterServices recordFactory) throws BadConfigException {
- this.recordFactory = recordFactory;
- roleSize = roles.size();
- providerRoles = new ArrayList<>(roleSize);
- for (RoleStatus role : roles) {
- addNewRole(role);
- }
- reset();
- }
-
- /**
- * Reset the variables -this does not adjust the fixed attributes
- * of the history, but the nodemap and failed node map are cleared.
- */
- protected synchronized void reset() throws BadConfigException {
-
- nodemap = new NodeMap(roleSize);
- resetAvailableNodeLists();
- outstandingRequests = new OutstandingRequestTracker();
- }
-
- /**
- * Register all metrics with the metrics infra
- * @param metrics metrics
- */
- public void register(MetricsAndMonitoring metrics) {
- metrics.register(RoleHistory.class, dirty, "dirty");
- metrics.register(RoleHistory.class, nodesUpdatedTime, "nodes-updated.time");
- metrics.register(RoleHistory.class, nodeUpdateReceived, "nodes-updated.flag");
- metrics.register(RoleHistory.class, thawedDataTime, "thawed.time");
- metrics.register(RoleHistory.class, saveTime, "saved.time");
- }
-
- /**
- * safety check: make sure the role is unique amongst
- * the role stats...which is extended with the new role
- * @param roleStatus role
- * @throws ArrayIndexOutOfBoundsException
- * @throws BadConfigException
- */
- protected void putRole(RoleStatus roleStatus) throws BadConfigException {
- int index = roleStatus.getKey();
- if (index < 0) {
- throw new BadConfigException("Provider " + roleStatus + " id is out of range");
- }
- if (roleStatusMap.get(index) != null) {
- throw new BadConfigException(
- roleStatus.toString() + " id duplicates that of " +
- roleStatusMap.get(index));
- }
- roleStatusMap.put(index, roleStatus);
- }
-
- /**
- * Add a new role
- * @param roleStatus new role
- */
- public void addNewRole(RoleStatus roleStatus) throws BadConfigException {
- log.debug("Validating/adding new role to role history: {} ", roleStatus);
- putRole(roleStatus);
- this.providerRoles.add(roleStatus.getProviderRole());
- }
-
- /**
- * Lookup a role by ID
- * @param roleId role Id
- * @return role or null if not found
- */
- public ProviderRole lookupRole(int roleId) {
- for (ProviderRole role : providerRoles) {
- if (role.id == roleId) {
- return role;
- }
- }
- return null;
- }
-
- /**
- * Clear the lists of available nodes
- */
- private synchronized void resetAvailableNodeLists() {
- recentNodes = new ConcurrentHashMap<>(roleSize);
- }
-
- /**
- * Prepare the history for re-reading its state.
- * <p>
- * This intended for use by the RoleWriter logic.
- * @throws BadConfigException if there is a problem rebuilding the state
- */
- private void prepareForReading(RoleHistoryHeader header)
- throws BadConfigException {
- reset();
-
- int roleCountInSource = header.getRoles();
- if (roleCountInSource != roleSize) {
- log.warn("Number of roles in source {}"
- +" does not match the expected number of {}",
- roleCountInSource,
- roleSize);
- }
- //record when the data was loaded
- setThawedDataTime(header.getSaved());
- }
-
- /**
- * rebuild the placement history from the loaded role history
- * @param loadedRoleHistory loaded history
- * @return the number of entries discarded
- * @throws BadConfigException if there is a problem rebuilding the state
- */
- @VisibleForTesting
- public synchronized int rebuild(LoadedRoleHistory loadedRoleHistory) throws BadConfigException {
- RoleHistoryHeader header = loadedRoleHistory.getHeader();
- prepareForReading(header);
- int discarded = 0;
- Long saved = header.getSaved();
- for (NodeEntryRecord nodeEntryRecord : loadedRoleHistory.records) {
- Integer roleId = nodeEntryRecord.getRole();
- NodeEntry nodeEntry = new NodeEntry(roleId);
- nodeEntry.setLastUsed(nodeEntryRecord.getLastUsed());
- if (nodeEntryRecord.getActive()) {
- //if active at the time of save, make the last used time the save time
- nodeEntry.setLastUsed(saved);
- }
- String hostname = SliderUtils.sequenceToString(nodeEntryRecord.getHost());
- ProviderRole providerRole = lookupRole(roleId);
- if (providerRole == null) {
- // discarding entry
- log.info("Discarding history entry with unknown role: {} on host {}",
- roleId, hostname);
- discarded ++;
- } else {
- NodeInstance instance = getOrCreateNodeInstance(hostname);
- instance.set(roleId, nodeEntry);
- }
- }
- return discarded;
- }
-
- public synchronized long getStartTime() {
- return startTime;
- }
-
- public synchronized long getSaveTime() {
- return saveTime.get();
- }
-
- public long getThawedDataTime() {
- return thawedDataTime.get();
- }
-
- public void setThawedDataTime(long thawedDataTime) {
- this.thawedDataTime.set(thawedDataTime);
- }
-
- public synchronized int getRoleSize() {
- return roleSize;
- }
-
- /**
- * Get the total size of the cluster -the number of NodeInstances
- * @return a count
- */
- public synchronized int getClusterSize() {
- return nodemap.size();
- }
-
- public synchronized boolean isDirty() {
- return dirty.get();
- }
-
- public synchronized void setDirty(boolean dirty) {
- this.dirty.set(dirty);
- }
-
- /**
- * Tell the history that it has been saved; marks itself as clean
- * @param timestamp timestamp -updates the savetime field
- */
- public synchronized void saved(long timestamp) {
- setDirty(false);
- saveTime.set(timestamp);
- }
-
- /**
- * Get a clone of the nodemap.
- * The instances inside are not cloned
- * @return the map
- */
- public synchronized NodeMap cloneNodemap() {
- return (NodeMap) nodemap.clone();
- }
-
- /**
- * Get snapshot of the node map
- * @return a snapshot of the current node state
- * @param naming naming map of priority to enty name; entries must be unique.
- * It's OK to be incomplete, for those the list falls back to numbers.
- */
- public synchronized Map<String, NodeInformation> getNodeInformationSnapshot(
- Map<Integer, String> naming) {
- Map<String, NodeInformation> result = new HashMap<>(nodemap.size());
- for (Map.Entry<String, NodeInstance> entry : nodemap.entrySet()) {
- result.put(entry.getKey(), entry.getValue().serialize(naming));
- }
- return result;
- }
-
- /**
- * Get the information on a node
- * @param hostname hostname
- * @param naming naming map of priority to enty name; entries must be unique.
- * It's OK to be incomplete, for those the list falls back to numbers.
- * @return the information about that host, or null if there is none
- */
- public synchronized NodeInformation getNodeInformation(String hostname,
- Map<Integer, String> naming) {
- NodeInstance nodeInstance = nodemap.get(hostname);
- return nodeInstance != null ? nodeInstance.serialize(naming) : null;
- }
-
- /**
- * Get the node instance for the specific node -creating it if needed
- * @param hostname node address
- * @return the instance
- */
- public synchronized NodeInstance getOrCreateNodeInstance(String hostname) {
- //convert to a string
- return nodemap.getOrCreate(hostname);
- }
-
- /**
- * Insert a list of nodes into the map; overwrite any with that name.
- * This is a bulk operation for testing.
- * Important: this does not update the available node lists, these
- * must be rebuilt afterwards.
- * @param nodes collection of nodes.
- */
- @VisibleForTesting
- public synchronized void insert(Collection<NodeInstance> nodes) {
- nodemap.insert(nodes);
- }
-
- /**
- * Get current time. overrideable for test subclasses
- * @return current time in millis
- */
- protected long now() {
- return System.currentTimeMillis();
- }
-
- /**
- * Mark ourselves as dirty
- */
- public void touch() {
- setDirty(true);
- try {
- saveHistoryIfDirty();
- } catch (IOException e) {
- log.warn("Failed to save history file ", e);
- }
- }
-
- /**
- * reset the failed recently counters
- */
- public synchronized void resetFailedRecently() {
- log.info("Resetting failure history");
- nodemap.resetFailedRecently();
- }
-
- /**
- * Get the path used for history files
- * @return the directory used for history files
- */
- public Path getHistoryPath() {
- return historyPath;
- }
-
- /**
- * Save the history to its location using the timestamp as part of
- * the filename. The saveTime and dirty fields are updated
- * @param time timestamp timestamp to use as the save time
- * @return the path saved to
- * @throws IOException IO problems
- */
- @VisibleForTesting
- public synchronized Path saveHistory(long time) throws IOException {
- Path filename = historyWriter.createHistoryFilename(historyPath, time);
- historyWriter.write(filesystem, filename, true, this, time);
- saved(time);
- return filename;
- }
-
- /**
- * Save the history with the current timestamp if it is dirty;
- * return the path saved to if this is the case
- * @return the path or null if the history was not saved
- * @throws IOException failed to save for some reason
- */
- public synchronized Path saveHistoryIfDirty() throws IOException {
- if (isDirty()) {
- return saveHistory(now());
- } else {
- return null;
- }
- }
-
- /**
- * Start up
- * @param fs filesystem
- * @param historyDir path in FS for history
- * @return true if the history was thawed
- */
- public boolean onStart(FileSystem fs, Path historyDir) throws BadConfigException {
- assert filesystem == null;
- filesystem = fs;
- historyPath = historyDir;
- startTime = now();
- //assume the history is being thawed; this will downgrade as appropriate
- return onThaw();
- }
-
- /**
- * Handler for bootstrap event: there was no history to thaw
- */
- public void onBootstrap() {
- log.debug("Role history bootstrapped");
- }
-
- /**
- * Handle the start process <i>after the history has been rebuilt</i>,
- * and after any gc/purge
- */
- public synchronized boolean onThaw() throws BadConfigException {
- assert filesystem != null;
- assert historyPath != null;
- boolean thawSuccessful = false;
- //load in files from data dir
-
- LoadedRoleHistory loadedRoleHistory = null;
- try {
- loadedRoleHistory = historyWriter.loadFromHistoryDir(filesystem, historyPath);
- } catch (IOException e) {
- log.warn("Exception trying to load history from {}", historyPath, e);
- }
- if (loadedRoleHistory != null) {
- rebuild(loadedRoleHistory);
- thawSuccessful = true;
- Path loadPath = loadedRoleHistory.getPath();
- log.debug("loaded history from {}", loadPath);
- // delete any old entries
- try {
- int count = historyWriter.purgeOlderHistoryEntries(filesystem, loadPath);
- log.debug("Deleted {} old history entries", count);
- } catch (IOException e) {
- log.info("Ignoring exception raised while trying to delete old entries",
- e);
- }
-
- //start is then completed
- buildRecentNodeLists();
- } else {
- //fallback to bootstrap procedure
- onBootstrap();
- }
- return thawSuccessful;
- }
-
-
- /**
- * (After the start), rebuild the availability data structures
- */
- @VisibleForTesting
- public synchronized void buildRecentNodeLists() {
- resetAvailableNodeLists();
- // build the list of available nodes
- for (Map.Entry<String, NodeInstance> entry : nodemap.entrySet()) {
- NodeInstance ni = entry.getValue();
- for (int i = 0; i < roleSize; i++) {
- NodeEntry nodeEntry = ni.get(i);
- if (nodeEntry != null && nodeEntry.isAvailable()) {
- log.debug("Adding {} for role {}", ni, i);
- listRecentNodesForRoleId(i).add(ni);
- }
- }
- }
- // sort the resulting arrays
- for (int i = 0; i < roleSize; i++) {
- sortRecentNodeList(i);
- }
- }
-
- /**
- * Get the nodes for an ID -may be null
- * @param id role ID
- * @return potentially null list
- */
- @VisibleForTesting
- public List<NodeInstance> getRecentNodesForRoleId(int id) {
- return recentNodes.get(id);
- }
-
- /**
- * Get a possibly empty list of suggested nodes for a role.
- * @param id role ID
- * @return list
- */
- private LinkedList<NodeInstance> listRecentNodesForRoleId(int id) {
- LinkedList<NodeInstance> instances = recentNodes.get(id);
- if (instances == null) {
- synchronized (this) {
- // recheck in the synchronized block and recreate
- if (recentNodes.get(id) == null) {
- recentNodes.put(id, new LinkedList<NodeInstance>());
- }
- instances = recentNodes.get(id);
- }
- }
- return instances;
- }
-
- /**
- * Sort a the recent node list for a single role
- * @param role role to sort
- */
- private void sortRecentNodeList(int role) {
- List<NodeInstance> nodesForRoleId = getRecentNodesForRoleId(role);
- if (nodesForRoleId != null) {
- Collections.sort(nodesForRoleId, new NodeInstance.Preferred(role));
- }
- }
-
- /**
- * Find a node for use
- * @param role role
- * @return the instance, or null for none
- */
- @VisibleForTesting
- public synchronized NodeInstance findRecentNodeForNewInstance(RoleStatus role) {
- if (!role.isPlacementDesired()) {
- // no data locality policy
- return null;
- }
- int roleId = role.getKey();
- boolean strictPlacement = role.isStrictPlacement();
- NodeInstance nodeInstance = null;
- // Get the list of possible targets.
- // This is a live list: changes here are preserved
- List<NodeInstance> targets = getRecentNodesForRoleId(roleId);
- if (targets == null) {
- // nothing to allocate on
- return null;
- }
-
- int cnt = targets.size();
- log.debug("There are {} node(s) to consider for {}", cnt, role.getName());
- for (int i = 0; i < cnt && nodeInstance == null; i++) {
- NodeInstance candidate = targets.get(i);
- if (candidate.getActiveRoleInstances(roleId) == 0) {
- // no active instances: check failure statistics
- if (strictPlacement
- || (candidate.isOnline() && !candidate.exceedsFailureThreshold(role))) {
- targets.remove(i);
- // exit criteria for loop is now met
- nodeInstance = candidate;
- } else {
- // too many failures for this node
- log.info("Recent node failures is higher than threshold {}. Not requesting host {}",
- role.getNodeFailureThreshold(), candidate.hostname);
- }
- }
- }
-
- if (nodeInstance == null) {
- log.info("No node found for {}", role.getName());
- }
- return nodeInstance;
- }
-
- /**
- * Find a node for use
- * @param role role
- * @return the instance, or null for none
- */
- @VisibleForTesting
- public synchronized List<NodeInstance> findNodeForNewAAInstance(RoleStatus role) {
- // all nodes that are live and can host the role; no attempt to exclude ones
- // considered failing
- return nodemap.findAllNodesForRole(role.getKey(), role.getLabelExpression());
- }
-
- /**
- * Request an instance on a given node.
- * An outstanding request is created & tracked, with the
- * relevant node entry for that role updated.
- *<p>
- * The role status entries will also be tracked
- * <p>
- * Returns the request that is now being tracked.
- * If the node instance is not null, it's details about the role is incremented
- *
- * @param node node to target or null for "any"
- * @param role role to request
- * @return the request
- */
- public synchronized OutstandingRequest requestInstanceOnNode(
- NodeInstance node, RoleStatus role, Resource resource) {
- OutstandingRequest outstanding = outstandingRequests.newRequest(node, role.getKey());
- outstanding.buildContainerRequest(resource, role, now());
- return outstanding;
- }
-
- /**
- * Find a node for a role and request an instance on that (or a location-less
- * instance)
- * @param role role status
- * @return a request ready to go, or null if this is an AA request and no
- * location can be found.
- */
- public synchronized OutstandingRequest requestContainerForRole(RoleStatus role) {
-
- if (role.isAntiAffinePlacement()) {
- return requestContainerForAARole(role);
- } else {
- Resource resource = recordFactory.newResource();
- role.copyResourceRequirements(resource);
- NodeInstance node = findRecentNodeForNewInstance(role);
- return requestInstanceOnNode(node, role, resource);
- }
- }
-
- /**
- * Find a node for an AA role and request an instance on that (or a location-less
- * instance)
- * @param role role status
- * @return a request ready to go, or null if no location can be found.
- */
- public synchronized OutstandingRequest requestContainerForAARole(RoleStatus role) {
- List<NodeInstance> nodes = findNodeForNewAAInstance(role);
- if (!nodes.isEmpty()) {
- OutstandingRequest outstanding = outstandingRequests.newAARequest(
- role.getKey(), nodes, role.getLabelExpression());
- Resource resource = recordFactory.newResource();
- role.copyResourceRequirements(resource);
- outstanding.buildContainerRequest(resource, role, now());
- return outstanding;
- } else {
- log.warn("No suitable location for {}", role.getName());
- return null;
- }
- }
- /**
- * Get the list of active nodes ... walks the node map so
- * is {@code O(nodes)}
- * @param role role index
- * @return a possibly empty list of nodes with an instance of that node
- */
- public synchronized List<NodeInstance> listActiveNodes(int role) {
- return nodemap.listActiveNodes(role);
- }
-
- /**
- * Get the node entry of a container
- * @param container container to look up
- * @return the entry
- * @throws RuntimeException if the container has no hostname
- */
- public NodeEntry getOrCreateNodeEntry(Container container) {
- return getOrCreateNodeInstance(container).getOrCreate(container);
- }
-
- /**
- * Get the node instance of a container -always returns something
- * @param container container to look up
- * @return a (possibly new) node instance
- * @throws RuntimeException if the container has no hostname
- */
- public synchronized NodeInstance getOrCreateNodeInstance(Container container) {
- return nodemap.getOrCreate(RoleHistoryUtils.hostnameOf(container));
- }
-
- /**
- * Get the node instance of a host if defined
- * @param hostname hostname to look up
- * @return a node instance or null
- * @throws RuntimeException if the container has no hostname
- */
- public synchronized NodeInstance getExistingNodeInstance(String hostname) {
- return nodemap.get(hostname);
- }
-
- /**
- * Get the node instance of a container <i>if there's an entry in the history</i>
- * @param container container to look up
- * @return a node instance or null
- * @throws RuntimeException if the container has no hostname
- */
- public synchronized NodeInstance getExistingNodeInstance(Container container) {
- return nodemap.get(RoleHistoryUtils.hostnameOf(container));
- }
-
- /**
- * Perform any pre-allocation operations on the list of allocated containers
- * based on knowledge of system state.
- * Currently this places requested hosts ahead of unrequested ones.
- * @param allocatedContainers list of allocated containers
- * @return list of containers potentially reordered
- */
- public synchronized List<Container> prepareAllocationList(List<Container> allocatedContainers) {
-
- //partition into requested and unrequested
- List<Container> requested =
- new ArrayList<>(allocatedContainers.size());
- List<Container> unrequested =
- new ArrayList<>(allocatedContainers.size());
- outstandingRequests.partitionRequests(this, allocatedContainers, requested, unrequested);
-
- //give the unrequested ones lower priority
- requested.addAll(unrequested);
- return requested;
- }
-
- /**
- * A container has been allocated on a node -update the data structures
- * @param container container
- * @param desiredCount desired #of instances
- * @param actualCount current count of instances
- * @return The allocation outcome
- */
- public synchronized ContainerAllocationResults onContainerAllocated(Container container,
- long desiredCount,
- long actualCount) {
- int role = ContainerPriority.extractRole(container);
-
- String hostname = RoleHistoryUtils.hostnameOf(container);
- List<NodeInstance> nodeInstances = listRecentNodesForRoleId(role);
- ContainerAllocationResults outcome =
- outstandingRequests.onContainerAllocated(role, hostname, container);
- if (desiredCount <= actualCount) {
- // all outstanding requests have been satisfied
- // clear all the lists, so returning nodes to the available set
- List<NodeInstance> hosts = outstandingRequests.resetOutstandingRequests(role);
- if (!hosts.isEmpty()) {
- //add the list
- log.info("Adding {} hosts for role {}", hosts.size(), role);
- nodeInstances.addAll(hosts);
- sortRecentNodeList(role);
- }
- }
- return outcome;
- }
-
- /**
- * A container has been assigned to a role instance on a node -update the data structures
- * @param container container
- */
- public void onContainerAssigned(Container container) {
- NodeInstance node = getOrCreateNodeInstance(container);
- NodeEntry nodeEntry = node.getOrCreate(container);
- nodeEntry.onStarting();
- log.debug("Node {} has updated NodeEntry {}", node, nodeEntry);
- }
-
- /**
- * Event: a container start has been submitted
- * @param container container being started
- * @param instance instance bound to the container
- */
- public void onContainerStartSubmitted(Container container,
- RoleInstance instance) {
- // no actions here
- }
-
- /**
- * Container start event
- * @param container container that just started
- */
- public void onContainerStarted(Container container) {
- NodeEntry nodeEntry = getOrCreateNodeEntry(container);
- nodeEntry.onStartCompleted();
- touch();
- }
-
- /**
- * A container failed to start: update the node entry state
- * and return the container to the queue
- * @param container container that failed
- * @return true if the node was queued
- */
- public boolean onNodeManagerContainerStartFailed(Container container) {
- return markContainerFinished(container, false, true, ContainerOutcome.Failed);
- }
-
- /**
- * Does the RoleHistory have enough information about the YARN cluster
- * to start placing AA requests? That is: has it the node map and
- * any label information needed?
- * @return true if the caller can start requesting AA nodes
- */
- public boolean canPlaceAANodes() {
- return nodeUpdateReceived.get();
- }
-
- /**
- * Get the last time the nodes were updated from YARN
- * @return the update time or zero if never updated.
- */
- public long getNodesUpdatedTime() {
- return nodesUpdatedTime.get();
- }
-
- /**
- * Update failedNodes and nodemap based on the node state
- *
- * @param updatedNodes list of updated nodes
- * @return true if a review should be triggered.
- */
- public synchronized boolean onNodesUpdated(List<NodeReport> updatedNodes) {
- log.debug("Updating {} nodes", updatedNodes.size());
- nodesUpdatedTime.set(now());
- nodeUpdateReceived.set(true);
- int printed = 0;
- boolean triggerReview = false;
- for (NodeReport updatedNode : updatedNodes) {
- String hostname = updatedNode.getNodeId() == null
- ? ""
- : updatedNode.getNodeId().getHost();
- NodeState nodeState = updatedNode.getNodeState();
- if (hostname.isEmpty() || nodeState == null) {
- log.warn("Ignoring incomplete update");
- continue;
- }
- if (log.isDebugEnabled() && printed++ < 10) {
- // log the first few, but avoid overloading the logs for a full cluster
- // update
- log.debug("Node \"{}\" is in state {}", hostname, nodeState);
- }
- // update the node; this also creates an instance if needed
- boolean updated = nodemap.updateNode(hostname, updatedNode);
- triggerReview |= updated;
- }
- return triggerReview;
- }
-
- /**
- * A container release request was issued
- * @param container container submitted
- */
- public void onContainerReleaseSubmitted(Container container) {
- NodeEntry nodeEntry = getOrCreateNodeEntry(container);
- nodeEntry.release();
- }
-
- /**
- * App state notified of a container completed
- * @param container completed container
- * @return true if the node was queued
- */
- public boolean onReleaseCompleted(Container container) {
- return markContainerFinished(container, true, false, ContainerOutcome.Failed);
- }
-
- /**
- * App state notified of a container completed -but as
- * it wasn't being released it is marked as failed
- *
- * @param container completed container
- * @param shortLived was the container short lived?
- * @param outcome
- * @return true if the node is considered available for work
- */
- public boolean onFailedContainer(Container container,
- boolean shortLived,
- ContainerOutcome outcome) {
- return markContainerFinished(container, false, shortLived, outcome);
- }
-
- /**
- * Mark a container finished; if it was released then that is treated
- * differently. history is {@code touch()}-ed
- *
- *
- * @param container completed container
- * @param wasReleased was the container released?
- * @param shortLived was the container short lived?
- * @param outcome
- * @return true if the node was queued
- */
- protected synchronized boolean markContainerFinished(Container container,
- boolean wasReleased,
- boolean shortLived,
- ContainerOutcome outcome) {
- NodeEntry nodeEntry = getOrCreateNodeEntry(container);
- log.info("Finished container for node {}, released={}, shortlived={}",
- nodeEntry.rolePriority, wasReleased, shortLived);
- boolean available;
- if (shortLived) {
- nodeEntry.onStartFailed();
- available = false;
- } else {
- available = nodeEntry.containerCompleted(wasReleased, outcome);
- maybeQueueNodeForWork(container, nodeEntry, available);
- }
- touch();
- return available;
- }
-
- /**
- * If the node is marked as available; queue it for assignments.
- * Unsynced: requires caller to be in a sync block.
- * @param container completed container
- * @param nodeEntry node
- * @param available available flag
- * @return true if the node was queued
- */
- private boolean maybeQueueNodeForWork(Container container,
- NodeEntry nodeEntry,
- boolean available) {
- if (available) {
- //node is free
- nodeEntry.setLastUsed(now());
- NodeInstance ni = getOrCreateNodeInstance(container);
- int roleId = ContainerPriority.extractRole(container);
- log.debug("Node {} is now available for role id {}", ni, roleId);
- listRecentNodesForRoleId(roleId).addFirst(ni);
- }
- return available;
- }
-
- /**
- * Print the history to the log. This is for testing and diagnostics
- */
- public synchronized void dump() {
- for (ProviderRole role : providerRoles) {
- log.info(role.toString());
- List<NodeInstance> instances = listRecentNodesForRoleId(role.id);
- log.info(" available: " + instances.size()
- + " " + SliderUtils.joinWithInnerSeparator(" ", instances));
- }
-
- log.info("Nodes in Cluster: {}", getClusterSize());
- for (NodeInstance node : nodemap.values()) {
- log.info(node.toFullString());
- }
- }
-
- /**
- * Build the mapping entry for persisting to the role history
- * @return a mapping object
- */
- public synchronized Map<CharSequence, Integer> buildMappingForHistoryFile() {
- Map<CharSequence, Integer> mapping = new HashMap<>(getRoleSize());
- for (ProviderRole role : providerRoles) {
- mapping.put(role.name, role.id);
- }
- return mapping;
- }
-
- /**
- * Get a clone of the available list
- * @param role role index
- * @return a clone of the list
- */
- @VisibleForTesting
- public List<NodeInstance> cloneRecentNodeList(int role) {
- return new LinkedList<>(listRecentNodesForRoleId(role));
- }
-
- /**
- * Get a snapshot of the outstanding placed request list
- * @return a list of the requests outstanding at the time of requesting
- */
- @VisibleForTesting
- public List<OutstandingRequest> listPlacedRequests() {
- return outstandingRequests.listPlacedRequests();
- }
-
- /**
- * Get a snapshot of the outstanding placed request list
- * @return a list of the requests outstanding at the time of requesting
- */
- @VisibleForTesting
- public List<OutstandingRequest> listOpenRequests() {
- return outstandingRequests.listOpenRequests();
- }
-
- /**
- * Escalate operation as triggered by external timer.
- * @return a (usually empty) list of cancel/request operations.
- */
- public synchronized List<AbstractRMOperation> escalateOutstandingRequests() {
- return outstandingRequests.escalateOutstandingRequests(now());
- }
- /**
- * Escalate operation as triggered by external timer.
- * @return a (usually empty) list of cancel/request operations.
- */
- public List<AbstractRMOperation> cancelOutstandingAARequests() {
- return outstandingRequests.cancelOutstandingAARequests();
- }
-
- /**
- * Cancel a number of outstanding requests for a role -that is, not
- * actual containers, just requests for new ones.
- * @param role role
- * @param toCancel number to cancel
- * @return a list of cancellable operations.
- */
- public List<AbstractRMOperation> cancelRequestsForRole(RoleStatus role, int toCancel) {
- return role.isAntiAffinePlacement() ?
- cancelRequestsForAARole(role, toCancel)
- : cancelRequestsForSimpleRole(role, toCancel);
- }
-
- /**
- * Build the list of requests to cancel from the outstanding list.
- * @param role role
- * @param toCancel number to cancel
- * @return a list of cancellable operations.
- */
- private synchronized List<AbstractRMOperation> cancelRequestsForSimpleRole(RoleStatus role, int toCancel) {
- Preconditions.checkArgument(toCancel > 0,
- "trying to cancel invalid number of requests: " + toCancel);
- List<AbstractRMOperation> results = new ArrayList<>(toCancel);
- // first scan through the unplaced request list to find all of a role
- int roleId = role.getKey();
- List<OutstandingRequest> requests =
- outstandingRequests.extractOpenRequestsForRole(roleId, toCancel);
-
- // are there any left?
- int remaining = toCancel - requests.size();
- // ask for some placed nodes
- requests.addAll(outstandingRequests.extractPlacedRequestsForRole(roleId, remaining));
-
- // build cancellations
- for (OutstandingRequest request : requests) {
- results.add(request.createCancelOperation());
- }
- return results;
- }
-
- /**
- * Build the list of requests to cancel for an AA role. This reduces the number
- * of outstanding pending requests first, then cancels any active request,
- * before finally asking for any placed containers
- * @param role role
- * @param toCancel number to cancel
- * @return a list of cancellable operations.
- */
- private synchronized List<AbstractRMOperation> cancelRequestsForAARole(RoleStatus role, int toCancel) {
- List<AbstractRMOperation> results = new ArrayList<>(toCancel);
- int roleId = role.getKey();
- List<OutstandingRequest> requests = new ArrayList<>(toCancel);
- // there may be pending requests which can be cancelled here
- long pending = role.getPendingAntiAffineRequests();
- if (pending > 0) {
- // there are some pending ones which can be cancelled first
- long pendingToCancel = Math.min(pending, toCancel);
- log.info("Cancelling {} pending AA allocations, leaving {}", toCancel,
- pendingToCancel);
- role.setPendingAntiAffineRequests(pending - pendingToCancel);
- toCancel -= pendingToCancel;
- }
- if (toCancel > 0 && role.isAARequestOutstanding()) {
- // not enough
- log.info("Cancelling current AA request");
- // find the single entry which may be running
- requests = outstandingRequests.extractOpenRequestsForRole(roleId, toCancel);
- role.cancelOutstandingAARequest();
- toCancel--;
- }
-
- // ask for some excess nodes
- if (toCancel > 0) {
- requests.addAll(outstandingRequests.extractPlacedRequestsForRole(roleId, toCancel));
- }
-
- // build cancellations
- for (OutstandingRequest request : requests) {
- results.add(request.createCancelOperation());
- }
- return results;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java
deleted file mode 100644
index ea6197b..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.api.records.NodeId;
-import org.apache.slider.common.tools.SliderUtils;
-
-public class RoleHistoryUtils {
-
- public static String hostnameOf(Container container) {
- NodeId nodeId = container.getNodeId();
- if (nodeId== null) {
- throw new RuntimeException("Container has no node ID: %s" +
- SliderUtils.containerToString(container));
- }
- return nodeId.getHost();
- }
-
- /**
- * Decrement a value but hold it at zero. Usually a sanity check
- * on counters tracking outstanding operations
- * @param val value
- * @return decremented value
- */
- public static int decToFloor(int val) {
- int v = val-1;
- if (v < 0) {
- v = 0;
- }
- return v;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java
deleted file mode 100644
index 920887a..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import java.util.Objects;
-
-public class RoleHostnamePair {
-
- /**
- * requested role
- */
- public final int roleId;
-
- /**
- * hostname -will be null if node==null
- */
- public final String hostname;
-
- public RoleHostnamePair(int roleId, String hostname) {
- this.roleId = roleId;
- this.hostname = hostname;
- }
-
- public int getRoleId() {
- return roleId;
- }
-
- public String getHostname() {
- return hostname;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (!(o instanceof RoleHostnamePair)) {
- return false;
- }
- RoleHostnamePair that = (RoleHostnamePair) o;
- return Objects.equals(roleId, that.roleId) &&
- Objects.equals(hostname, that.hostname);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(roleId, hostname);
- }
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder(
- "RoleHostnamePair{");
- sb.append("roleId=").append(roleId);
- sb.append(", hostname='").append(hostname).append('\'');
- sb.append('}');
- return sb.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
deleted file mode 100644
index 30cfec9..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.registry.client.binding.RegistryTypeUtils;
-import org.apache.hadoop.registry.client.types.Endpoint;
-import org.apache.hadoop.registry.client.types.ProtocolTypes;
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.api.records.ContainerId;
-import org.apache.hadoop.yarn.api.records.NodeId;
-import org.apache.slider.api.ClusterNode;
-import org.apache.slider.api.proto.Messages;
-import org.apache.slider.api.types.ContainerInformation;
-import org.apache.slider.common.tools.SliderUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tracking information about a container
- */
-public final class RoleInstance implements Cloneable {
-
- public Container container;
- /**
- * Container ID
- */
- public final String id;
- public long createTime;
- public long startTime;
- /**
- * flag set when it is released, to know if it has
- * already been targeted for termination
- */
- public boolean released;
-
- /**
- * Name of the role
- */
- public String role;
- public String group;
-
- /**
- * Version of the app
- */
- public String appVersion;
-
- /**
- * Role Id; matches priority in resources.json
- */
- public int roleId;
-
- /**
- * state from StateValues
- */
- public int state;
-
- /**
- * Exit code: only valid if the state >= STOPPED
- */
- public int exitCode;
-
- /**
- * what was the command executed?
- */
- public String command;
-
- /**
- * Any diagnostics
- */
- public String diagnostics;
-
- /**
- * What is the tail output from the executed process (or [] if not started
- * or the log cannot be picked up
- */
- public String[] output;
-
- /**
- * Any environment details
- */
- public String[] environment;
-
- public String ip;
- public String hostname;
- public String host;
- public String hostURL;
- public ContainerAllocationOutcome placement;
-
-
- /**
- * A list of registered endpoints.
- */
- private List<Endpoint> endpoints =
- new ArrayList<>(2);
-
- public RoleInstance(ContainerAssignment assignment) {
- this(assignment.container);
- placement = assignment.placement;
- }
- /**
- * Create an instance to track an allocated container
- * @param container a container which must be non null, and have a non-null Id field.
- */
- public RoleInstance(Container container) {
- Preconditions.checkNotNull(container, "Null container");
- Preconditions.checkState(container.getId() != null,
- "Null container ID");
-
- this.container = container;
- id = container.getId().toString();
- if (container.getNodeId() != null) {
- host = container.getNodeId().getHost();
- }
- if (container.getNodeHttpAddress() != null) {
- hostURL = "http://" + container.getNodeHttpAddress();
- }
- }
-
- public ContainerId getId() {
- return container.getId();
- }
-
- public NodeId getHost() {
- return container.getNodeId();
- }
-
- @Override
- public String toString() {
- final StringBuilder sb =
- new StringBuilder("RoleInstance{");
- sb.append("role='").append(role).append('\'');
- sb.append(", id='").append(id).append('\'');
- sb.append(", container=").append(SliderUtils.containerToString(container));
- sb.append(", createTime=").append(createTime);
- sb.append(", startTime=").append(startTime);
- sb.append(", released=").append(released);
- sb.append(", roleId=").append(roleId);
- sb.append(", host=").append(host);
- sb.append(", hostURL=").append(hostURL);
- sb.append(", state=").append(state);
- sb.append(", placement=").append(placement);
- sb.append(", exitCode=").append(exitCode);
- sb.append(", command='").append(command).append('\'');
- sb.append(", diagnostics='").append(diagnostics).append('\'');
- sb.append(", output=").append(Arrays.toString(output));
- sb.append(", environment=").append(Arrays.toString(environment));
- sb.append('}');
- return sb.toString();
- }
-
- public ContainerId getContainerId() {
- return container != null ? container.getId() : null;
- }
-
- /**
- * Generate the protobuf format of a request
- * @return protobuf format. This excludes the Container info
- */
- public Messages.RoleInstanceState toProtobuf() {
- Messages.RoleInstanceState.Builder builder =
- Messages.RoleInstanceState.newBuilder();
- if (container != null) {
- builder.setName(container.getId().toString());
- } else {
- builder.setName("unallocated instance");
- }
- if (command != null) {
- builder.setCommand(command);
- }
- if (environment != null) {
- builder.addAllEnvironment(Arrays.asList(environment));
- }
- if (diagnostics != null) {
- builder.setDiagnostics(diagnostics);
- }
- builder.setExitCode(exitCode);
-
- if (output != null) {
- builder.addAllOutput(Arrays.asList(output));
- }
- if (role != null) {
- builder.setRole(role);
- }
- builder.setRoleId(roleId);
- builder.setState(state);
-
- builder.setReleased(released);
- builder.setCreateTime(createTime);
- builder.setStartTime(startTime);
- builder.setHost(host);
- builder.setHostURL(hostURL);
- if (appVersion != null) {
- builder.setAppVersion(appVersion);
- }
- return builder.build();
- }
-
- /**
- * Build a serializable ClusterNode structure from this instance.
- * This operation is unsynchronized.
- * @return a serialized value.
- */
- public ClusterNode toClusterNode() {
- ClusterNode node;
- if (container != null) {
- node = new ClusterNode(container.getId());
- } else {
- node = new ClusterNode();
- node.name = "unallocated instance";
- }
- node.command = command;
- node.createTime = createTime;
- node.diagnostics = diagnostics;
- if (environment != null) {
- node.environment = Arrays.copyOf(environment, environment.length);
- }
- node.exitCode = exitCode;
- node.ip = ip;
- node.hostname = hostname;
- node.host = host;
- node.hostUrl = hostURL;
- if (output != null) {
- node.output = Arrays.copyOf(output, output.length);
- }
- node.released = released;
- node.role = role;
- node.roleId = roleId;
- node.startTime = startTime ;
- node.state = state;
-
- return node;
- }
-
- /**
- * Clone operation clones all the simple values but shares the
- * Container object into the cloned copy -same with the output,
- * diagnostics and env arrays.
- * @return a clone of the object
- * @throws CloneNotSupportedException
- */
- @Override
- public Object clone() throws CloneNotSupportedException {
- RoleInstance cloned = (RoleInstance) super.clone();
- // clone the endpoint list, but not the values
- cloned.endpoints = new ArrayList<Endpoint>(this.endpoints);
- return cloned;
- }
-
- /**
- * Get the list of endpoints.
- * @return the endpoint list.
- */
- public List<Endpoint> getEndpoints() {
- return endpoints;
- }
-
- /**
- * Add an endpoint registration
- * @param endpoint endpoint (non-null)
- */
- public void addEndpoint(Endpoint endpoint) {
- Preconditions.checkArgument(endpoint != null);
- endpoints.add(endpoint);
- }
-
- /**
- * Register a port endpoint as an inet-addr formatted endpoint, using the
- * hostname as the first part of the address
- * @param port port port
- * @param api API API name
- */
- public void registerPortEndpoint(int port, String api) {
- Endpoint epr =
- RegistryTypeUtils.inetAddrEndpoint(api,
- ProtocolTypes.PROTOCOL_TCP, host, port);
- addEndpoint(epr);
- }
-
- /**
- * Serialize. Some data structures (e.g output)
- * may be shared
- * @return a serialized form for marshalling as JSON
- */
- public ContainerInformation serialize() {
- ContainerInformation info = new ContainerInformation();
- info.containerId = id;
- info.component = role;
- info.appVersion = appVersion;
- info.startTime = startTime;
- info.createTime = createTime;
- info.diagnostics = diagnostics;
- info.state = state;
- info.host = host;
- info.hostURL = hostURL;
- info.released = released ? Boolean.TRUE : null;
- if (placement != null) {
- info.placement = placement.toString();
- }
- if (output != null) {
- info.output = output;
- }
- return info;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
deleted file mode 100644
index 0a3a3c9..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricSet;
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.slider.api.types.ComponentInformation;
-import org.apache.slider.api.types.RoleStatistics;
-import org.apache.slider.providers.PlacementPolicy;
-import org.apache.slider.providers.ProviderRole;
-import org.apache.slider.server.appmaster.management.BoolMetricPredicate;
-import org.apache.slider.server.appmaster.management.LongGauge;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Models the ongoing status of all nodes in an application.
- *
- * These structures are shared across the {@link AppState} and {@link RoleHistory} structures,
- * and must be designed for synchronous access. Atomic counters are preferred to anything which
- * requires synchronization. Where synchronized access is good is that it allows for
- * the whole instance to be locked, for updating multiple entries.
- */
-public final class RoleStatus implements Cloneable, MetricSet {
-
- private final String name;
- private final String group;
-
- /**
- * Role priority
- */
- private final int key;
- private final ProviderRole providerRole;
-
- private final LongGauge actual = new LongGauge();
- private final LongGauge completed = new LongGauge();
- private final LongGauge desired = new LongGauge();
- private final LongGauge failed = new LongGauge();
- private final LongGauge failedRecently = new LongGauge(0);
- private final LongGauge limitsExceeded = new LongGauge(0);
- private final LongGauge nodeFailed = new LongGauge(0);
- /** Number of AA requests queued. */
- private final LongGauge pendingAntiAffineRequests = new LongGauge(0);
- private final LongGauge preempted = new LongGauge(0);
- private final LongGauge releasing = new LongGauge();
- private final LongGauge requested = new LongGauge();
- private final LongGauge started = new LongGauge();
- private final LongGauge startFailed = new LongGauge();
- private final LongGauge totalRequested = new LongGauge();
-
- /** resource requirements */
- private Resource resourceRequirements;
-
-
- /** any pending AA request */
- private volatile OutstandingRequest outstandingAArequest = null;
-
-
- private String failureMessage = "";
-
- public RoleStatus(ProviderRole providerRole) {
- this.providerRole = providerRole;
- this.name = providerRole.name;
- this.group = providerRole.group;
- this.key = providerRole.id;
- }
-
- @Override
- public Map<String, Metric> getMetrics() {
- Map<String, Metric> metrics = new HashMap<>(15);
- metrics.put("actual", actual);
- metrics.put("completed", completed );
- metrics.put("desired", desired);
- metrics.put("failed", failed);
- metrics.put("limitsExceeded", limitsExceeded);
- metrics.put("nodeFailed", nodeFailed);
- metrics.put("preempted", preempted);
- metrics.put("pendingAntiAffineRequests", pendingAntiAffineRequests);
- metrics.put("releasing", releasing);
- metrics.put("requested", requested);
- metrics.put("preempted", preempted);
- metrics.put("releasing", releasing );
- metrics.put("requested", requested);
- metrics.put("started", started);
- metrics.put("startFailed", startFailed);
- metrics.put("totalRequested", totalRequested);
-
- metrics.put("outstandingAArequest",
- new BoolMetricPredicate(new BoolMetricPredicate.Eval() {
- @Override
- public boolean eval() {
- return isAARequestOutstanding();
- }
- }));
- return metrics;
- }
-
- public String getName() {
- return name;
- }
-
- public String getGroup() {
- return group;
- }
-
- public int getKey() {
- return key;
- }
-
- public int getPriority() {
- return getKey();
- }
-
- /**
- * Get the placement policy enum, from the values in
- * {@link PlacementPolicy}
- * @return the placement policy for this role
- */
- public int getPlacementPolicy() {
- return providerRole.placementPolicy;
- }
-
- public long getPlacementTimeoutSeconds() {
- return providerRole.placementTimeoutSeconds;
- }
-
- /**
- * The number of failures on a specific node that can be tolerated
- * before selecting a different node for placement
- * @return
- */
- public int getNodeFailureThreshold() {
- return providerRole.nodeFailureThreshold;
- }
-
- public boolean isExcludeFromFlexing() {
- return hasPlacementPolicy(PlacementPolicy.EXCLUDE_FROM_FLEXING);
- }
-
- public boolean isStrictPlacement() {
- return hasPlacementPolicy(PlacementPolicy.STRICT);
- }
-
- public boolean isAntiAffinePlacement() {
- return hasPlacementPolicy(PlacementPolicy.ANTI_AFFINITY_REQUIRED);
- }
-
- public boolean hasPlacementPolicy(int policy) {
- return 0 != (getPlacementPolicy() & policy);
- }
-
- public boolean isPlacementDesired() {
- return !hasPlacementPolicy(PlacementPolicy.ANYWHERE);
- }
-
- public long getDesired() {
- return desired.get();
- }
-
- public void setDesired(long desired) {
- this.desired.set(desired);
- }
-
- public long getActual() {
- return actual.get();
- }
-
- public long incActual() {
- return actual.incrementAndGet();
- }
-
- public long decActual() {
- return actual.decToFloor(1);
- }
-
- /**
- * Get the request count.
- * @return a count of requested containers
- */
- public long getRequested() {
- return requested.get();
- }
-
- public long incRequested() {
- totalRequested.incrementAndGet();
- return requested.incrementAndGet();
- }
-
- public void cancel(long count) {
- requested.decToFloor(count);
- }
-
- public void decRequested() {
- cancel(1);
- }
-
- public long getReleasing() {
- return releasing.get();
- }
-
- public long incReleasing() {
- return releasing.incrementAndGet();
- }
-
- public long decReleasing() {
- return releasing.decToFloor(1);
- }
-
- public long getFailed() {
- return failed.get();
- }
-
- public long getFailedRecently() {
- return failedRecently.get();
- }
-
- /**
- * Reset the recent failure
- * @return the number of failures in the "recent" window
- */
- public long resetFailedRecently() {
- return failedRecently.getAndSet(0);
- }
-
- public long getLimitsExceeded() {
- return limitsExceeded.get();
- }
-
- public long incPendingAntiAffineRequests(long v) {
- return pendingAntiAffineRequests.addAndGet(v);
- }
-
- /**
- * Probe for an outstanding AA request being true
- * @return true if there is an outstanding AA Request
- */
- public boolean isAARequestOutstanding() {
- return outstandingAArequest != null;
- }
-
- /**
- * expose the predicate {@link #isAARequestOutstanding()} as an integer,
- * which is very convenient in tests
- * @return 1 if there is an outstanding request; 0 if not
- */
- public int getOutstandingAARequestCount() {
- return isAARequestOutstanding()? 1: 0;
- }
- /**
- * Note that a role failed, text will
- * be used in any diagnostics if an exception
- * is later raised.
- * @param startupFailure flag to indicate this was a startup event
- * @param text text about the failure
- * @param outcome outcome of the container
- */
- public synchronized void noteFailed(boolean startupFailure, String text,
- ContainerOutcome outcome) {
- if (text != null) {
- failureMessage = text;
- }
- switch (outcome) {
- case Preempted:
- preempted.incrementAndGet();
- break;
-
- case Node_failure:
- nodeFailed.incrementAndGet();
- failed.incrementAndGet();
- break;
-
- case Failed_limits_exceeded: // exceeded memory or CPU; app/configuration related
- limitsExceeded.incrementAndGet();
- // fall through
- case Failed: // application failure, possibly node related, possibly not
- default: // anything else (future-proofing)
- failed.incrementAndGet();
- failedRecently.incrementAndGet();
- //have a look to see if it short lived
- if (startupFailure) {
- incStartFailed();
- }
- break;
- }
- }
-
- public long getStartFailed() {
- return startFailed.get();
- }
-
- public synchronized void incStartFailed() {
- startFailed.getAndIncrement();
- }
-
- public synchronized String getFailureMessage() {
- return failureMessage;
- }
-
- public long getCompleted() {
- return completed.get();
- }
-
- public synchronized void setCompleted(int completed) {
- this.completed.set(completed);
- }
-
- public long incCompleted() {
- return completed.incrementAndGet();
- }
- public long getStarted() {
- return started.get();
- }
-
- public synchronized void incStarted() {
- started.incrementAndGet();
- }
-
- public long getTotalRequested() {
- return totalRequested.get();
- }
-
- public long getPreempted() {
- return preempted.get();
- }
-
- public long getNodeFailed() {
- return nodeFailed.get();
- }
-
- public long getPendingAntiAffineRequests() {
- return pendingAntiAffineRequests.get();
- }
-
- public void setPendingAntiAffineRequests(long pendingAntiAffineRequests) {
- this.pendingAntiAffineRequests.set(pendingAntiAffineRequests);
- }
-
- public long decPendingAntiAffineRequests() {
- return pendingAntiAffineRequests.decToFloor(1);
- }
-
- public OutstandingRequest getOutstandingAArequest() {
- return outstandingAArequest;
- }
-
- public void setOutstandingAArequest(OutstandingRequest outstandingAArequest) {
- this.outstandingAArequest = outstandingAArequest;
- }
-
- /**
- * Complete the outstanding AA request (there's no check for one in progress, caller
- * expected to have done that).
- */
- public void completeOutstandingAARequest() {
- setOutstandingAArequest(null);
- }
-
- /**
- * Cancel any outstanding AA request. Harmless if the role is non-AA, or
- * if there are no outstanding requests.
- */
- public void cancelOutstandingAARequest() {
- if (outstandingAArequest != null) {
- setOutstandingAArequest(null);
- setPendingAntiAffineRequests(0);
- decRequested();
- }
- }
-
- /**
- * Get the number of roles we are short of.
- * nodes released are ignored.
- * @return the positive or negative number of roles to add/release.
- * 0 means "do nothing".
- */
- public long getDelta() {
- long inuse = getActualAndRequested();
- long delta = desired.get() - inuse;
- if (delta < 0) {
- //if we are releasing, remove the number that are already released.
- delta += releasing.get();
- //but never switch to a positive
- delta = Math.min(delta, 0);
- }
- return delta;
- }
-
- /**
- * Get count of actual and requested containers. This includes pending ones
- * @return the size of the application when outstanding requests are included.
- */
- public long getActualAndRequested() {
- return actual.get() + requested.get();
- }
-
- @Override
- public String toString() {
- final StringBuilder sb = new StringBuilder("RoleStatus{");
- sb.append("name='").append(name).append('\'');
- sb.append(", group=").append(group);
- sb.append(", key=").append(key);
- sb.append(", desired=").append(desired);
- sb.append(", actual=").append(actual);
- sb.append(", requested=").append(requested);
- sb.append(", releasing=").append(releasing);
- sb.append(", failed=").append(failed);
- sb.append(", startFailed=").append(startFailed);
- sb.append(", started=").append(started);
- sb.append(", completed=").append(completed);
- sb.append(", totalRequested=").append(totalRequested);
- sb.append(", preempted=").append(preempted);
- sb.append(", nodeFailed=").append(nodeFailed);
- sb.append(", failedRecently=").append(failedRecently);
- sb.append(", limitsExceeded=").append(limitsExceeded);
- sb.append(", resourceRequirements=").append(resourceRequirements);
- sb.append(", isAntiAffinePlacement=").append(isAntiAffinePlacement());
- if (isAntiAffinePlacement()) {
- sb.append(", pendingAntiAffineRequests=").append(pendingAntiAffineRequests);
- sb.append(", outstandingAArequest=").append(outstandingAArequest);
- }
- sb.append(", failureMessage='").append(failureMessage).append('\'');
- sb.append(", providerRole=").append(providerRole);
- sb.append('}');
- return sb.toString();
- }
-
- @Override
- public synchronized Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
-
- /**
- * Get the provider role
- * @return the provider role
- */
- public ProviderRole getProviderRole() {
- return providerRole;
- }
-
- /**
- * Build the statistics map from the current data
- * @return a map for use in statistics reports
- */
- public Map<String, Integer> buildStatistics() {
- ComponentInformation componentInformation = serialize();
- return componentInformation.buildStatistics();
- }
-
- /**
- * Produced a serialized form which can be served up as JSON
- * @return a summary of the current role status.
- */
- public synchronized ComponentInformation serialize() {
- ComponentInformation info = new ComponentInformation();
- info.name = name;
- info.priority = getPriority();
- info.desired = desired.intValue();
- info.actual = actual.intValue();
- info.requested = requested.intValue();
- info.releasing = releasing.intValue();
- info.failed = failed.intValue();
- info.startFailed = startFailed.intValue();
- info.placementPolicy = getPlacementPolicy();
- info.failureMessage = failureMessage;
- info.totalRequested = totalRequested.intValue();
- info.failedRecently = failedRecently.intValue();
- info.nodeFailed = nodeFailed.intValue();
- info.preempted = preempted.intValue();
- info.pendingAntiAffineRequestCount = pendingAntiAffineRequests.intValue();
- info.isAARequestOutstanding = isAARequestOutstanding();
- return info;
- }
-
- /**
- * Get the (possibly null) label expression for this role
- * @return a string or null
- */
- public String getLabelExpression() {
- return providerRole.labelExpression;
- }
-
- public Resource getResourceRequirements() {
- return resourceRequirements;
- }
-
- public void setResourceRequirements(Resource resourceRequirements) {
- this.resourceRequirements = resourceRequirements;
- }
-
- /**
- * Compare two role status entries by name
- */
- public static class CompareByName implements Comparator<RoleStatus>,
- Serializable {
- @Override
- public int compare(RoleStatus o1, RoleStatus o2) {
- return o1.getName().compareTo(o2.getName());
- }
- }
-
- /**
- * Compare two role status entries by key
- */
- public static class CompareByKey implements Comparator<RoleStatus>,
- Serializable {
- @Override
- public int compare(RoleStatus o1, RoleStatus o2) {
- return (o1.getKey() < o2.getKey() ? -1 : (o1.getKey() == o2.getKey() ? 0 : 1));
- }
- }
-
- /**
- * Given a resource, set its requirements to those this role needs
- * @param resource resource to configure
- * @return the resource
- */
- public Resource copyResourceRequirements(Resource resource) {
- Preconditions.checkNotNull(resourceRequirements,
- "Role resource requirements have not been set");
- resource.setMemory(resourceRequirements.getMemory());
- resource.setVirtualCores(resourceRequirements.getVirtualCores());
- return resource;
- }
-
- public synchronized RoleStatistics getStatistics() {
- RoleStatistics stats = new RoleStatistics();
- stats.activeAA = getOutstandingAARequestCount();
- stats.actual = actual.get();
- stats.desired = desired.get();
- stats.failed = failed.get();
- stats.limitsExceeded = limitsExceeded.get();
- stats.nodeFailed = nodeFailed.get();
- stats.preempted = preempted.get();
- stats.releasing = releasing.get();
- stats.requested = requested.get();
- stats.started = started.get();
- stats.startFailed = startFailed.get();
- stats.totalRequested = totalRequested.get();
- return stats;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/51c2b92c/slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java
deleted file mode 100644
index b848096..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.slider.server.appmaster.state;
-
-import java.util.List;
-
-/**
- * Simplest release selector simply returns the list
- */
-public class SimpleReleaseSelector implements ContainerReleaseSelector {
-
- @Override
- public List<RoleInstance> sortCandidates(int roleId,
- List<RoleInstance> candidates) {
- return candidates;
- }
-}