From b27268aaefa03f401f0f09c1e21b63872288ddc7 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Mon, 10 Jun 2024 11:31:34 -0700 Subject: [PATCH 1/2] add test --- server/routes_delete_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/server/routes_delete_test.go b/server/routes_delete_test.go index d0990009..0f003574 100644 --- a/server/routes_delete_test.go +++ b/server/routes_delete_test.go @@ -1,12 +1,15 @@ package server import ( + "bytes" + "encoding/json" "fmt" "net/http" "path/filepath" "testing" "github.com/ollama/ollama/api" + "github.com/ollama/ollama/types/model" ) func TestDelete(t *testing.T) { @@ -69,3 +72,33 @@ func TestDelete(t *testing.T) { checkFileExists(t, filepath.Join(p, "manifests", "*", "*", "*", "*"), []string{}) checkFileExists(t, filepath.Join(p, "blobs", "*"), []string{}) } + +func TestDeleteDuplicateLayers(t *testing.T) { + p := t.TempDir() + t.Setenv("OLLAMA_MODELS", p) + var s Server + + n := model.ParseName("test") + + var b bytes.Buffer + if err := json.NewEncoder(&b).Encode(&ConfigV2{}); err != nil { + t.Fatal(err) + } + + config, err := NewLayer(&b, "application/vnd.docker.container.image.v1+json") + if err != nil { + t.Fatal(err) + } + + // create a manifest with duplicate layers + if err := WriteManifest(n, config, []*Layer{config}); err != nil { + t.Fatal(err) + } + + w := createRequest(t, s.DeleteModelHandler, api.DeleteRequest{Name: "test"}) + if w.Code != http.StatusOK { + t.Errorf("expected status code 200, actual %d", w.Code) + } + + checkFileExists(t, filepath.Join(p, "manifests", "*", "*", "*", "*"), []string{}) +} From 515f497e6d5c0a102f913693fc8d4ed5eefd4ebb Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Mon, 10 Jun 2024 11:15:03 -0700 Subject: [PATCH 2/2] fix: skip removing layers that no longer exist --- server/manifest.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/manifest.go b/server/manifest.go index d0675724..61dd1ab4 100644 --- a/server/manifest.go +++ b/server/manifest.go @@ -3,6 +3,7 @@ package server import ( "crypto/sha256" "encoding/json" + "errors" "fmt" "io" "log/slog" @@ -43,7 +44,9 @@ func (m *Manifest) Remove() error { func (m *Manifest) RemoveLayers() error { for _, layer := range append(m.Layers, m.Config) { - if err := layer.Remove(); err != nil { + if err := layer.Remove(); errors.Is(err, os.ErrNotExist) { + slog.Debug("layer does not exist", "digest", layer.Digest) + } else if err != nil { return err } }