From 023f6e86210bdfdbfb81f58211727f2013138493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Bartmi=C5=84ski?= Date: Sun, 23 Feb 2025 23:47:28 +0100 Subject: [PATCH 1/2] Print executor cmdline on exception --- src/sinol_make/__init__.py | 2 +- src/sinol_make/executors/__init__.py | 14 ++++++++++---- src/sinol_make/executors/sio2jail.py | 19 ++++++++----------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/sinol_make/__init__.py b/src/sinol_make/__init__.py index ffa53349..5a936997 100644 --- a/src/sinol_make/__init__.py +++ b/src/sinol_make/__init__.py @@ -12,7 +12,7 @@ from sinol_make.task_type.interactive import InteractiveTaskType # noqa -__version__ = "1.9.7" +__version__ = "1.9.8" def configure_parsers(): diff --git a/src/sinol_make/executors/__init__.py b/src/sinol_make/executors/__init__.py index 9d41d9a1..1ffa8b2e 100644 --- a/src/sinol_make/executors/__init__.py +++ b/src/sinol_make/executors/__init__.py @@ -1,6 +1,8 @@ import subprocess +import traceback from typing import List, Tuple, Union +from sinol_make import util from sinol_make.structs.status_structs import ExecutionResult, Status @@ -46,10 +48,14 @@ def execute(self, command: List[str], time_limit, hard_time_limit, memory_limit, command = self._wrap_command(command, result_file_path, time_limit, memory_limit) cmdline = " ".join(command) - tle, mle, return_code, proc_stderr = self._execute(cmdline, time_limit, hard_time_limit, memory_limit, - result_file_path, executable, execution_dir, stdin, stdout, - stderr, fds_to_close, *args, **kwargs) - result = self._parse_result(tle, mle, return_code, result_file_path) + try: + tle, mle, return_code, proc_stderr = self._execute(cmdline, time_limit, hard_time_limit, memory_limit, + result_file_path, executable, execution_dir, stdin, stdout, + stderr, fds_to_close, *args, **kwargs) + result = self._parse_result(tle, mle, return_code, result_file_path) + except Exception as e: + util.exit_with_error(f"Failed to run executor command:\n\t{cmdline}\n\n{traceback.format_exc()}") + result.Cmdline = cmdline if not result.Stderr: result.Stderr = proc_stderr diff --git a/src/sinol_make/executors/sio2jail.py b/src/sinol_make/executors/sio2jail.py index c0bbdb5c..851a8114 100644 --- a/src/sinol_make/executors/sio2jail.py +++ b/src/sinol_make/executors/sio2jail.py @@ -2,7 +2,6 @@ import signal import subprocess import sys -import traceback from typing import List, Tuple, Union from sinol_make import util @@ -54,19 +53,17 @@ def _parse_memory(self, memory_str): def _parse_result(self, _, mle, return_code, result_file_path) -> ExecutionResult: result = ExecutionResult() with open(result_file_path, "r") as result_file: - lines = result_file.readlines() - + output_lines = result_file.readlines() try: - result.stderr = lines[:-2] - status, code, time_ms, _, memory_kb, _ = lines[-2].strip().split() - message = lines[-1].strip() + result.stderr = output_lines[-2] + status, code, time_ms, _, memory_kb, _ = output_lines[-2].strip().split() + message = output_lines[-1].strip() result.Time = int(time_ms) result.Memory = int(memory_kb) - except: - output = "".join(lines) - util.exit_with_error("Could not parse sio2jail output:" - f"\n---\n{output}" - f"\n---\n{traceback.format_exc()}") + except Exception as e: + output = "\t" + "\t".join(output_lines) + raise Exception(f"Failed to parse sio2jail output:\n{output}") from e + # ignoring `status` is weird, but sio2 does it this way if message == 'ok': From f5d36570362187e5d9eb0ce14a41735e6a411779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Bartmi=C5=84ski?= Date: Sun, 2 Mar 2025 23:35:41 +0100 Subject: [PATCH 2/2] fail in a way that's better handled in unit tests --- src/sinol_make/executors/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sinol_make/executors/__init__.py b/src/sinol_make/executors/__init__.py index 1ffa8b2e..88da6e35 100644 --- a/src/sinol_make/executors/__init__.py +++ b/src/sinol_make/executors/__init__.py @@ -1,5 +1,4 @@ import subprocess -import traceback from typing import List, Tuple, Union from sinol_make import util @@ -54,7 +53,8 @@ def execute(self, command: List[str], time_limit, hard_time_limit, memory_limit, stderr, fds_to_close, *args, **kwargs) result = self._parse_result(tle, mle, return_code, result_file_path) except Exception as e: - util.exit_with_error(f"Failed to run executor command:\n\t{cmdline}\n\n{traceback.format_exc()}") + print(util.error(f"Failed to run executor command:\n\t{cmdline}\n")) + raise result.Cmdline = cmdline if not result.Stderr: