From f078cebbd11b16cd52559598e7bd778b1cc06e2a Mon Sep 17 00:00:00 2001 From: Hayato Kiwata Date: Mon, 26 Jan 2026 22:58:28 +0900 Subject: [PATCH] fix: propagate `context deadline exceeded` error properly When a shim becomes unresponsive (e.g., stopped via SIGSTOP), ttrpc communication times out with `context deadline exceeded`. Currently, this error is not properly propagated, causing redundant API calls and slow container listing by client sides. Specifically, when executing the API to check the task state, it appears that the `context deadline exceeded` error via ttrpc is not being handled within `shimTask.State()` and `getProcessState()`. As a result, when this error occurs, clients such as nerdctl cannot recognize this error, and it is thought that the issue described below is occurring: - https://github.com/containerd/nerdctl/issues/4720 Therefore, this commit adds error handling to ensure timeouts are properly handled by client sides. Signed-off-by: Hayato Kiwata --- core/runtime/v2/shim.go | 3 +++ plugins/services/tasks/local.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/runtime/v2/shim.go b/core/runtime/v2/shim.go index f7855c2a14e99..1358462ec8cc7 100644 --- a/core/runtime/v2/shim.go +++ b/core/runtime/v2/shim.go @@ -835,6 +835,9 @@ func (s *shimTask) State(ctx context.Context) (runtime.State, error) { ID: s.ID(), }) if err != nil { + if errdefs.IsDeadlineExceeded(err) { + return runtime.State{}, err + } if !errors.Is(err, ttrpc.ErrClosed) { return runtime.State{}, errgrpc.ToNative(err) } diff --git a/plugins/services/tasks/local.go b/plugins/services/tasks/local.go index 30385e0bb481b..8d2fa42fcdc96 100644 --- a/plugins/services/tasks/local.go +++ b/plugins/services/tasks/local.go @@ -349,7 +349,7 @@ func getProcessState(ctx context.Context, p runtime.Process) (*task.Process, err state, err := p.State(ctx) if err != nil { - if errdefs.IsNotFound(err) || errdefs.IsUnavailable(err) { + if errdefs.IsNotFound(err) || errdefs.IsUnavailable(err) || errdefs.IsDeadlineExceeded(err) { return nil, err } log.G(ctx).WithError(err).Errorf("get state for %s", p.ID())