Skip to content

Commit af23be5

Browse files
lucarin91dido18
andauthored
feat: handle too many request in system init (#704)
Co-authored-by: Davide <davideneri18@gmail.com>
1 parent deeb062 commit af23be5

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

internal/orchestrator/system.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import (
44
"bufio"
55
"context"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"io"
910
"os"
1011
"slices"
1112
"strings"
13+
"time"
1214

1315
"github.com/compose-spec/compose-go/v2/loader"
1416
"github.com/compose-spec/compose-go/v2/types"
@@ -60,9 +62,32 @@ func SystemInit(ctx context.Context, cfg config.Configuration, staticStore *stor
6062
}
6163

6264
func pullImage(ctx context.Context, stdout io.Writer, docker dockerClient.APIClient, imageName string) error {
63-
out, err := docker.ImagePull(ctx, imageName, image.PullOptions{})
64-
if err != nil {
65-
return err
65+
delay := 1 * time.Second
66+
67+
var out io.ReadCloser
68+
var allErr error
69+
var lastErr error
70+
for range 4 { // 1s, 2s, 4s, 8s
71+
out, lastErr = docker.ImagePull(ctx, imageName, image.PullOptions{})
72+
if lastErr == nil {
73+
break // Success
74+
}
75+
if !strings.Contains(lastErr.Error(), "toomanyrequests") {
76+
return lastErr // Fail fast on non-rate-limit errors
77+
}
78+
allErr = errors.Join(allErr, lastErr)
79+
80+
feedback.Printf("Warning: received 'toomanyrequests' error from Docker registry, retrying in %s ...", delay)
81+
82+
select {
83+
case <-ctx.Done():
84+
return ctx.Err()
85+
case <-time.After(delay):
86+
}
87+
delay *= 2
88+
}
89+
if lastErr != nil {
90+
return fmt.Errorf("failed to pull image %s after multiple attempts: %w", imageName, allErr)
6691
}
6792
defer out.Close()
6893

0 commit comments

Comments
 (0)