You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by st...@apache.org on 2014/10/23 12:40:42 UTC

[03/10] git commit: SLIDER-554 slide exists --state may pick up KILLED/FINISHED app reports and then fail

SLIDER-554 slide exists --state may pick up KILLED/FINISHED app reports and then fail


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/0254e9d0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/0254e9d0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/0254e9d0

Branch: refs/heads/develop
Commit: 0254e9d00af363eba280c05824b8ae8b67c3873c
Parents: 1e4edc2
Author: Steve Loughran <st...@apache.org>
Authored: Wed Oct 22 12:34:14 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Thu Oct 23 11:35:54 2014 +0100

----------------------------------------------------------------------
 .../org/apache/slider/client/SliderClient.java  | 57 ++++++++++++--------
 .../slider/client/SliderYarnClientImpl.java     | 22 ++++++++
 .../agent/actions/TestActionExists.groovy       | 16 ++++--
 3 files changed, 69 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/0254e9d0/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index e89ca65..6ea305e 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -1752,36 +1752,49 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
       log.info("Application {} exists", name);
       return EXIT_SUCCESS;
     }
-    
+
     //test for liveness/state
-    ApplicationReport instance = findInstance(name);
+    boolean inDesiredState = false;
+    ApplicationReport instance;
+    instance = findInstance(name);
     if (instance == null) {
       log.info("Application {} not running", name);
       return EXIT_FALSE;
-    } else {
-      // the app exists, but it may be in a terminated state
-      SliderUtils.OnDemandReportStringifier report =
-          new SliderUtils.OnDemandReportStringifier(instance);
-      YarnApplicationState appstate =
-          instance.getYarnApplicationState();
-      boolean inDesiredState;
-      if (checkLive) {
-        inDesiredState =
+    }
+    if (checkLive) {
+      // the app exists, check that it is not in any terminated state
+      YarnApplicationState appstate = instance.getYarnApplicationState();
+      inDesiredState =
             appstate.ordinal() < YarnApplicationState.FINISHED.ordinal();
-      } else {
-        state = state.toUpperCase(Locale.ENGLISH);
-        inDesiredState = state.equals(appstate.toString());
-      }
-      if (!inDesiredState) {
-        //cluster in the list of apps but not running
-        log.info("Application {} found but is in wrong state {}", name, appstate);
-        log.debug("State {}", report);
-        return EXIT_FALSE;
+    } else {
+      // scan for instance in single --state state
+      List<ApplicationReport> userInstances = yarnClient.listInstances("");
+      state = state.toUpperCase(Locale.ENGLISH);
+      YarnApplicationState desiredState =
+          YarnApplicationState.valueOf(state);
+      ApplicationReport foundInstance =
+          yarnClient.findClusterInInstanceList(userInstances, name, desiredState);
+      if (foundInstance != null) {
+        // found in selected state: success
+        inDesiredState = true;
+        // mark this as the instance to report
+        instance = foundInstance;
       }
-      log.info("Application {} is {}\n{}", name, appstate, report);
     }
 
-    return EXIT_SUCCESS;
+    SliderUtils.OnDemandReportStringifier report =
+        new SliderUtils.OnDemandReportStringifier(instance);
+    if (!inDesiredState) {
+      //cluster in the list of apps but not running
+      log.info("Application {} found but is in wrong state {}", name,
+          instance.getYarnApplicationState());
+      log.debug("State {}", report);
+      return EXIT_FALSE;
+    } else {
+      log.info("Application {} is {}\n{}", name,
+          instance.getYarnApplicationState(), report);
+      return EXIT_SUCCESS;
+    }
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/0254e9d0/slider-core/src/main/java/org/apache/slider/client/SliderYarnClientImpl.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderYarnClientImpl.java b/slider-core/src/main/java/org/apache/slider/client/SliderYarnClientImpl.java
index 3151a09..c793bd1 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderYarnClientImpl.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderYarnClientImpl.java
@@ -250,6 +250,12 @@ public class SliderYarnClientImpl extends YarnClientImpl {
     return results;
   }
 
+  /**
+   * Find a cluster in the instance list; biased towards live instances
+   * @param instances
+   * @param appname
+   * @return
+   */
   public ApplicationReport findClusterInInstanceList(List<ApplicationReport> instances,
                                                      String appname) {
     ApplicationReport found = null;
@@ -268,5 +274,21 @@ public class SliderYarnClientImpl extends YarnClientImpl {
     return found;
   }
 
+  public ApplicationReport findClusterInInstanceList(List<ApplicationReport> instances,
+                                                     String appname,
+      YarnApplicationState desiredState) {
+    ApplicationReport found = null;
+    ApplicationReport foundAndLive = null;
+    for (ApplicationReport app : instances) {
+      if (app.getName().equals(appname)) {
+        if (app.getYarnApplicationState().equals(desiredState)) {
+          return app;
+        }
+      }
+    }
+    // nothing found in desired state
+    return null;
+  }
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/0254e9d0/slider-core/src/test/groovy/org/apache/slider/agent/actions/TestActionExists.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/actions/TestActionExists.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/actions/TestActionExists.groovy
index 277fa7d..202734c 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/actions/TestActionExists.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/actions/TestActionExists.groovy
@@ -112,9 +112,9 @@ class TestActionExists extends AgentMiniClusterTestBase {
     assert 0 == sliderClient.actionExists(clustername, true)
 
     // assert that the cluster is in the running state
-    ActionExistsArgs args = new ActionExistsArgs()
-    args.state = YarnApplicationState.RUNNING.toString()
-    assert 0 == sliderClient.actionExists(clustername, args)
+    ActionExistsArgs running = new ActionExistsArgs()
+    running.state = YarnApplicationState.RUNNING.toString()
+    assert 0 == sliderClient.actionExists(clustername, running)
     
     // stop the cluster
     clusterActionFreeze(sliderClient, clustername)
@@ -124,7 +124,15 @@ class TestActionExists extends AgentMiniClusterTestBase {
 
     //but the cluster is still there for the default
     assert 0 == sliderClient.actionExists(clustername, false)
-    assert LauncherExitCodes.EXIT_FALSE == sliderClient.actionExists(clustername, args)
+    assert LauncherExitCodes.EXIT_FALSE == sliderClient.actionExists(clustername, running)
+
+    // verify that on a cluster thaw the existence probes still work, that is
+    // they do not discover the previous instance and return false when there
+    // is actually a live cluster
+    ServiceLauncher launcher2 = thawCluster(clustername, [], true);
+    addToTeardown(launcher2)
+    assert 0 == sliderClient.actionExists(clustername, running)
+    assert 0 == sliderClient.actionExists(clustername, true)
   }
   
 }