diff --git a/internal/agent/weights/fetch.go b/internal/agent/weights/fetch.go index 2c39b0e..7246ce7 100644 --- a/internal/agent/weights/fetch.go +++ b/internal/agent/weights/fetch.go @@ -230,9 +230,17 @@ func (f *Fetcher) fetchChecked(ctx context.Context, source, target, want string) // the checksum kept beside it, or worked out once and then kept. One that // is not is deleted, to be fetched again. Any file is, when want is empty. func (f *Fetcher) cachedIs(target, want string) (bool, error) { - if want == "" || readChecksum(target) == want { + kept := readChecksum(target) + if want == "" || kept == want { return true, nil } + if kept != "" { + // Checked when it was fetched, as another file: the same address + // gives the same bytes again, and another model may be serving + // these. Refused, and left. + return false, fmt.Errorf("the copy of this file here has sha256 %s, as fetched, and the catalog names %s: refused", + kept, want) + } sum, err := fileSHA256(target) if err != nil { return false, err diff --git a/internal/agent/weights/fetch_test.go b/internal/agent/weights/fetch_test.go index e69837a..ffdbd37 100644 --- a/internal/agent/weights/fetch_test.go +++ b/internal/agent/weights/fetch_test.go @@ -339,3 +339,25 @@ func TestAFileThatIsNotWhatTheRegistryPublishedIsRefused(t *testing.T) { t.Error(err) } } + +// A cached file checked when it was fetched, that another model names with +// another checksum, is refused and left for the model it is. +func TestACheckedFileAnotherChecksumNamesIsRefusedAndLeft(t *testing.T) { + body := "the weights" + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte(body)) })) + defer srv.Close() + sum := sha256.Sum256([]byte(body)) + f := &Fetcher{CacheDir: t.TempDir()} + src := srv.URL + "/m.gguf" + path, err := f.EnsureChecked(t.Context(), src, false, hex.EncodeToString(sum[:])) + if err != nil { + t.Fatal(err) + } + wrong := strings.Repeat("0", 64) + if _, err := f.EnsureChecked(t.Context(), src, false, wrong); err == nil || !strings.Contains(err.Error(), wrong) { + t.Fatalf("not refused: %v", err) + } + if b, err := os.ReadFile(path); err != nil || string(b) != body { + t.Errorf("the checked file was not left: %v", err) + } +}