Skip to content

Commit

Permalink
fix: do not copy sync.Mutex in Repository
Browse files Browse the repository at this point in the history
sibling() was copying the entire Respoitory struct which contains a
sync.Mutex.  Added a clone() to consolidate the code that performs a
limited copy.

Signed-off-by: Kyle M. Tarplee <[email protected]>
  • Loading branch information
ktarplee committed Sep 20, 2023
1 parent 577bffe commit 9534aab
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions registry/remote/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ type Repository struct {
// - https://www.rfc-editor.org/rfc/rfc7234#section-5.5
HandleWarning func(warning Warning)

// NOTE: Must keep fields in sync with newRepositoryWithOptions function.
// NOTE: Must keep fields in sync with clone().

// referrersState represents that if the repository supports Referrers API.
// default: referrersStateUnknown
Expand Down Expand Up @@ -186,16 +186,23 @@ func newRepositoryWithOptions(ref registry.Reference, opts *RepositoryOptions) (
if err := ref.ValidateRepository(); err != nil {
return nil, err
}
repo := (*Repository)(opts).clone()
repo.Reference = ref
return repo, nil
}

// clone makes a copy of the Repository being careful not to copy non-copyable fields (sync.Mutex and syncutil.Pool types)
func (r *Repository) clone() *Repository {
return &Repository{
Client: opts.Client,
Reference: ref,
PlainHTTP: opts.PlainHTTP,
SkipReferrersGC: opts.SkipReferrersGC,
ManifestMediaTypes: slices.Clone(opts.ManifestMediaTypes),
TagListPageSize: opts.TagListPageSize,
ReferrerListPageSize: opts.ReferrerListPageSize,
MaxMetadataBytes: opts.MaxMetadataBytes,
}, nil
Client: r.Client,
Reference: r.Reference,
PlainHTTP: r.PlainHTTP,
SkipReferrersGC: r.SkipReferrersGC,
ManifestMediaTypes: slices.Clone(r.ManifestMediaTypes),
TagListPageSize: r.TagListPageSize,
ReferrerListPageSize: r.ReferrerListPageSize,
MaxMetadataBytes: r.MaxMetadataBytes,
}
}

// SetReferrersCapability indicates the Referrers API capability of the remote
Expand Down Expand Up @@ -803,10 +810,10 @@ func (s *blobStore) Mount(ctx context.Context, desc ocispec.Descriptor, fromRepo
// sibling returns a blob store for another repository in the same
// registry.
func (s *blobStore) sibling(otherRepoName string) *blobStore {
otherRepo := *s.repo
otherRepo := s.repo.clone()
otherRepo.Reference.Repository = otherRepoName
return &blobStore{
repo: &otherRepo,
repo: otherRepo,
}
}

Expand Down

0 comments on commit 9534aab

Please sign in to comment.