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

Reply via email to