Skip to content

Commit 701cc72

Browse files
johnbelamaricmortent
authored andcommitted
Do not refresh if no repo changes (#4085)
* Do not refresh if no repo changes Signed-off-by: John Belamaric <[email protected]> * Need to hold the lock during Version Signed-off-by: John Belamaric <[email protected]> * Fix fake repo Signed-off-by: John Belamaric <[email protected]> --------- Signed-off-by: John Belamaric <[email protected]>
1 parent a88f1fc commit 701cc72

File tree

5 files changed

+116
-0
lines changed

5 files changed

+116
-0
lines changed

porch/pkg/cache/repository.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ type cachedRepository struct {
5252
repo repository.Repository
5353
cancel context.CancelFunc
5454

55+
lastVersion string
56+
5557
mutex sync.Mutex
5658
cachedPackageRevisions map[repository.PackageRevisionKey]*cachedPackageRevision
5759
cachedPackages map[repository.PackageKey]*cachedPackage
@@ -86,6 +88,10 @@ func newRepository(id string, repoSpec *configapi.Repository, repo repository.Re
8688
return r
8789
}
8890

91+
func (r *cachedRepository) Version(ctx context.Context) (string, error) {
92+
return r.repo.Version(ctx)
93+
}
94+
8995
func (r *cachedRepository) ListPackageRevisions(ctx context.Context, filter repository.ListPackageRevisionFilter) ([]repository.PackageRevision, error) {
9096
packages, err := r.getPackageRevisions(ctx, filter, false)
9197
if err != nil {
@@ -390,6 +396,15 @@ func (r *cachedRepository) refreshAllCachedPackages(ctx context.Context) (map[re
390396
start := time.Now()
391397
defer func() { klog.Infof("repo %s: refresh finished in %f secs", r.id, time.Since(start).Seconds()) }()
392398

399+
curVer, err := r.Version(ctx)
400+
if err != nil {
401+
return nil, nil, err
402+
}
403+
404+
if curVer == r.lastVersion {
405+
return r.cachedPackages, r.cachedPackageRevisions, nil
406+
}
407+
393408
// Look up all existing PackageRevCRs so we an compare those to the
394409
// actual Packagerevisions found in git/oci, and add/prune PackageRevCRs
395410
// as necessary.
@@ -538,6 +553,7 @@ func (r *cachedRepository) refreshAllCachedPackages(ctx context.Context) (map[re
538553

539554
r.cachedPackageRevisions = newPackageRevisionMap
540555
r.cachedPackages = newPackageMap
556+
r.lastVersion = curVer
541557

542558
return newPackageMap, newPackageRevisionMap, nil
543559
}

porch/pkg/engine/fake/repository.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ func (r *Repository) Close() error {
3434
return nil
3535
}
3636

37+
func (r *Repository) Version(ctx context.Context) (string, error) {
38+
return "foo", nil
39+
}
40+
3741
func (r *Repository) ListPackageRevisions(_ context.Context, filter repository.ListPackageRevisionFilter) ([]repository.PackageRevision, error) {
3842
var revs []repository.PackageRevision
3943
for _, rev := range r.PackageRevisions {

porch/pkg/git/git.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
package git
1616

1717
import (
18+
"bytes"
1819
"context"
20+
"crypto/sha256"
21+
"encoding/hex"
1922
"errors"
2023
"fmt"
2124
"io"
@@ -186,6 +189,35 @@ func (r *gitRepository) Close() error {
186189
return nil
187190
}
188191

192+
func (r *gitRepository) Version(ctx context.Context) (string, error) {
193+
ctx, span := tracer.Start(ctx, "gitRepository::Version", trace.WithAttributes())
194+
defer span.End()
195+
r.mutex.Lock()
196+
defer r.mutex.Unlock()
197+
198+
if err := r.fetchRemoteRepository(ctx); err != nil {
199+
return "", err
200+
}
201+
202+
refs, err := r.repo.References()
203+
if err != nil {
204+
return "", err
205+
}
206+
207+
b := bytes.Buffer{}
208+
for {
209+
ref, err := refs.Next()
210+
if err == io.EOF {
211+
break
212+
}
213+
214+
b.WriteString(ref.String())
215+
}
216+
217+
hash := sha256.Sum256(b.Bytes())
218+
return hex.EncodeToString(hash[:]), nil
219+
}
220+
189221
func (r *gitRepository) ListPackages(ctx context.Context, filter repository.ListPackageFilter) ([]repository.Package, error) {
190222
ctx, span := tracer.Start(ctx, "gitRepository::ListPackages", trace.WithAttributes())
191223
defer span.End()
@@ -629,6 +661,9 @@ func (r *gitRepository) discoverFinalizedPackages(ctx context.Context, ref *plum
629661

630662
// loadDraft will load the draft package. If the package isn't found (we now require a Kptfile), it will return (nil, nil)
631663
func (r *gitRepository) loadDraft(ctx context.Context, ref *plumbing.Reference) (*gitPackageRevision, error) {
664+
ctx, span := tracer.Start(ctx, "gitRepository::loadDraft", trace.WithAttributes())
665+
defer span.End()
666+
632667
name, workspaceName, err := parseDraftName(ref)
633668
if err != nil {
634669
return nil, err
@@ -719,6 +754,9 @@ func parseDraftName(draft *plumbing.Reference) (name string, workspaceName v1alp
719754
}
720755

721756
func (r *gitRepository) loadTaggedPackages(ctx context.Context, tag *plumbing.Reference) ([]*gitPackageRevision, error) {
757+
ctx, span := tracer.Start(ctx, "gitRepository::loadTaggedPackages", trace.WithAttributes())
758+
defer span.End()
759+
722760
name, ok := getTagNameInLocalRepo(tag.Name())
723761
if !ok {
724762
return nil, fmt.Errorf("invalid tag ref: %q", tag)

porch/pkg/oci/oci.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
package oci
1616

1717
import (
18+
"bytes"
1819
"context"
1920
"crypto/sha1"
21+
"crypto/sha256"
2022
"encoding/hex"
2123
"fmt"
2224
"strings"
@@ -67,6 +69,59 @@ func (r *ociRepository) Close() error {
6769
return nil
6870
}
6971

72+
// there is probably a more efficient way to do this
73+
func (r *ociRepository) Version(ctx context.Context) (string, error) {
74+
ctx, span := tracer.Start(ctx, "ociRepository::Version")
75+
defer span.End()
76+
77+
if r.content != configapi.RepositoryContentPackage {
78+
return "", nil
79+
}
80+
81+
ociRepo, err := name.NewRepository(r.spec.Registry)
82+
if err != nil {
83+
return "", err
84+
}
85+
86+
options := r.storage.CreateOptions(ctx)
87+
88+
tags, err := google.List(ociRepo, options...)
89+
if err != nil {
90+
return "", err
91+
}
92+
93+
klog.Infof("tags: %#v", tags)
94+
95+
b := bytes.Buffer{}
96+
for _, childName := range tags.Children {
97+
path := fmt.Sprintf("%s/%s", r.spec.Registry, childName)
98+
child, err := name.NewRepository(path, name.StrictValidation)
99+
if err != nil {
100+
klog.Warningf("Cannot create nested repository %q: %v", path, err)
101+
continue
102+
}
103+
104+
childTags, err := google.List(child, options...)
105+
if err != nil {
106+
klog.Warningf("Cannot list nested repository %q: %v", path, err)
107+
continue
108+
}
109+
110+
// klog.Infof("childTags: %#v", childTags)
111+
112+
for digest, m := range childTags.Manifests {
113+
b.WriteString(digest)
114+
mb, err := m.MarshalJSON()
115+
if err != nil {
116+
return "", err
117+
}
118+
b.Write(mb)
119+
}
120+
}
121+
hash := sha256.Sum256(b.Bytes())
122+
return hex.EncodeToString(hash[:]), nil
123+
}
124+
70125
func (r *ociRepository) ListPackageRevisions(ctx context.Context, filter repository.ListPackageRevisionFilter) ([]repository.PackageRevision, error) {
71126
if r.content != configapi.RepositoryContentPackage {
72127
return []repository.PackageRevision{}, nil

porch/pkg/repository/repository.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@ type Repository interface {
206206
// DeletePackage deletes a package
207207
DeletePackage(ctx context.Context, old Package) error
208208

209+
// Version returns a string that is guaranteed to be different if any change has been made to the repo contents
210+
Version(ctx context.Context) (string, error)
211+
209212
// Close cleans up any resources associated with the repository
210213
Close() error
211214
}

0 commit comments

Comments
 (0)