Compare commits

..

2 Commits

Author SHA1 Message Date
Ettore Di Giacinto
db8bf2b85e Tag 0.17.2 2021-07-30 13:33:29 +02:00
Ettore Di Giacinto
5eb586ddb0 Speedup conflict check by caching in memory files 2021-07-30 12:40:55 +02:00
4 changed files with 39 additions and 13 deletions

View File

@@ -41,7 +41,7 @@ var Verbose bool
var LockedCommands = []string{"install", "uninstall", "upgrade"} var LockedCommands = []string{"install", "uninstall", "upgrade"}
const ( const (
LuetCLIVersion = "0.17.1" LuetCLIVersion = "0.17.2"
LuetEnvPrefix = "LUET" LuetEnvPrefix = "LUET"
license = ` license = `
Luet Copyright (C) 2019-2021 Ettore Di Giacinto Luet Copyright (C) 2019-2021 Ettore Di Giacinto

View File

@@ -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)

View File

@@ -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"
@@ -10,8 +12,10 @@ 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() {
for _, p := range s.Database.World() { s.Lock()
files, err := s.Database.GetPackageFiles(p) defer s.Unlock()
if err != nil { // Check if cache is empty or if it got modified
return false, nil, err if s.fileIndex == nil { //|| len(s.Database.GetPackages()) != len(s.fileIndex) {
} s.fileIndex = make(map[string]pkg.Package)
for _, f := range files { for _, p := range s.Database.World() {
if f == file { files, _ := s.Database.GetPackageFiles(p)
return true, p, nil for _, f := range files {
s.fileIndex[f] = p
} }
} }
} }
}
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
} }

View File

@@ -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())