From 3a337529e8d8c22b0ab0c41bf71bd9f3fda74a62 Mon Sep 17 00:00:00 2001 From: Akanksha Trehun Date: Mon, 31 Aug 2026 13:36:40 +0530 Subject: [PATCH] Return errors instead of log.Fatal in storage containerd adapter log.Fatal calls os.Exit(1) directly, which kills the whole harness process on a single trial's containerd error instead of letting the orchestrator record the trial as failed and move on to the next one. Every log.Fatal call here lives inside Prepare, CreateTask, StartTask, or DeleteTask, which already return (harnessruntime.StageResult, error) to satisfy the Adapter interface, so no caller changes were needed: each fatal call is replaced with returning the underlying error wrapped with fmt.Errorf, matching the error-wrapping style already used elsewhere in this file (getOrPullImage). Updates #10 Signed-off-by: Akanksha Trehun --- internal/runtime/storage/adapter.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/runtime/storage/adapter.go b/internal/runtime/storage/adapter.go index 8292713..c89669e 100644 --- a/internal/runtime/storage/adapter.go +++ b/internal/runtime/storage/adapter.go @@ -105,7 +105,7 @@ func (a *Adapter) Prepare(ctx context.Context, tc harnessruntime.TrialContext) ( // image image, err := getOrPullImage(*a.ContainerdNamespace, a.ContainerdClient, tc.Trial.Image, tc.Trial.Snapshotter) if err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("get or pull image %q: %w", tc.Trial.Image, err) } // create container metadata container, err := a.ContainerdClient.NewContainer( @@ -120,7 +120,7 @@ func (a *Adapter) Prepare(ctx context.Context, tc harnessruntime.TrialContext) ( ), ) if err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("create container %q: %w", tc.Trial.ID, err) } a.Container = container @@ -165,13 +165,13 @@ func (a *Adapter) CreateTask(ctx context.Context, tc harnessruntime.TrialContext cio.WithStreams(nil, &a.StdoutBuffer, &a.StderrBuffer), )) if err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("create task %q: %w", tc.Trial.ID, err) } a.Task = task exitCh, err := task.Wait(*a.ContainerdNamespace) if err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("wait on task %q: %w", tc.Trial.ID, err) } a.TaskExitCh = exitCh @@ -213,7 +213,7 @@ func (a *Adapter) StartTask(ctx context.Context, tc harnessruntime.TrialContext) startedAt := time.Now() if err := a.Task.Start(*a.ContainerdNamespace); err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("start task %q: %w", tc.Trial.ID, err) } finishedAt := time.Now() @@ -227,7 +227,7 @@ func (a *Adapter) StartTask(ctx context.Context, tc harnessruntime.TrialContext) case status := <-a.TaskExitCh: exitCodee, _, err := status.Result() if err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("read task exit status: %w", err) } exitCode = exitCodee @@ -286,7 +286,7 @@ func (a *Adapter) DeleteTask(ctx context.Context, tc harnessruntime.TrialContext startedAt := time.Now() if _, err := a.Task.Delete(*a.ContainerdNamespace); err != nil { - log.Fatal(err) + return harnessruntime.StageResult{}, fmt.Errorf("delete task %q: %w", tc.Trial.ID, err) } finishedAt := time.Now()