From df519e9e1aa9aeb4c0d2aeac2db785346f6f904d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Fri, 7 Mar 2025 18:15:17 +0100 Subject: [PATCH] daemon: Fix giving up too early while connecting to containerd socket MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Explicitly set the gRPC connection params to take the timeout into account to workaround the containerd v2 client not passing down the stack. containerd v2 replaced usages of deprecated gRPC functions but didn't pass the timeout to the actual dial connection options. Signed-off-by: Paweł Gronowski --- daemon/daemon.go | 14 +++++++++++--- libcontainerd/supervisor/remote_daemon.go | 7 ++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index 59dae5d932..ed7dde7099 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -901,13 +901,17 @@ func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.S return nil, err } + const connTimeout = 60 * time.Second + // Set the max backoff delay to match our containerd.WithTimeout(), // aligning with how containerd client's defaults sets this; // https://github.com/containerd/containerd/blob/v2.0.2/client/client.go#L129-L136 backoffConfig := backoff.DefaultConfig - backoffConfig.MaxDelay = 60 * time.Second + backoffConfig.MaxDelay = connTimeout connParams := grpc.ConnectParams{ Backoff: backoffConfig, + // TODO: Remove after https://github.com/containerd/containerd/pull/11508 + MinConnectTimeout: connTimeout, } gopts := []grpc.DialOption{ // ------------------------------------------------------------------ @@ -931,11 +935,15 @@ func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.S } if cfgStore.ContainerdAddr != "" { + log.G(ctx).WithFields(log.Fields{ + "address": cfgStore.ContainerdAddr, + "timeout": connTimeout, + }).Info("Creating a containerd client") d.containerdClient, err = containerd.New( cfgStore.ContainerdAddr, containerd.WithDefaultNamespace(cfgStore.ContainerdNamespace), containerd.WithDialOpts(gopts), - containerd.WithTimeout(60*time.Second), + containerd.WithTimeout(connTimeout), ) if err != nil { return nil, errors.Wrapf(err, "failed to dial %q", cfgStore.ContainerdAddr) @@ -950,7 +958,7 @@ func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.S cfgStore.ContainerdAddr, containerd.WithDefaultNamespace(cfgStore.ContainerdPluginNamespace), containerd.WithDialOpts(gopts), - containerd.WithTimeout(60*time.Second), + containerd.WithTimeout(connTimeout), ) if err != nil { return nil, errors.Wrapf(err, "failed to dial %q", cfgStore.ContainerdAddr) diff --git a/libcontainerd/supervisor/remote_daemon.go b/libcontainerd/supervisor/remote_daemon.go index b0ad0b940e..800c9d9540 100644 --- a/libcontainerd/supervisor/remote_daemon.go +++ b/libcontainerd/supervisor/remote_daemon.go @@ -280,14 +280,19 @@ func (r *remote) monitorDaemon(ctx context.Context) { continue } + const connTimeout = 60 * time.Second client, err = containerd.New( r.GRPC.Address, - containerd.WithTimeout(60*time.Second), + containerd.WithTimeout(connTimeout), containerd.WithDialOpts([]grpc.DialOption{ grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(dialer.ContextDialer), grpc.WithUnaryInterceptor(grpcerrors.UnaryClientInterceptor), grpc.WithStreamInterceptor(grpcerrors.StreamClientInterceptor), + grpc.WithConnectParams(grpc.ConnectParams{ + // TODO: Remove after https://github.com/containerd/containerd/pull/11508 + MinConnectTimeout: connTimeout, + }), }), ) if err != nil {