From f27b0921e1f17b1de0903f432c5ed16cdfa57b7e Mon Sep 17 00:00:00 2001 From: Xiaoxuan Wang <103478229+wangxiaoxuan273@users.noreply.github.com> Date: Fri, 6 Jan 2023 17:30:41 +0800 Subject: [PATCH] feat: implement referrers deletion (#54) Signed-off-by: wangxiaoxuan273 --- registry/storage/manifeststore.go | 37 ++++++++++++++++++++++++++++++- registry/storage/paths.go | 6 ++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/registry/storage/manifeststore.go b/registry/storage/manifeststore.go index f459a33463f..b0c1d48cb07 100644 --- a/registry/storage/manifeststore.go +++ b/registry/storage/manifeststore.go @@ -154,7 +154,42 @@ func (ms *manifestStore) Put(ctx context.Context, manifest distribution.Manifest // Delete removes the revision of the specified manifest. func (ms *manifestStore) Delete(ctx context.Context, dgst digest.Digest) error { dcontext.GetLogger(ms.ctx).Debug("(*manifestStore).Delete") - return ms.blobStore.Delete(ctx, dgst) + + if !ms.blobStore.deleteEnabled { + return distribution.ErrUnsupported + } + + // Ensure the blob is available for deletion + _, err := ms.blobStore.Stat(ctx, dgst) + if err != nil { + return err + } + + // Remove the manifest from its subject's indexed referrers, if applicable + man, err := ms.Get(ctx, dgst) + if err != nil { + return fmt.Errorf("unable to retrieve manifest: %w", err) + } + + var subject *distribution.Descriptor + switch m := man.(type) { + case *ociartifact.DeserializedManifest: + subject = m.Subject + case *ocischema.DeserializedManifest: + subject = m.Subject + } + + if subject != nil { + referrersLinkPath, err := pathFor(referrersLinkPathSpec{name: ms.repository.Named().Name(), revision: dgst, subjectRevision: subject.Digest}) + if err != nil { + return fmt.Errorf("failed to generate referrers link path for %v", dgst) + } + if err = ms.repository.driver.Delete(ctx, referrersLinkPath); err != nil { + return err + } + } + + return ms.blobStore.blobAccessController.Clear(ctx, dgst) } func (ms *manifestStore) Enumerate(ctx context.Context, ingester func(digest.Digest) error) error { diff --git a/registry/storage/paths.go b/registry/storage/paths.go index 50487576087..0480d2c2c71 100644 --- a/registry/storage/paths.go +++ b/registry/storage/paths.go @@ -41,8 +41,8 @@ const ( // startedat // hashstates// // -> _referrers/subjects -// -> -// -> /link +// -> +// -> /link // // -> blob/ // @@ -101,7 +101,7 @@ const ( // // Referrers: // -// referrersLinkPathSpec: /v2/repositories//_referrers/subjects/////link +// referrersLinkPathSpec: /v2/repositories//_referrers/subjects/////link // // Blob Store: //