prune partial downloads (#4272)

This commit is contained in:
Jeffrey Morgan 2024-05-09 16:35:20 -07:00 committed by GitHub
parent 0e1ba65855
commit 302d7fdbf3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 17 deletions

View file

@ -565,7 +565,7 @@ func CreateModel(ctx context.Context, name, modelFileDir, quantization string, m
} }
if !envconfig.NoPrune { if !envconfig.NoPrune {
if err := deleteUnusedLayers(nil, unref, false); err != nil { if err := deleteUnusedLayers(nil, unref); err != nil {
return err return err
} }
} }
@ -613,7 +613,7 @@ func CopyModel(src, dst model.Name) error {
return err return err
} }
func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]struct{}, dryRun bool) error { func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]struct{}) error {
fp, err := GetManifestPath() fp, err := GetManifestPath()
if err != nil { if err != nil {
return err return err
@ -660,14 +660,10 @@ func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]struct{},
slog.Info(fmt.Sprintf("couldn't get file path for '%s': %v", k, err)) slog.Info(fmt.Sprintf("couldn't get file path for '%s': %v", k, err))
continue continue
} }
if !dryRun {
if err := os.Remove(fp); err != nil { if err := os.Remove(fp); err != nil {
slog.Info(fmt.Sprintf("couldn't remove file '%s': %v", fp, err)) slog.Info(fmt.Sprintf("couldn't remove file '%s': %v", fp, err))
continue continue
} }
} else {
slog.Info(fmt.Sprintf("wanted to remove: %s", fp))
}
} }
return nil return nil
@ -689,14 +685,25 @@ func PruneLayers() error {
for _, blob := range blobs { for _, blob := range blobs {
name := blob.Name() name := blob.Name()
name = strings.ReplaceAll(name, "-", ":") name = strings.ReplaceAll(name, "-", ":")
if strings.HasPrefix(name, "sha256:") {
deleteMap[name] = struct{}{} _, err := GetBlobsPath(name)
if err != nil {
if errors.Is(err, ErrInvalidDigestFormat) {
// remove invalid blobs (e.g. partial downloads)
if err := os.Remove(filepath.Join(p, blob.Name())); err != nil {
slog.Error("couldn't remove blob", "blob", blob.Name(), "error", err)
} }
} }
continue
}
deleteMap[name] = struct{}{}
}
slog.Info(fmt.Sprintf("total blobs: %d", len(deleteMap))) slog.Info(fmt.Sprintf("total blobs: %d", len(deleteMap)))
err = deleteUnusedLayers(nil, deleteMap, false) err = deleteUnusedLayers(nil, deleteMap)
if err != nil { if err != nil {
return err return err
} }
@ -752,7 +759,7 @@ func DeleteModel(name string) error {
} }
deleteMap[manifest.Config.Digest] = struct{}{} deleteMap[manifest.Config.Digest] = struct{}{}
err = deleteUnusedLayers(&mp, deleteMap, false) err = deleteUnusedLayers(&mp, deleteMap)
if err != nil { if err != nil {
return err return err
} }
@ -912,7 +919,7 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
if noprune == "" { if noprune == "" {
fn(api.ProgressResponse{Status: "removing any unused layers"}) fn(api.ProgressResponse{Status: "removing any unused layers"})
err = deleteUnusedLayers(nil, deleteMap, false) err = deleteUnusedLayers(nil, deleteMap)
if err != nil { if err != nil {
return err return err
} }

View file

@ -154,9 +154,6 @@ func GetBlobsPath(digest string) (string, error) {
// only accept actual sha256 digests // only accept actual sha256 digests
pattern := "^sha256[:-][0-9a-fA-F]{64}$" pattern := "^sha256[:-][0-9a-fA-F]{64}$"
re := regexp.MustCompile(pattern) re := regexp.MustCompile(pattern)
if err != nil {
return "", err
}
if digest != "" && !re.MatchString(digest) { if digest != "" && !re.MatchString(digest) {
return "", ErrInvalidDigestFormat return "", ErrInvalidDigestFormat