mirror of
https://github.com/mudler/luet.git
synced 2025-09-06 01:30:29 +00:00
Speedup conflict check by caching in memory files
This commit is contained in:
@@ -758,6 +758,8 @@ func (l *LuetInstaller) getFinalizers(allRepos pkg.PackageDatabase, solution sol
|
|||||||
|
|
||||||
func (l *LuetInstaller) checkFileconflicts(toInstall map[string]ArtifactMatch, s *System) error {
|
func (l *LuetInstaller) checkFileconflicts(toInstall map[string]ArtifactMatch, s *System) error {
|
||||||
Info("Checking for file conflicts..")
|
Info("Checking for file conflicts..")
|
||||||
|
defer s.Clean() // Release memory
|
||||||
|
|
||||||
filesToInstall := []string{}
|
filesToInstall := []string{}
|
||||||
for _, m := range toInstall {
|
for _, m := range toInstall {
|
||||||
a, err := l.downloadPackage(m)
|
a, err := l.downloadPackage(m)
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
package installer
|
package installer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
"github.com/mudler/luet/pkg/helpers"
|
"github.com/mudler/luet/pkg/helpers"
|
||||||
fileHelper "github.com/mudler/luet/pkg/helpers/file"
|
fileHelper "github.com/mudler/luet/pkg/helpers/file"
|
||||||
@@ -12,6 +14,8 @@ import (
|
|||||||
type System struct {
|
type System struct {
|
||||||
Database pkg.PackageDatabase
|
Database pkg.PackageDatabase
|
||||||
Target string
|
Target string
|
||||||
|
fileIndex map[string]pkg.Package
|
||||||
|
sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *System) World() (pkg.Packages, error) {
|
func (s *System) World() (pkg.Packages, error) {
|
||||||
@@ -53,17 +57,37 @@ func (s *System) ExecuteFinalizers(packs []pkg.Package) error {
|
|||||||
return errs
|
return errs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *System) ExistsPackageFile(file string) (bool, pkg.Package, error) {
|
func (s *System) buildFileIndex() {
|
||||||
|
s.Lock()
|
||||||
|
defer s.Unlock()
|
||||||
|
// Check if cache is empty or if it got modified
|
||||||
|
if s.fileIndex == nil { //|| len(s.Database.GetPackages()) != len(s.fileIndex) {
|
||||||
|
s.fileIndex = make(map[string]pkg.Package)
|
||||||
for _, p := range s.Database.World() {
|
for _, p := range s.Database.World() {
|
||||||
files, err := s.Database.GetPackageFiles(p)
|
files, _ := s.Database.GetPackageFiles(p)
|
||||||
if err != nil {
|
|
||||||
return false, nil, err
|
|
||||||
}
|
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
if f == file {
|
s.fileIndex[f] = p
|
||||||
return true, p, nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *System) Clean() {
|
||||||
|
s.Lock()
|
||||||
|
defer s.Unlock()
|
||||||
|
s.fileIndex = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *System) ExistsPackageFile(file string) (bool, pkg.Package, error) {
|
||||||
|
Debug("Checking if file ", file, "belongs to any package")
|
||||||
|
s.buildFileIndex()
|
||||||
|
s.Lock()
|
||||||
|
defer s.Unlock()
|
||||||
|
if p, exists := s.fileIndex[file]; exists {
|
||||||
|
Debug(file, "belongs already to", p.HumanReadableString())
|
||||||
|
|
||||||
|
return exists, p, nil
|
||||||
|
}
|
||||||
|
Debug(file, "doesn't belong to any package")
|
||||||
return false, nil, nil
|
return false, nil, nil
|
||||||
}
|
}
|
||||||
|
@@ -60,7 +60,7 @@ var _ = Describe("System", func() {
|
|||||||
r, p, err = s.ExistsPackageFile("f")
|
r, p, err = s.ExistsPackageFile("f")
|
||||||
Expect(r).To(BeTrue())
|
Expect(r).To(BeTrue())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(p).To(Equal(a))
|
Expect(p).To(Equal(b))
|
||||||
r, p, err = s.ExistsPackageFile("barz")
|
r, p, err = s.ExistsPackageFile("barz")
|
||||||
Expect(r).To(BeTrue())
|
Expect(r).To(BeTrue())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Reference in New Issue
Block a user