Skip to content

Commit 9b2d3bd

Browse files
committed
fix: push an empty index when deleting the last referrer with SkipReferrersGC (oras-project#593)
Fix: oras-project#592 Signed-off-by: Lixia (Sylvia) Lei <lixlei@microsoft.com>
1 parent 688077c commit 9b2d3bd

File tree

2 files changed

+572
-64
lines changed

2 files changed

+572
-64
lines changed

registry/remote/repository.go

+22-17
Original file line numberDiff line numberDiff line change
@@ -1425,26 +1425,25 @@ func (s *manifestStore) indexReferrersForPush(ctx context.Context, desc ocispec.
14251425
func (s *manifestStore) updateReferrersIndex(ctx context.Context, subject ocispec.Descriptor, change referrerChange) (err error) {
14261426
referrersTag := buildReferrersTag(subject)
14271427

1428-
skipDelete := s.repo.SkipReferrersGC
1429-
var oldIndexDesc ocispec.Descriptor
1430-
var referrers []ocispec.Descriptor
1428+
var oldIndexDesc *ocispec.Descriptor
1429+
var oldReferrers []ocispec.Descriptor
14311430
prepare := func() error {
14321431
// 1. pull the original referrers list using the referrers tag schema
1433-
var err error
1434-
oldIndexDesc, referrers, err = s.repo.referrersFromIndex(ctx, referrersTag)
1432+
indexDesc, referrers, err := s.repo.referrersFromIndex(ctx, referrersTag)
14351433
if err != nil {
14361434
if errors.Is(err, errdef.ErrNotFound) {
1437-
// no old index found, skip delete
1438-
skipDelete = true
1435+
// valid case: no old referrers index
14391436
return nil
14401437
}
14411438
return err
14421439
}
1440+
oldIndexDesc = &indexDesc
1441+
oldReferrers = referrers
14431442
return nil
14441443
}
14451444
update := func(referrerChanges []referrerChange) error {
14461445
// 2. apply the referrer changes on the referrers list
1447-
updatedReferrers, err := applyReferrerChanges(referrers, referrerChanges)
1446+
updatedReferrers, err := applyReferrerChanges(oldReferrers, referrerChanges)
14481447
if err != nil {
14491448
if err == errNoReferrerUpdate {
14501449
return nil
@@ -1453,7 +1452,12 @@ func (s *manifestStore) updateReferrersIndex(ctx context.Context, subject ocispe
14531452
}
14541453

14551454
// 3. push the updated referrers list using referrers tag schema
1456-
if len(updatedReferrers) > 0 {
1455+
if len(updatedReferrers) > 0 || s.repo.SkipReferrersGC {
1456+
// push a new index in either case:
1457+
// 1. the referrers list has been updated with a non-zero size
1458+
// 2. OR the updated referrers list is empty but referrers GC
1459+
// is skipped, in this case an empty index should still be pushed
1460+
// as the old index won't get deleted
14571461
newIndexDesc, newIndex, err := generateIndex(updatedReferrers)
14581462
if err != nil {
14591463
return fmt.Errorf("failed to generate referrers index for referrers tag %s: %w", referrersTag, err)
@@ -1463,14 +1467,15 @@ func (s *manifestStore) updateReferrersIndex(ctx context.Context, subject ocispe
14631467
}
14641468
}
14651469

1466-
// 4. delete the dangling original referrers index
1467-
if !skipDelete {
1468-
if err := s.repo.delete(ctx, oldIndexDesc, true); err != nil {
1469-
return &ReferrersError{
1470-
Op: opDeleteReferrersIndex,
1471-
Err: fmt.Errorf("failed to delete dangling referrers index %s for referrers tag %s: %w", oldIndexDesc.Digest.String(), referrersTag, err),
1472-
Subject: subject,
1473-
}
1470+
// 4. delete the dangling original referrers index, if applicable
1471+
if s.repo.SkipReferrersGC || oldIndexDesc == nil {
1472+
return nil
1473+
}
1474+
if err := s.repo.delete(ctx, *oldIndexDesc, true); err != nil {
1475+
return &ReferrersError{
1476+
Op: opDeleteReferrersIndex,
1477+
Err: fmt.Errorf("failed to delete dangling referrers index %s for referrers tag %s: %w", oldIndexDesc.Digest.String(), referrersTag, err),
1478+
Subject: subject,
14741479
}
14751480
}
14761481
return nil

0 commit comments

Comments
 (0)