Skip to content

Commit c36a94e

Browse files
authored
Clean up repo cache when repository is removed (#4049)
Signed-off-by: Morten Torkildsen <[email protected]>
1 parent c924a3b commit c36a94e

File tree

6 files changed

+66
-3
lines changed

6 files changed

+66
-3
lines changed

porch/pkg/cache/repository.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ func (r *cachedRepository) Close() error {
333333
}
334334
r.objectNotifier.NotifyPackageRevisionChange(watch.Deleted, pr, pkgRevMeta)
335335
}
336-
return nil
336+
return r.repo.Close()
337337
}
338338

339339
// pollForever will continue polling until signal channel is closed or ctx is done.

porch/pkg/engine/fake/repository.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ type Repository struct {
3030

3131
var _ repository.Repository = &Repository{}
3232

33+
func (r *Repository) Close() error {
34+
return nil
35+
}
36+
3337
func (r *Repository) ListPackageRevisions(_ context.Context, filter repository.ListPackageRevisionFilter) ([]repository.PackageRevision, error) {
3438
var revs []repository.PackageRevision
3539
for _, rev := range r.PackageRevisions {

porch/pkg/git/git.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ func OpenRepository(ctx context.Context, name, namespace string, spec *configapi
131131
secret: spec.SecretRef.Name,
132132
credentialResolver: opts.CredentialResolver,
133133
userInfoProvider: opts.UserInfoProvider,
134+
cacheDir: dir,
134135
deployment: deployment,
135136
}
136137

@@ -157,6 +158,9 @@ type gitRepository struct {
157158
credentialResolver repository.CredentialResolver
158159
userInfoProvider repository.UserInfoProvider
159160

161+
// Folder used for the local git cache.
162+
cacheDir string
163+
160164
// deployment holds spec.deployment
161165
// TODO: Better caching here, support repository spec changes
162166
deployment bool
@@ -175,6 +179,13 @@ type gitRepository struct {
175179

176180
var _ GitRepository = &gitRepository{}
177181

182+
func (r *gitRepository) Close() error {
183+
if err := os.RemoveAll(r.cacheDir); err != nil {
184+
return fmt.Errorf("error cleaning up local git cache for repo %s: %v", r.name, err)
185+
}
186+
return nil
187+
}
188+
178189
func (r *gitRepository) ListPackages(ctx context.Context, filter repository.ListPackageFilter) ([]repository.Package, error) {
179190
ctx, span := tracer.Start(ctx, "gitRepository::ListPackages", trace.WithAttributes())
180191
defer span.End()

porch/pkg/oci/oci.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ type ociRepository struct {
6363
var _ repository.Repository = &ociRepository{}
6464
var _ repository.FunctionRepository = &ociRepository{}
6565

66+
func (r *ociRepository) Close() error {
67+
return nil
68+
}
69+
6670
func (r *ociRepository) ListPackageRevisions(ctx context.Context, filter repository.ListPackageRevisionFilter) ([]repository.PackageRevision, error) {
6771
if r.content != configapi.RepositoryContentPackage {
6872
return []repository.PackageRevision{}, nil

porch/pkg/registry/porch/background.go

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ loop:
103103
bookmark = repository.ResourceVersion
104104
klog.Infof("Bookmark: %q", bookmark)
105105
} else {
106-
b.updateCache(ctx, event.Type, repository)
106+
if err := b.updateCache(ctx, event.Type, repository); err != nil {
107+
klog.Warningf("error updating cache: %v", err)
108+
}
107109
}
108110
} else {
109111
klog.V(5).Infof("Received unexpected watch event Object: %T", event.Object)
@@ -136,13 +138,52 @@ func (b *background) updateCache(ctx context.Context, event watch.EventType, rep
136138
// TODO: implement
137139
case watch.Deleted:
138140
klog.Infof("Repository deleted: %s:%s", repository.ObjectMeta.Namespace, repository.ObjectMeta.Name)
139-
return b.cache.CloseRepository(repository)
141+
shared, err := b.isSharedRepository(ctx, repository)
142+
if err != nil {
143+
return err
144+
}
145+
// Only close the repository if no other k8s repository resources references
146+
// the same underlying git/oci repo.
147+
if !shared {
148+
return b.cache.CloseRepository(repository)
149+
}
150+
return nil
140151
default:
141152
klog.Warning("Unhandled watch event type: %s", event)
142153
}
143154
return nil
144155
}
145156

157+
// isSharedRepository checks if the underlying git/oci repo of the provided
158+
// k8s repository is also used by another repository.
159+
func (b *background) isSharedRepository(ctx context.Context, repo *configapi.Repository) (bool, error) {
160+
var obj configapi.RepositoryList
161+
if err := b.coreClient.List(ctx, &obj); err != nil {
162+
return false, err
163+
}
164+
for _, r := range obj.Items {
165+
if r.Name == repo.Name && r.Namespace == repo.Namespace {
166+
continue
167+
}
168+
if r.Spec.Type != repo.Spec.Type {
169+
continue
170+
}
171+
switch r.Spec.Type {
172+
case configapi.RepositoryTypeOCI:
173+
if r.Spec.Oci.Registry == repo.Spec.Oci.Registry {
174+
return true, nil
175+
}
176+
case configapi.RepositoryTypeGit:
177+
if r.Spec.Git.Repo == repo.Spec.Git.Repo {
178+
return true, nil
179+
}
180+
default:
181+
return false, fmt.Errorf("type %q not supported", r.Spec.Type)
182+
}
183+
}
184+
return false, nil
185+
}
186+
146187
func (b *background) runOnce(ctx context.Context) error {
147188
klog.Infof("background-refreshing repositories")
148189
var repositories configapi.RepositoryList

porch/pkg/repository/repository.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ type Repository interface {
202202

203203
// DeletePackage deletes a package
204204
DeletePackage(ctx context.Context, old Package) error
205+
206+
// Close cleans up any resources associated with the repository
207+
Close() error
205208
}
206209

207210
type FunctionRepository interface {

0 commit comments

Comments
 (0)