aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuha Kosonen <juha.kosonen@nokia.com>2019-09-04 15:21:00 +0300
committerCédric Ollivier <cedric.ollivier@orange.com>2019-09-07 13:24:52 +0200
commit4d5ef08f38b3dd4a39a5f292e93f75d2aa4c2c8f (patch)
tree3ee1b7fc92d1d79fe92b51377ef0d2f3229b6608
parent6ca88fb069cdd7d0f57c1ed705b063cc40ea27b4 (diff)
Prevent occasional rally hangs
Set timeout on subprocess invocation instead of spawned child process. Increase the timeout value for rally_full to 2h since the execution typically takes ~90min [1]. [1] https://build.opnfv.org/ci/job/functest-opnfv-functest-benchmarking-latest-rally_full-run/22/ Change-Id: I0ca90bc2d85b4625336eb0396d8b2816a486b746 Signed-off-by: Juha Kosonen <juha.kosonen@nokia.com> (cherry picked from commit 9f07e41cc85f3dbe6e5eb151a0c59743521a6c00)
-rw-r--r--functest/opnfv_tests/openstack/rally/rally.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/functest/opnfv_tests/openstack/rally/rally.py b/functest/opnfv_tests/openstack/rally/rally.py
index 219aa0bed..b450580c7 100644
--- a/functest/opnfv_tests/openstack/rally/rally.py
+++ b/functest/opnfv_tests/openstack/rally/rally.py
@@ -22,6 +22,7 @@ import shutil
import subprocess
import time
+from threading import Timer
import pkg_resources
import prettytable
from ruamel.yaml import YAML
@@ -67,6 +68,7 @@ class RallyBase(singlevm.VmReady2):
visibility = 'public'
shared_network = True
allow_no_fip = True
+ task_timeout = 3600
def __init__(self, **kwargs):
"""Initialize RallyBase object."""
@@ -99,6 +101,7 @@ class RallyBase(singlevm.VmReady2):
self.run_cmd = ''
self.network_extensions = []
self.services = []
+ self.task_aborted = False
def _build_task_args(self, test_file_name):
"""Build arguments for the Rally task."""
@@ -422,14 +425,25 @@ class RallyBase(singlevm.VmReady2):
else:
LOGGER.info('Test scenario: "%s" Failed.', test_name)
+ def kill_task(self, proc):
+ """ Kill a task."""
+ proc.kill()
+ self.task_aborted = True
+
def run_task(self, test_name):
"""Run a task."""
LOGGER.info('Starting test scenario "%s" ...', test_name)
LOGGER.debug('running command: %s', self.run_cmd)
proc = subprocess.Popen(self.run_cmd, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
+ self.task_aborted = False
+ timer = Timer(self.task_timeout, self.kill_task, [proc])
+ timer.start()
output = proc.communicate()[0]
-
+ if self.task_aborted:
+ LOGGER.error("Failed to complete task")
+ raise Exception("Failed to complete task")
+ timer.cancel()
task_id = self.get_task_id(output)
LOGGER.debug('task_id : %s', task_id)
if task_id is None:
@@ -716,6 +730,8 @@ class RallySanity(RallyBase):
class RallyFull(RallyBase):
"""Rally full testcase implementation."""
+ task_timeout = 7200
+
def __init__(self, **kwargs):
"""Initialize RallyFull object."""
if "case_name" not in kwargs:
@@ -729,6 +745,7 @@ class RallyJobs(RallyBase):
"""Rally OpenStack CI testcase implementation."""
stests = ["neutron"]
+ task_timeout = 7200
def __init__(self, **kwargs):
"""Initialize RallyJobs object."""