aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/core/Try-to-detect-the-race-conditions.patch150
1 files changed, 141 insertions, 9 deletions
diff --git a/docker/core/Try-to-detect-the-race-conditions.patch b/docker/core/Try-to-detect-the-race-conditions.patch
index f23e5daf8..8d0ad882d 100644
--- a/docker/core/Try-to-detect-the-race-conditions.patch
+++ b/docker/core/Try-to-detect-the-race-conditions.patch
@@ -1,4 +1,4 @@
-From 19b79df9e72184cbcf16a4dc70086ada44dfb335 Mon Sep 17 00:00:00 2001
+From 29ed118b9dc63721e78c3040912c76f54054a1be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Ollivier?= <cedric.ollivier@orange.com>
Date: Thu, 30 Apr 2020 13:59:24 +0200
Subject: [PATCH] Try to detect the race conditions
@@ -9,13 +9,15 @@ Content-Transfer-Encoding: 8bit
Change-Id: I9b468ec1cf79e0a66abeb1fb48f5f0f067c2c198
Signed-off-by: Cédric Ollivier <cedric.ollivier@orange.com>
---
- rally/plugins/task/runners/constant.py | 8 ++++++++
- rally/task/runner.py | 15 +++++++++++++++
- rally/task/utils.py | 15 +++++++++++++++
- 3 files changed, 38 insertions(+)
+ rally/plugins/task/runners/constant.py | 30 ++++++++++++++++++-
+ .../task/scenarios/requests/http_requests.py | 9 ++++++
+ .../plugins/task/scenarios/requests/utils.py | 9 ++++++
+ rally/task/runner.py | 27 +++++++++++++++--
+ rally/task/utils.py | 15 ++++++++++
+ 5 files changed, 87 insertions(+), 3 deletions(-)
diff --git a/rally/plugins/task/runners/constant.py b/rally/plugins/task/runners/constant.py
-index 5feb1fee1..755afb05a 100644
+index 5feb1fee1..38a01e28e 100644
--- a/rally/plugins/task/runners/constant.py
+++ b/rally/plugins/task/runners/constant.py
@@ -24,6 +24,10 @@ from rally.common import validation
@@ -47,8 +49,109 @@ index 5feb1fee1..755afb05a 100644
start_time = time.time()
# NOTE(msimonin): keep the previous behaviour
# > when duration is 0, scenario executes exactly 1 time
+@@ -93,13 +101,25 @@ def _worker_process(queue, iteration_gen, timeout, concurrency, times,
+ worker_args = (
+ queue, cls, method_name, scenario_context, args, event_queue)
+
++ LOG.warn(
++ "Cedric _to_be_continued threading.Thread {} {}".format(
++ runner._worker_thread, worker_args))
+ thread = threading.Thread(target=runner._worker_thread,
+ args=worker_args)
+
++ LOG.warn(
++ "Cedric _to_be_continued thread.start() {} {}".format(
++ runner._worker_thread, worker_args))
+ thread.start()
++ LOG.warn(
++ "Cedric _to_be_continued thread.start() {} {}".format(
++ runner._worker_thread, worker_args))
+ if timeout:
+ timeout_queue.put((thread, time.time() + timeout))
+ pool.append(thread)
++ LOG.warn(
++ "Cedric _to_be_continued pool.append {} {}".format(
++ pool, thread))
+ alive_threads_in_pool += 1
+
+ while alive_threads_in_pool == concurrency:
+@@ -128,7 +148,14 @@ def _worker_process(queue, iteration_gen, timeout, concurrency, times,
+
+ # Wait until all threads are done
+ while pool:
+- pool.popleft().join()
++ thr = pool.popleft()
++ LOG.warn(
++ "Cedric _worker_process wait_all_threads {} {} BEFORE JOIN".format(
++ pool, thr))
++ thr.join()
++ LOG.warn(
++ "Cedric _worker_process wait_all_threads {} {} AFTER JOIN".format(
++ pool, thr))
+
+ if timeout:
+ timeout_queue.put((None, None,))
+@@ -340,3 +367,4 @@ class ConstantForDurationScenarioRunner(runner.ScenarioRunner):
+ processes_to_start, _worker_process,
+ worker_args_gen(concurrency_overhead))
+ self._join_processes(process_pool, result_queue, event_queue)
++
+diff --git a/rally/plugins/task/scenarios/requests/http_requests.py b/rally/plugins/task/scenarios/requests/http_requests.py
+index e85ee5af2..4afdf29f1 100644
+--- a/rally/plugins/task/scenarios/requests/http_requests.py
++++ b/rally/plugins/task/scenarios/requests/http_requests.py
+@@ -15,6 +15,11 @@ import random
+ from rally.plugins.task.scenarios.requests import utils
+ from rally.task import scenario
+
++from rally.common import cfg
++from rally.common import logging
++CONF = cfg.CONF
++LOG = logging.getLogger(__file__)
++
+
+ """Scenarios for HTTP requests."""
+
+@@ -34,6 +39,10 @@ class HttpRequestsCheckRequest(utils.RequestScenario):
+ :param kwargs: optional additional request parameters
+ """
+
++ LOG.warn("Cedric run url {}".format(url))
++ LOG.warn("Cedric run method {}".format(method))
++ LOG.warn("Cedric run status_code {}".format(status_code))
++ LOG.warn("Cedric run kwargs {}".format(kwargs))
+ self._check_request(url, method, status_code, **kwargs)
+
+
+diff --git a/rally/plugins/task/scenarios/requests/utils.py b/rally/plugins/task/scenarios/requests/utils.py
+index 8fd35347a..cd69900a5 100644
+--- a/rally/plugins/task/scenarios/requests/utils.py
++++ b/rally/plugins/task/scenarios/requests/utils.py
+@@ -15,6 +15,11 @@ import requests
+ from rally.task import atomic
+ from rally.task import scenario
+
++from rally.common import cfg
++from rally.common import logging
++CONF = cfg.CONF
++LOG = logging.getLogger(__file__)
++
+
+ class RequestScenario(scenario.Scenario):
+ """Base class for Request scenarios with basic atomic actions."""
+@@ -31,6 +36,10 @@ class RequestScenario(scenario.Scenario):
+ not equal to expected status code
+ """
+
++ LOG.warn("Cedric _check_request url {}".format(url))
++ LOG.warn("Cedric _check_request method {}".format(method))
++ LOG.warn("Cedric _check_request status_code {}".format(status_code))
++ LOG.warn("Cedric _check_request kwargs {}".format(kwargs))
+ resp = requests.request(method, url, **kwargs)
+ if status_code != resp.status_code:
+ error_msg = "Expected HTTP request code is `%s` actual `%s`"
diff --git a/rally/task/runner.py b/rally/task/runner.py
-index 3397e1193..3fda122ce 100644
+index 3397e1193..57f9428f4 100644
--- a/rally/task/runner.py
+++ b/rally/task/runner.py
@@ -87,6 +87,11 @@ def _run_scenario_once(cls, method_name, context_obj, scenario_kwargs,
@@ -72,7 +175,36 @@ index 3397e1193..3fda122ce 100644
process = multiprocessing.Process(target=worker_process,
args=next(worker_args_gen),
kwargs={"info": kwrgs})
-@@ -245,8 +252,13 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
+@@ -202,18 +209,26 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
+ :param event_queue: multiprocessing.Queue that receives the events
+ """
+ while process_pool:
++ LOG.warn("Cedric _join_processes process_pool {}".format(process_pool))
+ while process_pool and not process_pool[0].is_alive():
++ LOG.warn("Cedric _join_processes process_pool {}".format(process_pool))
+ process_pool.popleft().join()
+
+ if result_queue.empty() and event_queue.empty():
+ # sleep a bit to avoid 100% usage of CPU by this method
++ LOG.warn("Cedric _join_processes result_queue is empty {}".format(result_queue))
++ LOG.warn("Cedric _join_processes event_queue is empty {}".format(event_queue))
+ time.sleep(0.01)
+
+ while not event_queue.empty():
+- self.send_event(**event_queue.get())
++ col_event_queue = event_queue.get()
++ LOG.warn("Cedric _join_processes event_queue is not empty {}".format(col_event_queue))
++ self.send_event(**col_event_queue)
+
+ while not result_queue.empty():
+- self._send_result(result_queue.get())
++ col_result_queue = result_queue.get()
++ LOG.warn("Cedric _join_processes result_queue is not empty {}".format(col_result_queue))
++ self._send_result(col_result_queue)
+
+ self._flush_results()
+ result_queue.close()
+@@ -245,8 +260,13 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
if len(self.result_batch) >= self.batch_size:
sorted_batch = sorted(self.result_batch,
key=lambda r: result["timestamp"])
@@ -86,7 +218,7 @@ index 3397e1193..3fda122ce 100644
def send_event(self, type, value=None):
"""Store event to send it to consumer later.
-@@ -254,6 +266,9 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
+@@ -254,6 +274,9 @@ class ScenarioRunner(plugin.Plugin, validation.ValidatablePluginMixin,
:param type: Event type
:param value: Optional event data
"""