prune partial downloads (#4272)
This commit is contained in:
parent
0e1ba65855
commit
302d7fdbf3
2 changed files with 21 additions and 17 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue