Skip to content

Commit f3fbdfe

Browse files
committed
fix: add non-retryable local errors and thread retryCtx in pull
Signed-off-by: Zhao Chen <winters.zc@antgroup.com>
1 parent eb1fc1e commit f3fbdfe

3 files changed

Lines changed: 32 additions & 5 deletions

File tree

pkg/backend/pull.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ func (b *backend) Pull(ctx context.Context, target string, cfg *config.Pull) err
9898
var mu sync.Mutex
9999
var errs []error
100100

101-
var fn func(desc ocispec.Descriptor) error
101+
var fn func(ctx context.Context, desc ocispec.Descriptor) error
102102
if cfg.ExtractFromRemote {
103-
fn = func(desc ocispec.Descriptor) error {
103+
fn = func(ctx context.Context, desc ocispec.Descriptor) error {
104104
return pullAndExtractFromRemote(ctx, pb, internalpb.NormalizePrompt("Pulling blob"), src, cfg.ExtractDir, desc)
105105
}
106106
} else {
107-
fn = func(desc ocispec.Descriptor) error {
107+
fn = func(ctx context.Context, desc ocispec.Descriptor) error {
108108
return pullIfNotExist(ctx, pb, internalpb.NormalizePrompt("Pulling blob"), src, dst, desc, repo, tag)
109109
}
110110
}
@@ -122,7 +122,7 @@ func (b *backend) Pull(ctx context.Context, target string, cfg *config.Pull) err
122122
logrus.Debugf("pull: processing layer %s", layer.Digest)
123123
// call the before hook.
124124
cfg.Hooks.BeforePullLayer(layer, manifest)
125-
err := fn(layer)
125+
err := fn(retryCtx, layer)
126126
// call the after hook.
127127
cfg.Hooks.AfterPullLayer(layer, err)
128128
if err != nil {

pkg/retrypolicy/retrypolicy.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,19 @@ func IsRetryable(err error) bool {
219219
return true
220220
}
221221

222-
// Unknown errors default to retryable.
222+
// Local / permanent errors are not retryable.
223+
if strings.Contains(errMsg, "permission denied") ||
224+
strings.Contains(errMsg, "no space left on device") ||
225+
strings.Contains(errMsg, "file exists") ||
226+
strings.Contains(errMsg, "not a directory") ||
227+
strings.Contains(errMsg, "is a directory") ||
228+
strings.Contains(errMsg, "no such file or directory") ||
229+
strings.Contains(errMsg, "invalid argument") {
230+
return false
231+
}
232+
233+
// Unknown errors default to retryable with a warning.
234+
log.WithField("error", errMsg).Warn("[RETRY] unknown error treated as retryable")
223235
return true
224236
}
225237

pkg/retrypolicy/retrypolicy_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,21 @@ func TestIsRetryable(t *testing.T) {
206206
err: fmt.Errorf("unexpected EOF"),
207207
want: true,
208208
},
209+
{
210+
name: "permission denied - not retryable",
211+
err: fmt.Errorf("open /data/model.bin: permission denied"),
212+
want: false,
213+
},
214+
{
215+
name: "no space left on device - not retryable",
216+
err: fmt.Errorf("write /data/model.bin: no space left on device"),
217+
want: false,
218+
},
219+
{
220+
name: "no such file or directory - not retryable",
221+
err: fmt.Errorf("open /data/model.bin: no such file or directory"),
222+
want: false,
223+
},
209224
{
210225
name: "unknown error - defaults to retryable",
211226
err: errors.New("something totally unexpected happened"),

0 commit comments

Comments
 (0)