Store a source the way a variant is stored, one row and one file per source URL (closes #308)
check / check (push) Canceled after 0s

A source is now one source_content row and one file named by its
SourceKey, the SHA-256 of its host, path and query, made as the variant
key is. A store writes the file, then upserts the row, and removes the
file when the row cannot be written; an eviction deletes the row, then
the file, with no lock. source_metadata, the JSON files under
cache/metadata/, MetadataStorage, the content lock, the eviction
transaction and its test hook are gone. Two source URLs serving the same
bytes store them twice. Reconciliation still drops a source row whose
file is missing, as TestReconciliationReadsAPageAtATime counts those
reads. The tests of the removed sharing, lock and hook go with them.

Model: opus-5-5
This commit is contained in:
2026-10-21 13:05:11 +00:00
parent 00d8ba26c5
commit d571045d01
22 changed files with 435 additions and 1597 deletions
@@ -316,10 +316,10 @@ func TestVariantStorage_StoreReplacesMetaFile(t *testing.T) {
}
}
// TestContentStorage_StoreHashedReplacesFileOfAnotherSize checks that a
// TestContentStorage_StoreReplacesFileOfAnotherSize checks that a
// store over a file of another size at the content's path, such as a
// partial file a crash left, replaces it with the content.
func TestContentStorage_StoreHashedReplacesFileOfAnotherSize(t *testing.T) {
func TestContentStorage_StoreReplacesFileOfAnotherSize(t *testing.T) {
t.Parallel()
storage, err := NewContentStorage(t.TempDir())
@@ -329,7 +329,7 @@ func TestContentStorage_StoreHashedReplacesFileOfAnotherSize(t *testing.T) {
content := []byte("the whole source image")
sum := sha256.Sum256(content)
hash := ContentHash(hex.EncodeToString(sum[:]))
hash := imagerequest.SourceKey(hex.EncodeToString(sum[:]))
path := storage.hashToPath(hash)
err = os.MkdirAll(filepath.Dir(path), StorageDirPerm)
@@ -342,9 +342,9 @@ func TestContentStorage_StoreHashedReplacesFileOfAnotherSize(t *testing.T) {
t.Fatalf("writing a partial file: %v", err)
}
_, err = storage.StoreHashed(hash, content)
_, err = storage.Store(hash, content)
if err != nil {
t.Fatalf("StoreHashed() error = %v", err)
t.Fatalf("Store() error = %v", err)
}
stored, err := storage.Load(hash)