worker: cover goal docker paths with prestart stage logging

PR #145 added docker_run_* lines only to _run_in_container, but
goal/goal-resume/goal-resume-breakpoint call _call_runner directly
(to keep full stdout for goal conclusions), so the production live
test (a goal task) produced zero docker_run_ lines. Extract a
_docker_call_staged helper and route all four task paths through it;
error lines log the class name then re-raise so each caller's
kill+failed handling is unchanged.

Also fix audit attribution: audit_log has no task_id column, and
worker_exec_done/error details carried no task id, so per-task
queries missed them (the rows existed). All three exec details now
start with task_id=. Tests: 2 new goal-path stage cases + a done
detail task-id assertion (8 total in test_prestart_stages).
This commit is contained in:
host committed 2026-10-29 17:46:12 +08:00
1 parent a17f0c7412
commit 6f0eec71b6
3 files changed
+76 -28

No files matched your search

+6 -6
View File
@@ -3560,8 +3560,8 @@ class Worker:
_exec_container = None
_exec_t0 = time.time()
_exec_error = None
_exec_detail = "kind=%s executor=%s timeout=%s" % (
_exec_kind, self._executor_name(),
_exec_detail = "task_id=%s kind=%s executor=%s timeout=%s" % (
task_id, _exec_kind, self._executor_name(),
"None" if _effective_task_timeout is None
else _effective_task_timeout)
if _exec_container:
@@ -3797,8 +3797,8 @@ class Worker:
_exec_elapsed_ms = int((time.time() - _exec_t0) * 1000)
if _exec_error is not None:
self._audit(task.get("project_id"), "worker_exec_error",
"elapsed_ms=%d error=%s"
% (_exec_elapsed_ms,
"task_id=%s elapsed_ms=%d error=%s"
% (task_id, _exec_elapsed_ms,
_exec_error.__class__.__name__))
log_event(self.logger, "worker_exec_error", task_id=task_id,
message="worker exec error: elapsed_ms=%d error=%s"
@@ -3806,8 +3806,8 @@ class Worker:
_exec_error.__class__.__name__))
else:
self._audit(task.get("project_id"), "worker_exec_done",
"elapsed_ms=%d status=%s returncode=%s"
% (_exec_elapsed_ms, result.get("status"),
"task_id=%s elapsed_ms=%d status=%s returncode=%s"
% (task_id, _exec_elapsed_ms, result.get("status"),
result.get("returncode")))
log_event(self.logger, "worker_exec_done", task_id=task_id,
status=result.get("status"),