Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 3BE35200D2A for ; Fri, 13 Oct 2017 20:21:20 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 3A50E1609CA; Fri, 13 Oct 2017 18:21:20 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id B447D1609E9 for ; Fri, 13 Oct 2017 20:21:17 +0200 (CEST) Received: (qmail 6735 invoked by uid 500); 13 Oct 2017 18:21:10 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 5776 invoked by uid 99); 13 Oct 2017 18:21:09 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Oct 2017 18:21:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id D24D3DFEEF; Fri, 13 Oct 2017 18:21:07 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jianhe@apache.org To: common-commits@hadoop.apache.org Date: Fri, 13 Oct 2017 18:21:21 -0000 Message-Id: In-Reply-To: <16cfa6f3e00a40809f6ac26e512c7005@git.apache.org> References: <16cfa6f3e00a40809f6ac26e512c7005@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [15/93] [abbrv] hadoop git commit: YARN-7050. Post cleanup after YARN-6903, removal of org.apache.slider package. Contributed by Jian He archived-at: Fri, 13 Oct 2017 18:21:20 -0000 http://git-wip-us.apache.org/repos/asf/hadoop/blob/5b0c0896/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. - *

- * Synchronization policy: all public operations are synchronized. - * Protected methods are in place for testing -no guarantees are made. - *

- * Inner classes have no synchronization guarantees; they should be manipulated - * in these classes and not externally. - *

- * 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 providerRoles; - /** the roles in here are shared with App State */ - private final Map 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> recentNodes; - - /** - * Instantiate - * @param roles initial role list - * @param recordFactory yarn record factory - * @throws BadConfigException - */ - public RoleHistory(Collection 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. - *

- * 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 getNodeInformationSnapshot( - Map naming) { - Map result = new HashMap<>(nodemap.size()); - for (Map.Entry 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 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 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 after the history has been rebuilt, - * 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 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 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 listRecentNodesForRoleId(int id) { - LinkedList 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()); - } - 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 nodesForRoleId = getRecentNodesForRoleId(role); - if (nodesForRoleId != null) { - Collections.sort(nodesForRoleId, new NodeInstance.Preferred(role)); - } - } - - public synchronized UpdateBlacklistOperation updateBlacklist( - Collection roleStatuses) { - List blacklistAdditions = new ArrayList<>(); - List blacklistRemovals = new ArrayList<>(); - for (Entry 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 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 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. - *

- * The role status entries will also be tracked - *

- * 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 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 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 if there's an entry in the history - * @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 prepareAllocationList(List allocatedContainers) { - - //partition into requested and unrequested - List requested = - new ArrayList<>(allocatedContainers.size()); - List 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 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 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 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 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 buildMappingForHistoryFile() { - Map 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 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 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 listOpenRequests() { - return outstandingRequests.listOpenRequests(); - } - - /** - * Escalate operation as triggered by external timer. - * @return a (usually empty) list of cancel/request operations. - */ - public synchronized List escalateOutstandingRequests() { - return outstandingRequests.escalateOutstandingRequests(now()); - } - /** - * Escalate operation as triggered by external timer. - * @return a (usually empty) list of cancel/request operations. - */ - public List 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 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 cancelRequestsForSimpleRole(RoleStatus role, int toCancel) { - Preconditions.checkArgument(toCancel > 0, - "trying to cancel invalid number of requests: " + toCancel); - List results = new ArrayList<>(toCancel); - // first scan through the unplaced request list to find all of a role - int roleId = role.getKey(); - List 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 cancelRequestsForAARole(RoleStatus role, int toCancel) { - List results = new ArrayList<>(toCancel); - int roleId = role.getKey(); - List 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/5b0c0896/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/5b0c0896/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/5b0c0896/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 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(this.endpoints); - return cloned; - } - - /** - * Get the list of endpoints. - * @return the endpoint list. - */ - public List 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/5b0c0896/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 getMetrics() { - Map 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, - 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, - 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/5b0c0896/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 sortCandidates(int roleId, - List candidates) { - return candidates; - } -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/5b0c0896/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 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 listConfigSets(); - - /** - * Get a map of all the failed containers - * @return map of recorded failed containers - */ - Map getFailedContainers(); - - /** - * Get the live containers. - * - * @return the live nodes - */ - Map 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 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 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 - * Important: the order of the results are undefined - * @param containerIDs the containers - * @return list of instances - */ - List getLiveInstancesByContainerIDs( - Collection 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. - *

- * This does not include any container list, which - * is more expensive to create. - * @return a map of current role status values. - */ - Map getComponentInfoSnapshot(); - - /** - * Find out about the nodes for specific roles - * Component_name -> ContainerId -> ClusterNode - * @return - */ - Map> getRoleClusterNodeMapping(); - - /** - * Enum all role instances by role. - * @param role role, or "" for all roles - * @return a list of instances, may be empty - */ - List 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 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 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 getGlobalSubstitutionTokens(); - - /** - * Get config file cache. - */ - LoadingCache getConfigFileCache(); -} http://git-wip-us.apache.org/repos/asf/hadoop/blob/5b0c0896/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/5b0c0896/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