Pārlūkot izejas kodu

manifest: Don't prune layers if we can't open a manifest file

If there is an error when opening a manifest file (corrupted, permission denied, etc.)
then the referenced layers will not be included in the list of active
layers. This causes them to be deleted when pruning happens at startup
or a model is pulled.

In such a situation, we should prefer to preserve data in the hopes that
it can be recovered rather than being agressive about deletion.
Jesse Gross 9 mēneši atpakaļ
vecāks
revīzija
685a53534b
1 mainītis faili ar 5 papildinājumiem un 4 dzēšanām
  1. 5 4
      server/images.go

+ 5 - 4
server/images.go

@@ -714,8 +714,7 @@ func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]struct{})
 		// save (i.e. delete from the deleteMap) any files used in other manifests
 		// save (i.e. delete from the deleteMap) any files used in other manifests
 		manifest, _, err := GetManifest(fmp)
 		manifest, _, err := GetManifest(fmp)
 		if err != nil {
 		if err != nil {
-			//nolint:nilerr
-			return nil
+			return err
 		}
 		}
 
 
 		for _, layer := range manifest.Layers {
 		for _, layer := range manifest.Layers {
@@ -782,7 +781,8 @@ func PruneLayers() error {
 
 
 	err = deleteUnusedLayers(nil, deleteMap)
 	err = deleteUnusedLayers(nil, deleteMap)
 	if err != nil {
 	if err != nil {
-		return err
+		slog.Info(fmt.Sprintf("couldn't remove unused layers: %v", err))
+		return nil
 	}
 	}
 
 
 	slog.Info(fmt.Sprintf("total unused blobs removed: %d", len(deleteMap)))
 	slog.Info(fmt.Sprintf("total unused blobs removed: %d", len(deleteMap)))
@@ -971,7 +971,8 @@ func PullModel(ctx context.Context, name string, regOpts *registryOptions, fn fu
 		fn(api.ProgressResponse{Status: "removing any unused layers"})
 		fn(api.ProgressResponse{Status: "removing any unused layers"})
 		err = deleteUnusedLayers(nil, deleteMap)
 		err = deleteUnusedLayers(nil, deleteMap)
 		if err != nil {
 		if err != nil {
-			return err
+			slog.Info(fmt.Sprintf("couldn't remove unused layers: %v", err))
+			fn(api.ProgressResponse{Status: fmt.Sprintf("couldn't remove unused layers: %v", err)})
 		}
 		}
 	}
 	}