SLIDER-778 Clean up AgentProviderService slightly
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/19a6dfcd Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/19a6dfcd Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/19a6dfcd Branch: refs/heads/develop Commit: 19a6dfcd5ce94818b4bd2a08ebfaf50d99494aca Parents: 2887c1d Author: Steve Loughran <[email protected]> Authored: Fri Feb 6 17:39:02 2015 +0000 Committer: Steve Loughran <[email protected]> Committed: Fri Feb 6 17:39:02 2015 +0000 ---------------------------------------------------------------------- .../java/org/apache/slider/api/ClusterNode.java | 26 ++++++++++++--- .../apache/slider/common/tools/SliderUtils.java | 4 +-- .../providers/agent/AgentProviderService.java | 5 +-- .../slider/server/appmaster/state/AppState.java | 12 ++++--- .../appmaster/state/ProviderAppState.java | 6 ++++ .../server/appmaster/state/RoleInstance.java | 35 ++++++++++++++++++++ .../state/StateAccessForProviders.java | 7 ++++ .../agent/TestAgentProviderService.java | 21 +++++++++--- 8 files changed, 96 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java b/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java index cdfff35..2608cd7 100644 --- a/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java +++ b/slider-core/src/main/java/org/apache/slider/api/ClusterNode.java @@ -36,7 +36,7 @@ import java.io.IOException; */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL ) -public class ClusterNode { +public final class ClusterNode implements Cloneable { protected static final Logger LOG = LoggerFactory.getLogger(ClusterDescription.class); @@ -102,11 +102,13 @@ public class ClusterNode { /** * server-side ctor takes the container ID and builds the name from it - * @param containerId container ID + * @param containerId container ID; can be null */ public ClusterNode(ContainerId containerId) { - this.containerId = containerId; - this.name = containerId.toString(); + if (containerId != null) { + this.containerId = containerId; + this.name = containerId.toString(); + } } /** @@ -194,10 +196,24 @@ public class ClusterNode { node.roleId = message.getRoleId(); node.state = message.getState(); node.host = message.getHost(); -// node.hostUrl = message.getHostURL(); + node.hostUrl = message.getHostURL(); node.createTime = message.getCreateTime(); node.startTime = message.getStartTime(); node.released = message.getReleased(); return node; } + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public ClusterNode doClone() { + try { + return (ClusterNode)clone(); + } catch (CloneNotSupportedException e) { + //not going to happen. This is a final class + return null; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java index 6c69ad4..1e3379c 100644 --- a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java +++ b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java @@ -161,7 +161,7 @@ public final class SliderUtils { */ public static boolean isNotEmpty(List l) { - return l == null || l.isEmpty(); + return l != null && !l.isEmpty(); } /** @@ -170,7 +170,7 @@ public final class SliderUtils { * @return true if the reference is valid and it contains map entries */ public static boolean isNotEmpty(Map m) { - return m == null || m.isEmpty(); + return m != null && !m.isEmpty(); } /* http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java index f195432..10804cf 100644 --- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java +++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java @@ -1058,10 +1058,7 @@ public class AgentProviderService extends AbstractProviderService implements * @return the map of role->node */ protected Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping() { - amState.refreshClusterStatus(); - return (Map<String, Map<String, ClusterNode>>) - amState.getClusterStatus().status.get( - ClusterDescriptionKeys.KEY_CLUSTER_LIVE); + return amState.getRoleClusterNodeMapping(); } private String getContainerLabel(Container container, String role) { http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java index 8c461e4..a4ca130 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java @@ -1112,11 +1112,14 @@ public class AppState { } return map; } + + /** - * Build an instance map to send over the wire - * @return the map of Role name to list of Cluster Nodes, ready + * Build a map of role->nodename->node-info + * + * @return the map of Role name to list of Cluster Nodes */ - private synchronized Map<String, Map<String, ClusterNode>> createRoleToClusterNodeMap() { + public synchronized Map<String, Map<String, ClusterNode>> createRoleToClusterNodeMap() { Map<String, Map<String, ClusterNode>> map = new HashMap<String, Map<String, ClusterNode>>(); for (RoleInstance node : getLiveNodes().values()) { @@ -1125,8 +1128,7 @@ public class AppState { containers = new HashMap<String, ClusterNode>(); map.put(node.role, containers); } - Messages.RoleInstanceState pbuf = node.toProtobuf(); - ClusterNode clusterNode = ClusterNode.fromProtobuf(pbuf); + ClusterNode clusterNode = node.toClusterNode(); containers.put(clusterNode.name, clusterNode); } return map; http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java index 552e0a4..da91bbf 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java @@ -22,6 +22,7 @@ import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.slider.api.ClusterDescription; +import org.apache.slider.api.ClusterNode; import org.apache.slider.api.types.ApplicationLivenessInformation; import org.apache.slider.api.types.ComponentInformation; import org.apache.slider.core.conf.AggregateConf; @@ -237,4 +238,9 @@ public class ProviderAppState implements StateAccessForProviders { public Map<String, ComponentInformation> getComponentInfoSnapshot() { return appState.getComponentInfoSnapshot(); } + + @Override + public Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping() { + return appState.createRoleToClusterNodeMap(); + } } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java index 74abe72..4f9b222 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/RoleInstance.java @@ -25,6 +25,7 @@ import org.apache.hadoop.yarn.api.records.NodeId; 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.slider.api.ClusterNode; import org.apache.slider.api.proto.Messages; import org.apache.slider.api.types.ContainerInformation; import org.apache.slider.common.tools.SliderUtils; @@ -193,6 +194,40 @@ public final class RoleInstance implements Cloneable { } /** + * 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.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. http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java index 13c67b0..a1c6f24 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java @@ -22,6 +22,7 @@ import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.slider.api.ClusterDescription; +import org.apache.slider.api.ClusterNode; import org.apache.slider.api.StatusKeys; import org.apache.slider.api.types.ApplicationLivenessInformation; import org.apache.slider.api.types.ComponentInformation; @@ -258,4 +259,10 @@ public interface StateAccessForProviders { * @return a map of current role status values. */ Map<String, ComponentInformation> getComponentInfoSnapshot(); + + /** + * Find out about the nodes for specific roles + * @return + */ + Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping(); } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/19a6dfcd/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java ---------------------------------------------------------------------- diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java index 3b78fb8..1a10ee3 100644 --- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java +++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java @@ -340,6 +340,10 @@ public class TestAgentProviderService { desc.setOption(OptionKeys.ZOOKEEPER_QUORUM, "host1:2181"); desc.setInfo(OptionKeys.APPLICATION_NAME, "HBASE"); expect(access.getClusterStatus()).andReturn(desc).anyTimes(); + Map<String, Map<String, ClusterNode>> cnMap = + new HashMap<String, Map<String, ClusterNode>>(); + expect(access.getRoleClusterNodeMapping()).andReturn(cnMap).anyTimes(); + AggregateConf aggConf = new AggregateConf(); ConfTreeOperations treeOps = aggConf.getAppConfOperations(); @@ -752,6 +756,18 @@ public class TestAgentProviderService { public ClusterDescription getClusterStatus() { ClusterDescription cd = new ClusterDescription(); cd.status = new HashMap<String, Object>(); + + cd.status.put(ClusterDescriptionKeys.KEY_CLUSTER_LIVE, buildRoleMap()); + + return cd; + } + + @Override + public Map<String, Map<String, ClusterNode>> getRoleClusterNodeMapping() { + return buildRoleMap(); + } + + public Map<String, Map<String, ClusterNode>> buildRoleMap() { Map<String, Map<String, ClusterNode>> roleMap = new HashMap<String, Map<String, ClusterNode>>(); ClusterNode cn1 = new ClusterNode(new MockContainerId(1)); cn1.host = "FIRST_HOST"; @@ -767,10 +783,7 @@ public class TestAgentProviderService { roleMap.put("FIRST_ROLE", map1); roleMap.put("SECOND_ROLE", map2); - - cd.status.put(ClusterDescriptionKeys.KEY_CLUSTER_LIVE, roleMap); - - return cd; + return roleMap; } @Override
