You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ji...@apache.org on 2017/09/12 00:35:17 UTC
[15/84] [abbrv] hadoop git commit: YARN-7050. Post cleanup after
YARN-6903, removal of org.apache.slider package. Contributed by Jian He
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
deleted file mode 100644
index 15333e4..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistory.java
+++ /dev/null
@@ -1,1123 +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.Timestamp;
-import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
-import org.apache.slider.server.appmaster.operations.UpdateBlacklistOperation;
-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.Map.Entry;
-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();
- }
-
-
- /**
- * 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));
- }
- }
-
- public synchronized UpdateBlacklistOperation updateBlacklist(
- Collection<RoleStatus> roleStatuses) {
- List<String> blacklistAdditions = new ArrayList<>();
- List<String> blacklistRemovals = new ArrayList<>();
- for (Entry<String, NodeInstance> nodeInstanceEntry : nodemap.entrySet()) {
- boolean shouldBeBlacklisted = false;
- String nodeHost = nodeInstanceEntry.getKey();
- NodeInstance nodeInstance = nodeInstanceEntry.getValue();
- for (RoleStatus roleStatus : roleStatuses) {
- if (nodeInstance.exceedsFailureThreshold(roleStatus)) {
- shouldBeBlacklisted = true;
- break;
- }
- }
- if (shouldBeBlacklisted) {
- if (!nodeInstance.isBlacklisted()) {
- blacklistAdditions.add(nodeHost);
- nodeInstance.setBlacklisted(true);
- }
- } else {
- if (nodeInstance.isBlacklisted()) {
- blacklistRemovals.add(nodeHost);
- nodeInstance.setBlacklisted(false);
- }
- }
- }
- if (blacklistAdditions.isEmpty() && blacklistRemovals.isEmpty()) {
- return null;
- }
- return new UpdateBlacklistOperation(blacklistAdditions, blacklistRemovals);
- }
-
- /**
- * 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.getAAPending();
- 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.setAAPending(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/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHistoryUtils.java
deleted file mode 100644
index ea6197b..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-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/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleHostnamePair.java
deleted file mode 100644
index 920887a..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-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/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
deleted file mode 100644
index 070f2f8..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java
+++ /dev/null
@@ -1,343 +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.fs.Path;
-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 org.apache.slider.providers.ProviderRole;
-
-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;
- public ProviderRole providerRole;
- public long componentId = -1;
- public String compInstanceName = null;
- /**
- * 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;
-
- /**
- * 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;
- public Path compInstanceDir;
-
- /**
- * A list of registered endpoints.
- */
- private List<Endpoint> endpoints =
- new ArrayList<>(2);
-
- public RoleInstance(Container container, ProviderRole role) {
- this(container);
- if (role.componentIdCounter != null) {
- componentId = role.componentIdCounter.getAndIncrement();
- compInstanceName = role.name + componentId;
- } else {
- compInstanceName = role.name;
- }
- compInstanceName = compInstanceName.toLowerCase().replaceAll("_", "-");
- this.providerRole = role;
- }
-
- public RoleInstance(Container container, RoleInstance failedInstance) {
- this(container);
- this.componentId = failedInstance.componentId;
- this.compInstanceName = failedInstance.compInstanceName;
- this.providerRole = failedInstance.providerRole;
- }
-
- /**
- * 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 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(", instanceName='").append(compInstanceName).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.getId();
- }
-
- /**
- * 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;
- }
-
- public String getCompInstanceName() {
- return compInstanceName;
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
deleted file mode 100644
index ec0ff25..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleStatus.java
+++ /dev/null
@@ -1,367 +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.hadoop.yarn.service.metrics.ServiceMetrics;
-
-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 MetricSet {
-
- private final String name;
-
- /**
- * Role priority
- */
- private final int key;
- private final ProviderRole providerRole;
-
- /** resource requirements */
- private Resource resourceRequirements;
- private ServiceMetrics componentMetrics;
-
- /** any pending AA request */
- private volatile OutstandingRequest outstandingAArequest = null;
-
-
- private String failureMessage = "";
-
- public RoleStatus(ProviderRole providerRole) {
- this.providerRole = providerRole;
- this.name = providerRole.name;
- this.key = providerRole.id;
- componentMetrics =
- ServiceMetrics.register(this.name, "Metrics for component " + this.name);
- componentMetrics
- .tag("type", "Metrics type [component or service]", "component");
- }
-
- public ServiceMetrics getComponentMetrics() {
- return this.componentMetrics;
- }
-
- @Override
- public Map<String, Metric> getMetrics() {
- Map<String, Metric> metrics = new HashMap<>(15);
- metrics.put("outstandingAArequest",
- new BoolMetricPredicate(new BoolMetricPredicate.Eval() {
- @Override
- public boolean eval() {
- return isAARequestOutstanding();
- }
- }));
- return metrics;
- }
-
- public String getName() {
- return name;
- }
-
- 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);
- }
-
- /**
- * 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 text text about the failure
- */
- public synchronized void noteFailed(String text) {
- if (text != null) {
- failureMessage = text;
- }
- }
-
-
- 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);
- }
- }
-
- public long getDesired() {
- return componentMetrics.containersDesired.value();
- }
-
- public void setDesired(int desired) {
- componentMetrics.containersDesired.set(desired);
- }
-
- public long getRunning() {
- return componentMetrics.containersRunning.value();
- }
-
- public long getRequested() {
- return componentMetrics.containersRequested.value();
- }
-
- public long getAAPending() {
- return componentMetrics.pendingAAContainers.value();
- }
-
- void decAAPending() {
- componentMetrics.pendingAAContainers.decr();
- }
-
- void setAAPending(long n) {
- componentMetrics.pendingAAContainers.set((int)n);
- }
-
- public long getLimitsExceeded() {
- return componentMetrics.containersLimitsExceeded.value();
- }
-
- public long getPreempted() {
- return componentMetrics.containersPreempted.value();
- }
-
- public long getDiskFailed() {
- return componentMetrics.containersDiskFailure.value();
- }
-
- public long getFailedRecently() {
-// return componentMetrics.failedSinceLastThreshold.value();
- return 0;
- }
-
- public long resetFailedRecently() {
-// long count =
-// componentMetrics.failedSinceLastThreshold.value();
-// componentMetrics.failedSinceLastThreshold.set(0);
- return 0;
- }
-
- public long getFailed() {
- return componentMetrics.containersFailed.value();
- }
-
- String getFailureMessage() {
- return this.failureMessage;
- }
- /**
- * 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 = getDesired() - inuse;
- if (delta < 0) {
- // TODO this doesn't do anything now that we're not tracking releasing
- // containers -- maybe we need releasing
- //if we are releasing, remove the number that are already released.
- //but never switch to a positive
- // TODO, WHY is this min operation even needed ??? if delta is negative, it's always < 0 ???
- delta = Math.min(delta, 0);
- }
- return delta;
- }
-
- /**
- * Get count of actual and requested containers.
- * @return the size of the application when outstanding requests are included.
- */
- public long getActualAndRequested() {
- return getRunning() + getRequested();
- }
-
- /**
- * Get the provider role
- * @return the provider role
- */
- public ProviderRole getProviderRole() {
- return providerRole;
- }
-
- /**
- * 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;
- 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 = getRunning();
- stats.desired = getDesired();
- stats.failed = getFailed();
- stats.limitsExceeded = getLimitsExceeded();
- stats.nodeFailed = getDiskFailed();
- stats.preempted = getPreempted();
- stats.requested = getRequested();
- stats.started = getRunning();
- return stats;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/SimpleReleaseSelector.java
deleted file mode 100644
index b848096..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-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;
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
deleted file mode 100644
index 90221cb..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
+++ /dev/null
@@ -1,275 +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.cache.LoadingCache;
-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.ClusterNode;
-import org.apache.slider.api.StatusKeys;
-import org.apache.slider.api.resource.Application;
-import org.apache.slider.api.resource.ConfigFile;
-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.exceptions.NoSuchNodeException;
-import org.apache.slider.core.registry.docstore.PublishedConfigSet;
-import org.apache.slider.core.registry.docstore.PublishedExportsSet;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The methods to offer state access to the providers and other parts of
- * the system which want read-only access to the state.
- */
-public interface StateAccessForProviders {
-
- /**
- * Get a map of role status entries by role Id
- * @return the map of currently defined roles.
- */
- Map<Integer, RoleStatus> getRoleStatusMap();
-
- /**
- * Get the name of the application
- * @return the name
- */
- String getApplicationName();
-
- /**
- * Get the published configurations
- * @return the configuration set
- */
- PublishedConfigSet getPublishedSliderConfigurations();
-
- /**
- * Get the published exports set
- * @return
- */
- PublishedExportsSet getPublishedExportsSet();
-
- /**
- * Get a named published config set
- * @param name name to look up
- * @return the instance or null
- */
- PublishedConfigSet getPublishedConfigSet(String name);
-
- /**
- * Get a named published config set, creating it if need be.
- * @param name name to look up
- * @return the instance -possibly a new one
- */
- PublishedConfigSet getOrCreatePublishedConfigSet(String name);
-
- /**
- * List the config sets -this takes a clone of the current set
- * @return a list of config sets
- */
- List<String> listConfigSets();
-
- /**
- * Get a map of all the failed containers
- * @return map of recorded failed containers
- */
- Map<ContainerId, RoleInstance> getFailedContainers();
-
- /**
- * Get the live containers.
- *
- * @return the live nodes
- */
- Map<ContainerId, RoleInstance> getLiveContainers();
-
- /**
- * Get the current cluster description
- * @return the actual state of the cluster
- */
- Application getApplication();
-
- /**
- * Flag set to indicate the application is live -this only happens
- * after the buildInstance operation
- */
- boolean isApplicationLive();
-
- /**
- * Look up a role from its key -or fail
- *
- * @param key key to resolve
- * @return the status
- * @throws YarnRuntimeException on no match
- */
- RoleStatus lookupRoleStatus(int key);
-
- /**
- * Look up a role from its key -or fail
- *
- * @param c container in a role
- * @return the status
- * @throws YarnRuntimeException on no match
- */
- RoleStatus lookupRoleStatus(Container c) throws YarnRuntimeException;
-
- /**
- * Look up a role from its key -or fail
- *
- * @param name container in a role
- * @return the status
- * @throws YarnRuntimeException on no match
- */
- RoleStatus lookupRoleStatus(String name) throws YarnRuntimeException;
-
- /**
- * Clone a list of active containers
- * @return the active containers at the time
- * the call was made
- */
- List<RoleInstance> cloneOwnedContainerList();
-
- /**
- * Get the number of active containers
- * @return the number of active containers the time the call was made
- */
- int getNumOwnedContainers();
-
- /**
- * Get any active container with the given ID
- * @param id container Id
- * @return the active container or null if it is not found
- */
- RoleInstance getOwnedContainer(ContainerId id);
-
- /**
- * Get any active container with the given ID
- * @param id container Id
- * @return the active container or null if it is not found
- */
- RoleInstance getOwnedContainer(String id) throws NoSuchNodeException;
-
- /**
- * Create a clone of the list of live cluster nodes.
- * @return the list of nodes, may be empty
- */
- List<RoleInstance> cloneLiveContainerInfoList();
-
- /**
- * Get the {@link RoleInstance} details on a container.
- * This is an O(n) operation
- * @param containerId the container ID
- * @return null if there is no such node
- * @throws NoSuchNodeException if the node cannot be found
- */
- RoleInstance getLiveInstanceByContainerID(String containerId)
- throws NoSuchNodeException;
-
- /**
- * Get the details on a list of instaces referred to by ID.
- * Unknown nodes are not returned
- * <i>Important: the order of the results are undefined</i>
- * @param containerIDs the containers
- * @return list of instances
- */
- List<RoleInstance> getLiveInstancesByContainerIDs(
- Collection<String> containerIDs);
-
- /**
- * Update the cluster description with anything interesting
- */
- Application refreshClusterStatus();
-
-
- /**
- * get application liveness information
- * @return a snapshot of the current liveness information
- */
- ApplicationLivenessInformation getApplicationLivenessInformation();
-
- /**
- * Get a snapshot of component information.
- * <p>
- * This does <i>not</i> include any container list, which
- * is more expensive to create.
- * @return a map of current role status values.
- */
- Map<String, ComponentInformation> getComponentInfoSnapshot();
-
- /**
- * Find out about the nodes for specific roles
- * Component_name -> ContainerId -> ClusterNode
- * @return
- */
- Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping();
-
- /**
- * Enum all role instances by role.
- * @param role role, or "" for all roles
- * @return a list of instances, may be empty
- */
- List<RoleInstance> enumLiveInstancesInRole(String role);
-
- /**
- * Look up all containers of a specific component name
- * @param component component/role name
- * @return list of instances. This is a snapshot
- */
- List<RoleInstance> lookupRoleContainers(String component);
-
- /**
- * Get the JSON serializable information about a component
- * @param component component to look up
- * @return a structure describing the component.
- */
- ComponentInformation getComponentInformation(String component);
-
-
- /**
- * Get a clone of the nodemap.
- * The instances inside are not cloned
- * @return a possibly empty map of hostname top info
- */
- Map<String, NodeInformation> getNodeInformationSnapshot();
-
- /**
- * get information on a node
- * @param hostname hostname to look up
- * @return the information, or null if there is no information held.
- */
- NodeInformation getNodeInformation(String hostname);
-
- /**
- * Get the aggregate statistics across all roles
- * @return role statistics
- */
- RoleStatistics getRoleStatistics();
-
- /**
- * Get global substitution tokens.
- */
- Map<String, String> getGlobalSubstitutionTokens();
-
- /**
- * Get config file cache.
- */
- LoadingCache<ConfigFile, Object> getConfigFileCache();
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/HttpCacheHeaders.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/HttpCacheHeaders.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/HttpCacheHeaders.java
deleted file mode 100644
index be8960d..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/HttpCacheHeaders.java
+++ /dev/null
@@ -1,35 +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.web;
-
-/*
-
-
- , );
- long now = System.currentTimeMillis();
- httpRes.addDateHeader ( "Expires", now );
- httpRes.addDateHeader ( "Date", now );
- httpRes.addHeader ( "Pragma", "no-cache" );
- */
-public interface HttpCacheHeaders {
- String HTTP_HEADER_CACHE_CONTROL = "Cache-Control";
- String HTTP_HEADER_CACHE_CONTROL_NONE = "no-cache";
- String HTTP_HEADER_PRAGMA = "Pragma";
-
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d44876af/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMController.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMController.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMController.java
deleted file mode 100644
index c3c6e60..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/main/java/org/apache/slider/server/appmaster/web/SliderAMController.java
+++ /dev/null
@@ -1,69 +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.web;
-
-import com.google.inject.Inject;
-import org.apache.hadoop.yarn.webapp.Controller;
-import org.apache.slider.server.appmaster.web.layout.AppLayout;
-import org.apache.slider.server.appmaster.web.layout.ClusterSpecificationView;
-import org.apache.slider.server.appmaster.web.layout.ContainerStatsView;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *
- */
-public class SliderAMController extends Controller {
- private static final Logger log = LoggerFactory.getLogger(SliderAMController.class);
-
- private final WebAppApi slider;
-
- @Inject
- public SliderAMController(WebAppApi slider, RequestContext ctx) {
- super(ctx);
- this.slider = slider;
- }
-
- @Override
- public void index() {
- setTitle("Slider App Master");
-
- updateAppState();
-
- render(AppLayout.class);
- }
-
- public void containerStats() {
- setTitle("Container Statistics");
-
- updateAppState();
-
- render(ContainerStatsView.class);
- }
-
- public void specification() {
- setTitle("Cluster Specification");
-
- render(ClusterSpecificationView.class);
- }
-
- private void updateAppState() {
- //TODO don't do this on every request?
- slider.getAppState().refreshClusterStatus();
- }
-
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org