[#316] Extend parallel exception message output
Some checks failed
DCO action / DCO (pull_request) Has been cancelled
Some checks failed
DCO action / DCO (pull_request) Has been cancelled
Signed-off-by: a.berezin <a.berezin@yadro.com>
This commit is contained in:
parent
55d8ee5da0
commit
95b32a036a
1 changed files with 37 additions and 1 deletions
|
@ -1,4 +1,5 @@
|
||||||
import itertools
|
import itertools
|
||||||
|
import traceback
|
||||||
from concurrent.futures import Future, ThreadPoolExecutor
|
from concurrent.futures import Future, ThreadPoolExecutor
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from typing import Callable, Collection, Optional, Union
|
from typing import Callable, Collection, Optional, Union
|
||||||
|
@ -55,7 +56,42 @@ def parallel(
|
||||||
# Check for exceptions
|
# Check for exceptions
|
||||||
exceptions = [future.exception() for future in futures if future.exception()]
|
exceptions = [future.exception() for future in futures if future.exception()]
|
||||||
if exceptions:
|
if exceptions:
|
||||||
message = "\n".join([str(e) for e in exceptions])
|
# Prettify exception in parallel with all underlying stack traces
|
||||||
|
# For example, we had 3 RuntimeError exceptions during parallel. This format will give us something like
|
||||||
|
#
|
||||||
|
# RuntimeError: The following exceptions occured during parallel run:
|
||||||
|
# 1) Exception one text
|
||||||
|
# 2) Exception two text
|
||||||
|
# 3) Exception three text
|
||||||
|
# TRACES:
|
||||||
|
# ==== 1 ====
|
||||||
|
# Traceback (most recent call last):
|
||||||
|
# File "/usr/lib/python3.10/concurrent/futures/thread.py", line 58, in run
|
||||||
|
# result = self.fn(*self.args, **self.kwargs)
|
||||||
|
# File "frostfs_testcases/pytest_tests/testsuites/object/test_object_tombstone.py", line 17, in check_service
|
||||||
|
# raise RuntimeError(f"Exception one text")
|
||||||
|
# RuntimeError: Exception one text
|
||||||
|
#
|
||||||
|
# ==== 2 ====
|
||||||
|
# Traceback (most recent call last):
|
||||||
|
# File "/usr/lib/python3.10/concurrent/futures/thread.py", line 58, in run
|
||||||
|
# result = self.fn(*self.args, **self.kwargs)
|
||||||
|
# File "frostfs_testcases/pytest_tests/testsuites/object/test_object_tombstone.py", line 17, in check_service
|
||||||
|
# raise RuntimeError(f"Exception two text")
|
||||||
|
# RuntimeError: Exception two text
|
||||||
|
#
|
||||||
|
# ==== 3 ====
|
||||||
|
# Traceback (most recent call last):
|
||||||
|
# File "/usr/lib/python3.10/concurrent/futures/thread.py", line 58, in run
|
||||||
|
# result = self.fn(*self.args, **self.kwargs)
|
||||||
|
# File "frostfs_testcases/pytest_tests/testsuites/object/test_object_tombstone.py", line 17, in check_service
|
||||||
|
# raise RuntimeError(f"Exception three text")
|
||||||
|
# RuntimeError: Exception three text
|
||||||
|
short_summary = "\n".join([f"{i}) {str(e)}" for i, e in enumerate(exceptions, 1)])
|
||||||
|
stack_traces = "\n".join(
|
||||||
|
[f"==== {i} ====\n{''.join(traceback.TracebackException.from_exception(e).format())}" for i, e in enumerate(exceptions, 1)]
|
||||||
|
)
|
||||||
|
message = f"{short_summary}\nTRACES:\n{stack_traces}"
|
||||||
raise RuntimeError(f"The following exceptions occured during parallel run:\n{message}")
|
raise RuntimeError(f"The following exceptions occured during parallel run:\n{message}")
|
||||||
return futures
|
return futures
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue