Skip to content

Commit a793b58

Browse files
committed
add backoff
1 parent fff4d10 commit a793b58

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.21.1
44

55
require (
66
github.com/aws/aws-sdk-go v1.53.19
7+
github.com/cenkalti/backoff/v4 v4.3.0
78
github.com/google/go-containerregistry v0.19.1
89
github.com/prometheus/client_golang v1.19.1
910
github.com/rs/zerolog v1.33.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ github.com/aws/aws-sdk-go v1.53.19 h1:WEuWc918RXlIaPCyU11F7hH9H1ItK+8m2c/uoQNRUo
33
github.com/aws/aws-sdk-go v1.53.19/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
44
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
55
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
6+
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
7+
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
68
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
79
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
810
github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k=

internal/sync/images.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package sync
33
import (
44
"context"
55
"fmt"
6+
"strings"
67
"time"
78

89
"github.com/Altinity/docker-sync/config"
910
"github.com/Altinity/docker-sync/internal/telemetry"
1011
"github.com/Altinity/docker-sync/structs"
12+
"github.com/cenkalti/backoff/v4"
1113
"github.com/rs/zerolog/log"
1214
"go.opentelemetry.io/otel/attribute"
1315
"go.opentelemetry.io/otel/metric"
@@ -38,8 +40,23 @@ func SyncImage(ctx context.Context, image *structs.Image) error {
3840
}
3941
}
4042

41-
if serr := SyncTag(image, tag, pullAuthName, pullAuth); serr != nil {
42-
errs := multierr.Errors(serr)
43+
if err := backoff.Retry(func() error {
44+
if err := SyncTag(image, tag, pullAuthName, pullAuth); err != nil {
45+
if strings.Contains(err.Error(), "HAP429") {
46+
log.Warn().
47+
Str("source", image.Source).
48+
Msg("Rate limited by registry, backing off")
49+
return err
50+
}
51+
52+
return backoff.Permanent(err)
53+
}
54+
55+
return nil
56+
}, backoff.NewExponentialBackOff(
57+
backoff.WithInitialInterval(1*time.Minute),
58+
)); err != nil {
59+
errs := multierr.Errors(err)
4360
if len(errs) > 0 {
4461
telemetry.Errors.Add(ctx, int64(len(errs)),
4562
metric.WithAttributes(
@@ -56,10 +73,10 @@ func SyncImage(ctx context.Context, image *structs.Image) error {
5673
log.Error().
5774
Errs("errors", errs).
5875
Msg("Failed to sync tag")
59-
}
6076

61-
merr = multierr.Append(merr, serr)
62-
continue
77+
merr = multierr.Append(merr, err)
78+
continue
79+
}
6380
}
6481
lastSyncMap[k] = time.Now()
6582
}

0 commit comments

Comments
 (0)