From b9842dfd4ec35b39ee855d28df2fecf37bd9a399 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 26 Jul 2022 15:57:51 +0200 Subject: [PATCH 1/4] possible fix for deadlock in IvasModeRunner.py --- scripts/pyivastest/IvasModeRunner.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/pyivastest/IvasModeRunner.py b/scripts/pyivastest/IvasModeRunner.py index 84616a9331..b271fa6d62 100755 --- a/scripts/pyivastest/IvasModeRunner.py +++ b/scripts/pyivastest/IvasModeRunner.py @@ -1596,7 +1596,9 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): self.dec_queue["condition"].acquire() if not self.dec_queue["dec_entries"]: all_encoded = self.dec_queue["all_encoded"] - if all_encoded: + if all_encoded and self.stats["num_modes"] == self.stats["num_modes_finished"]: + self.dec_queue["condition"].notify() + self.dec_queue["condition"].release() break self.dec_queue["condition"].wait(10) -- GitLab From 29033fb348721cc251dd9044d4941fbdbe548bb8 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 27 Jul 2022 11:03:34 +0200 Subject: [PATCH 2/4] wait for smaller amount of time when running threaded --- scripts/pyivastest/IvasModeRunner.py | 56 +++++++++++++--------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/scripts/pyivastest/IvasModeRunner.py b/scripts/pyivastest/IvasModeRunner.py index b271fa6d62..3d26900cf4 100755 --- a/scripts/pyivastest/IvasModeRunner.py +++ b/scripts/pyivastest/IvasModeRunner.py @@ -1578,36 +1578,32 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): executor.submit(self.ivas_enc_thread, mode, config) ) while run_dec: - - self.lock.acquire() - # check if all enc tasks are done, either regularily or with exceptions - try: - finished_enc_tasks = concurrent.futures.wait( - tasks_enc, timeout=0.001 - ) - if len(finished_enc_tasks.not_done) == 0: - self.dec_queue["all_encoded"] = True - except concurrent.futures.TimeoutError: - # not all done yet, continue... - pass - - self.lock.release() - - self.dec_queue["condition"].acquire() - if not self.dec_queue["dec_entries"]: - all_encoded = self.dec_queue["all_encoded"] - if all_encoded and self.stats["num_modes"] == self.stats["num_modes_finished"]: - self.dec_queue["condition"].notify() - self.dec_queue["condition"].release() - break - self.dec_queue["condition"].wait(10) - - while self.dec_queue["dec_entries"] != []: - config = self.dec_queue["dec_entries"].pop(0) - tasks_dec.append(executor.submit(self.ivas_dec_thread, config)) - - self.dec_queue["condition"].notify() - self.dec_queue["condition"].release() + with self.lock: + # check if all enc tasks are done, either regularily or with exceptions + try: + finished_enc_tasks = concurrent.futures.wait( + tasks_enc, timeout=0.001 + ) + if len(finished_enc_tasks.not_done) == 0: + self.dec_queue["all_encoded"] = True + except concurrent.futures.TimeoutError: + # not all done yet, continue... + pass + + with self.dec_queue["condition"]: + if not self.dec_queue["dec_entries"]: + all_encoded = self.dec_queue["all_encoded"] + all_modes_done = self.stats["num_modes"] == self.stats["num_modes_finished"] + if all_encoded and all_modes_done: + self.dec_queue["condition"].notify() + break + self.dec_queue["condition"].wait(1) + + while self.dec_queue["dec_entries"] != []: + config = self.dec_queue["dec_entries"].pop(0) + tasks_dec.append(executor.submit(self.ivas_dec_thread, config)) + + self.dec_queue["condition"].notify() self.show_final_stats() -- GitLab From 15a696e21af4be26ae2570db03f34bd6528d9e79 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 27 Jul 2022 11:11:28 +0200 Subject: [PATCH 3/4] remove tag from smoke test --- .gitlab-ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7aff1b478a..2a388d6ac8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -124,8 +124,6 @@ build-codec-sanitizers-linux: codec-smoke-test: extends: .test-job-linux-needs-testv-dir # temporarily restrict this job to the only runner which (so far) seems to runit without problems - tags: - - smoke-test timeout: "5 minutes" rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' -- GitLab From 006d2d0b49afb89305b897d7f6f47e759eab4fef Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 27 Jul 2022 11:23:10 +0200 Subject: [PATCH 4/4] restructure code for clarity --- scripts/pyivastest/IvasModeRunner.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/scripts/pyivastest/IvasModeRunner.py b/scripts/pyivastest/IvasModeRunner.py index 3d26900cf4..246e8139ad 100755 --- a/scripts/pyivastest/IvasModeRunner.py +++ b/scripts/pyivastest/IvasModeRunner.py @@ -1591,15 +1591,18 @@ class IvasModeRunner(IvasModeCollector.IvasModeCollector): pass with self.dec_queue["condition"]: - if not self.dec_queue["dec_entries"]: - all_encoded = self.dec_queue["all_encoded"] - all_modes_done = self.stats["num_modes"] == self.stats["num_modes_finished"] - if all_encoded and all_modes_done: - self.dec_queue["condition"].notify() - break + dec_queue_empty = len(self.dec_queue["dec_entries"]) == 0 + all_encoded = self.dec_queue["all_encoded"] + all_modes_done = self.stats["num_modes"] == self.stats["num_modes_finished"] + + if dec_queue_empty and all_encoded and all_modes_done: + self.dec_queue["condition"].notify() + break + else: self.dec_queue["condition"].wait(1) - while self.dec_queue["dec_entries"] != []: + # can not reuse dec_queue_empty here, since there might be new items after waiting + while len(self.dec_queue["dec_entries"]) != 0: config = self.dec_queue["dec_entries"].pop(0) tasks_dec.append(executor.submit(self.ivas_dec_thread, config)) -- GitLab