Skip to content

Commit 15086cf

Browse files
feat: remove AutoRemoveReferrers flag
Signed-off-by: Xiaoxuan Wang <[email protected]>
1 parent d8783fe commit 15086cf

File tree

2 files changed

+13
-331
lines changed

2 files changed

+13
-331
lines changed

content/oci/oci.go

+12-19
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,13 @@ type Store struct {
5555
// - Default value: true.
5656
AutoSaveIndex bool
5757

58-
// AutoGC controls if the OCI store will automatically clean newly produced
59-
// dangling (unreferenced) blobs during Delete() operation. For example the
60-
// blobs whose manifests have been deleted. Manifests in index.json will not
61-
// be deleted.
58+
// AutoGC controls if the OCI store will automatically clean dangling
59+
// (unreferenced) blobs created by the Delete() operation. This includes the
60+
// unreferenced sucessor blobs and referrers. Tagged manifests will not be
61+
// deleted.
6262
// - Default value: true.
6363
AutoGC bool
6464

65-
// AutoDeleteReferrers controls if the OCI store will automatically delete its
66-
// referrers when a manifest is deleted. When set to true, the referrers will
67-
// be deleted even if they exist in index.json.
68-
// - Default value: true.
69-
AutoDeleteReferrers bool
70-
7165
root string
7266
indexPath string
7367
index *ocispec.Index
@@ -100,14 +94,13 @@ func NewWithContext(ctx context.Context, root string) (*Store, error) {
10094
}
10195

10296
store := &Store{
103-
AutoSaveIndex: true,
104-
AutoGC: true,
105-
AutoDeleteReferrers: true,
106-
root: rootAbs,
107-
indexPath: filepath.Join(rootAbs, ocispec.ImageIndexFile),
108-
storage: storage,
109-
tagResolver: resolver.NewMemory(),
110-
graph: graph.NewMemory(),
97+
AutoSaveIndex: true,
98+
AutoGC: true,
99+
root: rootAbs,
100+
indexPath: filepath.Join(rootAbs, ocispec.ImageIndexFile),
101+
storage: storage,
102+
tagResolver: resolver.NewMemory(),
103+
graph: graph.NewMemory(),
111104
}
112105

113106
if err := ensureDir(filepath.Join(rootAbs, ocispec.ImageBlobsDir)); err != nil {
@@ -175,7 +168,7 @@ func (s *Store) Delete(ctx context.Context, target ocispec.Descriptor) error {
175168
deleteQueue = deleteQueue[1:]
176169

177170
// get referrers if applicable
178-
if s.AutoDeleteReferrers && descriptor.IsManifest(head) {
171+
if s.AutoGC && descriptor.IsManifest(head) {
179172
referrers, err := registry.Referrers(ctx, &unsafeStore{s}, head, "")
180173
if err != nil {
181174
return err

content/oci/oci_test.go

+1-312
Original file line numberDiff line numberDiff line change
@@ -2263,7 +2263,7 @@ func TestStore_PredecessorsAndDelete(t *testing.T) {
22632263
}
22642264
}
22652265

2266-
func TestStore_DeleteWithAutoGCAndAutoRemoveReferrers(t *testing.T) {
2266+
func TestStore_DeleteWithAutoGC(t *testing.T) {
22672267
tempDir := t.TempDir()
22682268
s, err := New(tempDir)
22692269
if err != nil {
@@ -2417,317 +2417,6 @@ func TestStore_DeleteWithAutoGCAndAutoRemoveReferrers(t *testing.T) {
24172417
}
24182418
}
24192419

2420-
func TestStore_DeleteDisableAutoRemoveReferrers(t *testing.T) {
2421-
tempDir := t.TempDir()
2422-
s, err := New(tempDir)
2423-
if err != nil {
2424-
t.Fatal("New() error =", err)
2425-
}
2426-
s.AutoDeleteReferrers = false
2427-
ctx := context.Background()
2428-
2429-
// generate test content
2430-
var blobs [][]byte
2431-
var descs []ocispec.Descriptor
2432-
appendBlob := func(mediaType string, blob []byte) {
2433-
blobs = append(blobs, blob)
2434-
descs = append(descs, ocispec.Descriptor{
2435-
MediaType: mediaType,
2436-
Digest: digest.FromBytes(blob),
2437-
Size: int64(len(blob)),
2438-
})
2439-
}
2440-
generateManifest := func(config ocispec.Descriptor, subject *ocispec.Descriptor, layers ...ocispec.Descriptor) {
2441-
manifest := ocispec.Manifest{
2442-
Config: config,
2443-
Subject: subject,
2444-
Layers: layers,
2445-
}
2446-
manifestJSON, err := json.Marshal(manifest)
2447-
if err != nil {
2448-
t.Fatal(err)
2449-
}
2450-
appendBlob(ocispec.MediaTypeImageManifest, manifestJSON)
2451-
}
2452-
generateIndex := func(manifests ...ocispec.Descriptor) {
2453-
index := ocispec.Index{
2454-
Manifests: manifests,
2455-
}
2456-
indexJSON, err := json.Marshal(index)
2457-
if err != nil {
2458-
t.Fatal(err)
2459-
}
2460-
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
2461-
}
2462-
2463-
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0
2464-
appendBlob(ocispec.MediaTypeImageLayer, []byte("foo")) // Blob 1
2465-
appendBlob(ocispec.MediaTypeImageLayer, []byte("bar")) // Blob 2
2466-
appendBlob(ocispec.MediaTypeImageLayer, []byte("hello")) // Blob 3
2467-
generateManifest(descs[0], nil, descs[1]) // Blob 4
2468-
generateManifest(descs[0], nil, descs[2]) // Blob 5
2469-
generateManifest(descs[0], nil, descs[3]) // Blob 6
2470-
generateIndex(descs[4:6]...) // Blob 7
2471-
generateIndex(descs[6]) // Blob 8
2472-
appendBlob(ocispec.MediaTypeImageLayer, []byte("world")) // Blob 9
2473-
generateManifest(descs[0], &descs[6], descs[9]) // Blob 10
2474-
generateManifest(descs[0], &descs[10], descs[2]) // Blob 11
2475-
2476-
eg, egCtx := errgroup.WithContext(ctx)
2477-
for i := range blobs {
2478-
eg.Go(func(i int) func() error {
2479-
return func() error {
2480-
err := s.Push(egCtx, descs[i], bytes.NewReader(blobs[i]))
2481-
if err != nil {
2482-
return fmt.Errorf("failed to push test content to src: %d: %v", i, err)
2483-
}
2484-
return nil
2485-
}
2486-
}(i))
2487-
}
2488-
if err := eg.Wait(); err != nil {
2489-
t.Fatal(err)
2490-
}
2491-
2492-
// delete blob 4 and verify the result
2493-
if err := s.Delete(egCtx, descs[4]); err != nil {
2494-
t.Fatal(err)
2495-
}
2496-
2497-
// blob 1 and 4 are now deleted, and other blobs are still present
2498-
notPresent := []ocispec.Descriptor{descs[1], descs[4]}
2499-
for _, node := range notPresent {
2500-
if exists, _ := s.Exists(egCtx, node); exists {
2501-
t.Errorf("%v should not exist in store", node)
2502-
}
2503-
}
2504-
stillPresent := []ocispec.Descriptor{descs[0], descs[2], descs[3], descs[5], descs[6], descs[7], descs[8], descs[9], descs[10], descs[11]}
2505-
for _, node := range stillPresent {
2506-
if exists, _ := s.Exists(egCtx, node); !exists {
2507-
t.Errorf("%v should exist in store", node)
2508-
}
2509-
}
2510-
2511-
// delete blob 8 and verify the result
2512-
if err := s.Delete(egCtx, descs[8]); err != nil {
2513-
t.Fatal(err)
2514-
}
2515-
2516-
// blob 1, 4 and 8 are now deleted, and other blobs are still present
2517-
notPresent = []ocispec.Descriptor{descs[1], descs[4], descs[8]}
2518-
for _, node := range notPresent {
2519-
if exists, _ := s.Exists(egCtx, node); exists {
2520-
t.Errorf("%v should not exist in store", node)
2521-
}
2522-
}
2523-
stillPresent = []ocispec.Descriptor{descs[0], descs[2], descs[3], descs[5], descs[6], descs[7], descs[9], descs[10], descs[11]}
2524-
for _, node := range stillPresent {
2525-
if exists, _ := s.Exists(egCtx, node); !exists {
2526-
t.Errorf("%v should exist in store", node)
2527-
}
2528-
}
2529-
2530-
// delete blob 6 and verify the result
2531-
if err := s.Delete(egCtx, descs[6]); err != nil {
2532-
t.Fatal(err)
2533-
}
2534-
2535-
// blob 1, 3, 4, 6, 8 are now deleted, and other blobs are still present
2536-
notPresent = []ocispec.Descriptor{descs[1], descs[3], descs[4], descs[6], descs[8]}
2537-
for _, node := range notPresent {
2538-
if exists, _ := s.Exists(egCtx, node); exists {
2539-
t.Errorf("%v should not exist in store", node)
2540-
}
2541-
}
2542-
stillPresent = []ocispec.Descriptor{descs[0], descs[2], descs[5], descs[7], descs[9], descs[10], descs[11]}
2543-
for _, node := range stillPresent {
2544-
if exists, _ := s.Exists(egCtx, node); !exists {
2545-
t.Errorf("%v should exist in store", node)
2546-
}
2547-
}
2548-
2549-
// verify predecessors information
2550-
wants := [][]ocispec.Descriptor{
2551-
{descs[5], descs[10], descs[11]}, // Blob 0
2552-
nil, // Blob 1
2553-
{descs[5], descs[11]}, // Blob 2
2554-
nil, // Blob 3
2555-
{descs[7]}, // Blob 4's predecessor is descs[7], even though blob 4 no longer exist
2556-
{descs[7]}, // Blob 5
2557-
{descs[10]}, // Blob 6's predecessor is descs[10], even though blob 6 no longer exist
2558-
nil, // Blob 7
2559-
nil, // Blob 8
2560-
{descs[10]}, // Blob 9
2561-
{descs[11]}, // Blob 10
2562-
nil, // Blob 11
2563-
}
2564-
for i, want := range wants {
2565-
predecessors, err := s.Predecessors(ctx, descs[i])
2566-
if err != nil {
2567-
t.Errorf("Store.Predecessors(%d) error = %v", i, err)
2568-
}
2569-
if !equalDescriptorSet(predecessors, want) {
2570-
t.Errorf("Store.Predecessors(%d) = %v, want %v", i, predecessors, want)
2571-
}
2572-
}
2573-
}
2574-
2575-
func TestStore_DeleteDisableAutoGCAndAutoRemoveReferrers(t *testing.T) {
2576-
tempDir := t.TempDir()
2577-
s, err := New(tempDir)
2578-
if err != nil {
2579-
t.Fatal("New() error =", err)
2580-
}
2581-
s.AutoDeleteReferrers = false
2582-
s.AutoGC = false
2583-
ctx := context.Background()
2584-
2585-
// generate test content
2586-
var blobs [][]byte
2587-
var descs []ocispec.Descriptor
2588-
appendBlob := func(mediaType string, blob []byte) {
2589-
blobs = append(blobs, blob)
2590-
descs = append(descs, ocispec.Descriptor{
2591-
MediaType: mediaType,
2592-
Digest: digest.FromBytes(blob),
2593-
Size: int64(len(blob)),
2594-
})
2595-
}
2596-
generateManifest := func(config ocispec.Descriptor, subject *ocispec.Descriptor, layers ...ocispec.Descriptor) {
2597-
manifest := ocispec.Manifest{
2598-
Config: config,
2599-
Subject: subject,
2600-
Layers: layers,
2601-
}
2602-
manifestJSON, err := json.Marshal(manifest)
2603-
if err != nil {
2604-
t.Fatal(err)
2605-
}
2606-
appendBlob(ocispec.MediaTypeImageManifest, manifestJSON)
2607-
}
2608-
generateIndex := func(manifests ...ocispec.Descriptor) {
2609-
index := ocispec.Index{
2610-
Manifests: manifests,
2611-
}
2612-
indexJSON, err := json.Marshal(index)
2613-
if err != nil {
2614-
t.Fatal(err)
2615-
}
2616-
appendBlob(ocispec.MediaTypeImageIndex, indexJSON)
2617-
}
2618-
2619-
appendBlob(ocispec.MediaTypeImageConfig, []byte("config")) // Blob 0
2620-
appendBlob(ocispec.MediaTypeImageLayer, []byte("foo")) // Blob 1
2621-
appendBlob(ocispec.MediaTypeImageLayer, []byte("bar")) // Blob 2
2622-
appendBlob(ocispec.MediaTypeImageLayer, []byte("hello")) // Blob 3
2623-
generateManifest(descs[0], nil, descs[1]) // Blob 4
2624-
generateManifest(descs[0], nil, descs[2]) // Blob 5
2625-
generateManifest(descs[0], nil, descs[3]) // Blob 6
2626-
generateIndex(descs[4:6]...) // Blob 7
2627-
generateIndex(descs[6]) // Blob 8
2628-
appendBlob(ocispec.MediaTypeImageLayer, []byte("world")) // Blob 9
2629-
generateManifest(descs[0], &descs[6], descs[9]) // Blob 10
2630-
generateManifest(descs[0], &descs[10], descs[2]) // Blob 11
2631-
2632-
eg, egCtx := errgroup.WithContext(ctx)
2633-
for i := range blobs {
2634-
eg.Go(func(i int) func() error {
2635-
return func() error {
2636-
err := s.Push(egCtx, descs[i], bytes.NewReader(blobs[i]))
2637-
if err != nil {
2638-
return fmt.Errorf("failed to push test content to src: %d: %v", i, err)
2639-
}
2640-
return nil
2641-
}
2642-
}(i))
2643-
}
2644-
if err := eg.Wait(); err != nil {
2645-
t.Fatal(err)
2646-
}
2647-
2648-
// delete blob 4 and verify the result
2649-
if err := s.Delete(egCtx, descs[4]); err != nil {
2650-
t.Fatal(err)
2651-
}
2652-
2653-
// blob 4 is now deleted, and other blobs are still present
2654-
notPresent := []ocispec.Descriptor{descs[4]}
2655-
for _, node := range notPresent {
2656-
if exists, _ := s.Exists(egCtx, node); exists {
2657-
t.Errorf("%v should not exist in store", node)
2658-
}
2659-
}
2660-
stillPresent := []ocispec.Descriptor{descs[0], descs[1], descs[2], descs[3], descs[5], descs[6], descs[7], descs[8], descs[9], descs[10], descs[11]}
2661-
for _, node := range stillPresent {
2662-
if exists, _ := s.Exists(egCtx, node); !exists {
2663-
t.Errorf("%v should exist in store", node)
2664-
}
2665-
}
2666-
2667-
// delete blob 8 and verify the result
2668-
if err := s.Delete(egCtx, descs[8]); err != nil {
2669-
t.Fatal(err)
2670-
}
2671-
2672-
// blob 4 and 8 are now deleted, and other blobs are still present
2673-
notPresent = []ocispec.Descriptor{descs[4], descs[8]}
2674-
for _, node := range notPresent {
2675-
if exists, _ := s.Exists(egCtx, node); exists {
2676-
t.Errorf("%v should not exist in store", node)
2677-
}
2678-
}
2679-
stillPresent = []ocispec.Descriptor{descs[0], descs[1], descs[2], descs[3], descs[5], descs[6], descs[7], descs[9], descs[10], descs[11]}
2680-
for _, node := range stillPresent {
2681-
if exists, _ := s.Exists(egCtx, node); !exists {
2682-
t.Errorf("%v should exist in store", node)
2683-
}
2684-
}
2685-
2686-
// delete blob 6 and verify the result
2687-
if err := s.Delete(egCtx, descs[6]); err != nil {
2688-
t.Fatal(err)
2689-
}
2690-
2691-
// blob 4, 6, 8 are now deleted, and other blobs are still present
2692-
notPresent = []ocispec.Descriptor{descs[4], descs[6], descs[8]}
2693-
for _, node := range notPresent {
2694-
if exists, _ := s.Exists(egCtx, node); exists {
2695-
t.Errorf("%v should not exist in store", node)
2696-
}
2697-
}
2698-
stillPresent = []ocispec.Descriptor{descs[0], descs[1], descs[2], descs[3], descs[5], descs[7], descs[9], descs[10], descs[11]}
2699-
for _, node := range stillPresent {
2700-
if exists, _ := s.Exists(egCtx, node); !exists {
2701-
t.Errorf("%v should exist in store", node)
2702-
}
2703-
}
2704-
2705-
// verify predecessors information
2706-
wants := [][]ocispec.Descriptor{
2707-
{descs[5], descs[10], descs[11]}, // Blob 0
2708-
nil, // Blob 1
2709-
{descs[5], descs[11]}, // Blob 2
2710-
nil, // Blob 3
2711-
{descs[7]}, // Blob 4's predecessor is descs[7], even though blob 4 no longer exist
2712-
{descs[7]}, // Blob 5
2713-
{descs[10]}, // Blob 6's predecessor is descs[10], even though blob 6 no longer exist
2714-
nil, // Blob 7
2715-
nil, // Blob 8
2716-
{descs[10]}, // Blob 9
2717-
{descs[11]}, // Blob 10
2718-
nil, // Blob 11
2719-
}
2720-
for i, want := range wants {
2721-
predecessors, err := s.Predecessors(ctx, descs[i])
2722-
if err != nil {
2723-
t.Errorf("Store.Predecessors(%d) error = %v", i, err)
2724-
}
2725-
if !equalDescriptorSet(predecessors, want) {
2726-
t.Errorf("Store.Predecessors(%d) = %v, want %v", i, predecessors, want)
2727-
}
2728-
}
2729-
}
2730-
27312420
func TestStore_Untag(t *testing.T) {
27322421
content := []byte("test delete")
27332422
desc := ocispec.Descriptor{

0 commit comments

Comments
 (0)