From bd28a1e58f1854b673abc11ec8483da277891dd4 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 2 Sep 2026 18:57:25 +0200 Subject: [PATCH] docker-container: give readiness wait a full startup timeout A recently started builder should use its StartedAt timestamp to decide whether BuildKit may still be coming up, but not as the absolute deadline for the client readiness wait. When the first client request arrived near the end of that startup window, the wait could inherit only a few milliseconds and fail with DeadlineExceeded even though the builder was still legitimately starting. Give those recent containers a fresh bounded wait from the current time while continuing to skip the wait for established builders. Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- driver/docker-container/driver.go | 5 ++--- driver/docker-container/driver_test.go | 14 +++++++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/driver/docker-container/driver.go b/driver/docker-container/driver.go index b9f95c8a9103..1276f76f4fda 100644 --- a/driver/docker-container/driver.go +++ b/driver/docker-container/driver.go @@ -573,11 +573,10 @@ func clientWaitDeadline(state *container.State, now time.Time) (time.Time, error if err != nil { return time.Time{}, nil } - deadline := startedAt.Add(buildkitdStartupTimeout) - if !now.Before(deadline) { + if !now.Before(startedAt.Add(buildkitdStartupTimeout)) { return time.Time{}, nil } - return deadline, nil + return now.Add(buildkitdStartupTimeout), nil } func (d *Driver) Factory() driver.Factory { diff --git a/driver/docker-container/driver_test.go b/driver/docker-container/driver_test.go index 9a47579c426a..77ab5e16076a 100644 --- a/driver/docker-container/driver_test.go +++ b/driver/docker-container/driver_test.go @@ -28,13 +28,21 @@ func TestClientWaitDeadline(t *testing.T) { }) t.Run("recent-start-builder-waits", func(t *testing.T) { - startedAt := now.Add(-time.Second) deadline, err := clientWaitDeadline(&container.State{ Running: true, - StartedAt: startedAt.Format(time.RFC3339Nano), + StartedAt: now.Add(-time.Second).Format(time.RFC3339Nano), }, now) require.NoError(t, err) - require.True(t, deadline.Equal(startedAt.Add(buildkitdStartupTimeout))) + require.True(t, deadline.Equal(now.Add(buildkitdStartupTimeout))) + }) + + t.Run("nearly-expired-startup-window-gets-full-wait", func(t *testing.T) { + deadline, err := clientWaitDeadline(&container.State{ + Running: true, + StartedAt: now.Add(-buildkitdStartupTimeout + time.Nanosecond).Format(time.RFC3339Nano), + }, now) + require.NoError(t, err) + require.True(t, deadline.Equal(now.Add(buildkitdStartupTimeout))) }) t.Run("invalid-start-time-skips-wait", func(t *testing.T) {