From 10ae872a3e6f4115c6647f319b83d2fc366d0cfc Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Mon, 9 Aug 2021 12:47:27 +0200 Subject: [PATCH] Simplify revdep code Isolate common code into a function and also fix a sublte bug hiding in that code. We need to stab a copy of the package inside our PackageMap to avoid having symlinks pointing at the same values when iterating over requires. ( e.g. happened in this case: https://github.com/rancher-sandbox/cOS-toolkit/pull/467#issuecomment-895060115 ) --- pkg/package/database_mem.go | 49 ++++++++++++++----------------------- pkg/package/package.go | 12 +++++++++ 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/pkg/package/database_mem.go b/pkg/package/database_mem.go index 01fc2aa8..bc805339 100644 --- a/pkg/package/database_mem.go +++ b/pkg/package/database_mem.go @@ -195,6 +195,16 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) { return ID, nil } +func (db *InMemoryDatabase) updateRevDep(k, v string, b Package) { + db.Lock() + defer db.Unlock() + _, ok := db.RevDepsDatabase[k] + if !ok { + db.RevDepsDatabase[k] = make(map[string]Package) + } + db.RevDepsDatabase[k][v] = b.Clone() +} + func (db *InMemoryDatabase) populateCaches(p Package) { pd, _ := p.(*DefaultPackage) @@ -226,54 +236,33 @@ func (db *InMemoryDatabase) populateCaches(p Package) { } db.CacheNoVersion[p.GetPackageName()][p.GetVersion()] = nil + db.Unlock() + // Updating Revdeps // Given that when we populate the cache we don't have the full db at hand // We cycle over reverse dependency of a package to update their entry if they are matching // the version selector + db.Lock() toUpdate, ok := db.RevDepsDatabase[pd.GetPackageName()] + db.Unlock() if ok { for _, pp := range toUpdate { for _, re := range pp.GetRequires() { if match, _ := pd.VersionMatchSelector(re.GetVersion(), nil); match { - _, ok = db.RevDepsDatabase[pd.GetFingerPrint()] - if !ok { - db.RevDepsDatabase[pd.GetFingerPrint()] = make(map[string]Package) - } - db.RevDepsDatabase[pd.GetFingerPrint()][pp.GetFingerPrint()] = pp + db.updateRevDep(pd.GetFingerPrint(), pp.GetFingerPrint(), pp) } } } } - db.Unlock() for _, re := range pd.GetRequires() { packages, _ := db.FindPackages(re) - db.Lock() - for _, pa := range packages { - _, ok := db.RevDepsDatabase[pa.GetFingerPrint()] - if !ok { - db.RevDepsDatabase[pa.GetFingerPrint()] = make(map[string]Package) - } - db.RevDepsDatabase[pa.GetFingerPrint()][pd.GetFingerPrint()] = pd - _, ok = db.RevDepsDatabase[pa.GetPackageName()] - if !ok { - db.RevDepsDatabase[pa.GetPackageName()] = make(map[string]Package) - } - db.RevDepsDatabase[pa.GetPackageName()][pd.GetPackageName()] = pd + db.updateRevDep(pa.GetFingerPrint(), pd.GetFingerPrint(), pd) + db.updateRevDep(pa.GetPackageName(), pd.GetPackageName(), pd) } - _, ok := db.RevDepsDatabase[re.GetFingerPrint()] - if !ok { - db.RevDepsDatabase[re.GetFingerPrint()] = make(map[string]Package) - } - db.RevDepsDatabase[re.GetFingerPrint()][pd.GetFingerPrint()] = pd - _, ok = db.RevDepsDatabase[re.GetPackageName()] - if !ok { - db.RevDepsDatabase[re.GetPackageName()] = make(map[string]Package) - } - db.RevDepsDatabase[re.GetPackageName()][pd.GetPackageName()] = pd - - db.Unlock() + db.updateRevDep(re.GetFingerPrint(), pd.GetFingerPrint(), pd) + db.updateRevDep(re.GetPackageName(), pd.GetPackageName(), pd) } } diff --git a/pkg/package/package.go b/pkg/package/package.go index 91eb1a22..400dc922 100644 --- a/pkg/package/package.go +++ b/pkg/package/package.go @@ -136,6 +136,18 @@ type Packages []Package type DefaultPackages []*DefaultPackage +type PackageMap map[string]Package + +func (pm PackageMap) String() string { + rr := []string{} + for _, r := range pm { + + rr = append(rr, r.HumanReadableString()) + + } + return fmt.Sprint(rr) +} + func (d DefaultPackages) Hash(salt string) string { overallFp := ""