You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by jc...@apache.org on 2015/04/15 21:01:48 UTC

aurora git commit: Only perform escalation wait when http teardown signal could be dispatched

Repository: aurora
Updated Branches:
  refs/heads/master 669f27999 -> 10e75fc1e


Only perform escalation wait when http teardown signal could be dispatched

Testing Done:
./pants test.pytest --no-fast --options=-v src/test/python/apache/aurora/executor:thermos_task_runner

In addition, manual verification that shutdown of health-checked services without lifecycle methods is 10 seconds faster.

Bugs closed: AURORA-1275

Reviewed at https://reviews.apache.org/r/32889/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/10e75fc1
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/10e75fc1
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/10e75fc1

Branch: refs/heads/master
Commit: 10e75fc1e3649ddbcf3f810dbaba960ae35ee94a
Parents: 669f279
Author: Stephan Erb <st...@dev.static-void.de>
Authored: Wed Apr 15 12:01:29 2015 -0700
Committer: Joshua Cohen <jc...@apache.org>
Committed: Wed Apr 15 12:01:29 2015 -0700

----------------------------------------------------------------------
 .../aurora/executor/thermos_task_runner.py      | 17 ++++-----
 src/test/python/apache/aurora/executor/BUILD    |  1 +
 .../aurora/executor/test_thermos_task_runner.py | 37 ++++++++++++++++++--
 3 files changed, 41 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/10e75fc1/src/main/python/apache/aurora/executor/thermos_task_runner.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/executor/thermos_task_runner.py b/src/main/python/apache/aurora/executor/thermos_task_runner.py
index 505a1e6..8ce9168 100644
--- a/src/main/python/apache/aurora/executor/thermos_task_runner.py
+++ b/src/main/python/apache/aurora/executor/thermos_task_runner.py
@@ -119,17 +119,12 @@ class ThermosTaskRunner(TaskRunner):
 
     http_signaler = HttpSignaler(self._ports['health'])
 
-    # pass 1
-    http_signaler.quitquitquit()
-    self._clock.sleep(self.ESCALATION_WAIT.as_(Time.SECONDS))
-    if self.status is not None:
-      return True
-
-    # pass 2
-    http_signaler.abortabortabort()
-    self._clock.sleep(self.ESCALATION_WAIT.as_(Time.SECONDS))
-    if self.status is not None:
-      return True
+    for exit_request in [http_signaler.quitquitquit, http_signaler.abortabortabort]:
+      handled, _ = exit_request()
+      if handled:
+        self._clock.sleep(self.ESCALATION_WAIT.as_(Time.SECONDS))
+        if self.status is not None:
+          return
 
   @property
   def artifact_dir(self):

http://git-wip-us.apache.org/repos/asf/aurora/blob/10e75fc1/src/test/python/apache/aurora/executor/BUILD
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/executor/BUILD b/src/test/python/apache/aurora/executor/BUILD
index 013f056..f415ecc 100644
--- a/src/test/python/apache/aurora/executor/BUILD
+++ b/src/test/python/apache/aurora/executor/BUILD
@@ -83,6 +83,7 @@ python_tests(name = 'thermos_task_runner',
   sources = ['test_thermos_task_runner.py'],
   dependencies = [
     '3rdparty/python:mesos.interface',
+    '3rdparty/python:mock',
     '3rdparty/python:twitter.common.contextutil',
     '3rdparty/python:twitter.common.dirutil',
     '3rdparty/python:twitter.common.log',

http://git-wip-us.apache.org/repos/asf/aurora/blob/10e75fc1/src/test/python/apache/aurora/executor/test_thermos_task_runner.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/executor/test_thermos_task_runner.py b/src/test/python/apache/aurora/executor/test_thermos_task_runner.py
index a1005a8..1e21a11 100644
--- a/src/test/python/apache/aurora/executor/test_thermos_task_runner.py
+++ b/src/test/python/apache/aurora/executor/test_thermos_task_runner.py
@@ -23,6 +23,7 @@ import time
 
 import pytest
 from mesos.interface import mesos_pb2
+from mock import call, Mock, patch
 from twitter.common import log
 from twitter.common.contextutil import temporary_dir
 from twitter.common.dirutil import safe_rmtree
@@ -78,7 +79,7 @@ class TestThermosTaskRunnerIntegration(object):
       print('Saving executor logs in %s' % cls.LOG_DIR)
 
   @contextlib.contextmanager
-  def yield_runner(self, runner_class, **bindings):
+  def yield_runner(self, runner_class, portmap={}, clock=time, **bindings):
     with contextlib.nested(temporary_dir(), temporary_dir()) as (td1, td2):
       sandbox = DirectorySandbox(td1)
       checkpoint_root = td2
@@ -88,16 +89,19 @@ class TestThermosTaskRunnerIntegration(object):
           task_id='hello_world',
           task=TASK.bind(**bindings).task(),
           role=getpass.getuser(),
-          portmap={},
+          portmap=portmap,
+          clock=clock,
           sandbox=sandbox,
           checkpoint_root=checkpoint_root,
       )
 
       yield task_runner
 
-  def yield_sleepy(self, runner_class, sleep, exit_code):
+  def yield_sleepy(self, runner_class, sleep, exit_code, portmap={}, clock=time):
     return self.yield_runner(
         runner_class,
+        portmap=portmap,
+        clock=clock,
         command='sleep {{__sleep}} && exit {{__exit_code}}',
         __sleep=sleep,
         __exit_code=exit_code)
@@ -211,6 +215,33 @@ class TestThermosTaskRunnerIntegration(object):
       assert task_runner.status is not None
       assert task_runner.status.status == mesos_pb2.TASK_KILLED
 
+  @patch('apache.aurora.executor.thermos_task_runner.HttpSignaler')
+  def test_integration_http_teardown(self, SignalerClass):
+    signaler = SignalerClass.return_value
+    signaler.quitquitquit.return_value = (False, 'failed to dispatch')
+    signaler.abortabortabort.return_value = (True, None)
+
+    clock = Mock(wraps=time)
+
+    class ShortEscalationRunner(ThermosTaskRunner):
+      ESCALATION_WAIT = Amount(1, Time.MICROSECONDS)
+
+    with self.yield_sleepy(
+        ShortEscalationRunner,
+        portmap={'health': 3141},
+        clock=clock,
+        sleep=1000,
+        exit_code=0) as task_runner:
+
+      task_runner.start()
+      task_runner.forked.wait()
+
+      task_runner.stop()
+
+      escalation_wait = call(ShortEscalationRunner.ESCALATION_WAIT.as_(Time.SECONDS))
+      assert clock.sleep.mock_calls.count(escalation_wait) == 1
+      assert signaler.mock_calls == [call.quitquitquit(), call.abortabortabort()]
+
   def test_thermos_normal_exit_status(self):
     with self.exit_with_status(0, TaskState.SUCCESS) as task_runner:
       assert task_runner._popen_signal == 0