Introduce lock for installation

It is used to ensure integrity and that we do install one package at
once. This is to ensure that we extract correctly, and that we are not
too much I/O intensive depending on CPU
This commit is contained in:
Ettore Di Giacinto 2021-10-24 09:20:26 +02:00
parent 6b7e77df65
commit 4a45b5410d
2 changed files with 14 additions and 18 deletions

View File

@ -161,13 +161,8 @@ RUN echo bar > /test2`))
_, _, err = image.ExtractTo( _, _, err = image.ExtractTo(
ctx, ctx,
img, img,
resultingImage, result,
image.ExtractFiles( nil,
ctx,
"",
[]string{},
[]string{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
@ -215,13 +210,8 @@ RUN echo bar > /test2`))
_, _, err = image.ExtractTo( _, _, err = image.ExtractTo(
ctx, ctx,
img, img,
resultingImage, result,
image.ExtractFiles( nil,
ctx,
"",
[]string{},
[]string{},
),
) )
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View File

@ -325,11 +325,12 @@ func (l *LuetInstaller) runOps(ops []installerOp, s *System) error {
all := make(chan installerOp) all := make(chan installerOp)
wg := new(sync.WaitGroup) wg := new(sync.WaitGroup)
systemLock := &sync.Mutex{}
// Do the real install // Do the real install
for i := 0; i < l.Options.Concurrency; i++ { for i := 0; i < l.Options.Concurrency; i++ {
wg.Add(1) wg.Add(1)
go l.installerOpWorker(i, wg, all, s) go l.installerOpWorker(i, wg, systemLock, all, s)
} }
for _, c := range ops { for _, c := range ops {
@ -343,7 +344,7 @@ func (l *LuetInstaller) runOps(ops []installerOp, s *System) error {
// TODO: use installerOpWorker in place of all the other workers. // TODO: use installerOpWorker in place of all the other workers.
// This one is general enough to read a list of operations and execute them. // This one is general enough to read a list of operations and execute them.
func (l *LuetInstaller) installerOpWorker(i int, wg *sync.WaitGroup, c <-chan installerOp, s *System) error { func (l *LuetInstaller) installerOpWorker(i int, wg *sync.WaitGroup, systemLock *sync.Mutex, c <-chan installerOp, s *System) error {
defer wg.Done() defer wg.Done()
for p := range c { for p := range c {
@ -368,6 +369,7 @@ func (l *LuetInstaller) installerOpWorker(i int, wg *sync.WaitGroup, c <-chan in
ass := p.Install.Assertions.Search(p.Install.Package.GetFingerPrint()) ass := p.Install.Assertions.Search(p.Install.Package.GetFingerPrint())
packageToInstall, _ := p.Install.Packages.Find(p.Install.Package.GetPackageName()) packageToInstall, _ := p.Install.Packages.Find(p.Install.Package.GetPackageName())
systemLock.Lock()
err := l.install( err := l.install(
p.Install.Option, p.Install.Option,
p.Install.Reposiories, p.Install.Reposiories,
@ -377,6 +379,7 @@ func (l *LuetInstaller) installerOpWorker(i int, wg *sync.WaitGroup, c <-chan in
p.Install.Database, p.Install.Database,
s, s,
) )
systemLock.Unlock()
if err != nil { if err != nil {
l.Options.Context.Error(err) l.Options.Context.Error(err)
} }
@ -841,11 +844,12 @@ func (l *LuetInstaller) install(o Option, syncedRepos Repositories, toInstall ma
all := make(chan ArtifactMatch) all := make(chan ArtifactMatch)
wg := new(sync.WaitGroup) wg := new(sync.WaitGroup)
installLock := &sync.Mutex{}
// Do the real install // Do the real install
for i := 0; i < l.Options.Concurrency; i++ { for i := 0; i < l.Options.Concurrency; i++ {
wg.Add(1) wg.Add(1)
go l.installerWorker(i, wg, all, s) go l.installerWorker(i, wg, installLock, all, s)
} }
for _, c := range toInstall { for _, c := range toInstall {
@ -933,12 +937,14 @@ func (l *LuetInstaller) downloadWorker(i int, wg *sync.WaitGroup, c <-chan Artif
return nil return nil
} }
func (l *LuetInstaller) installerWorker(i int, wg *sync.WaitGroup, c <-chan ArtifactMatch, s *System) error { func (l *LuetInstaller) installerWorker(i int, wg *sync.WaitGroup, installLock *sync.Mutex, c <-chan ArtifactMatch, s *System) error {
defer wg.Done() defer wg.Done()
for p := range c { for p := range c {
// TODO: Keep trace of what was added from the tar, and save it into system // TODO: Keep trace of what was added from the tar, and save it into system
installLock.Lock()
err := l.installPackage(p, s) err := l.installPackage(p, s)
installLock.Unlock()
if err != nil && !l.Options.Force { if err != nil && !l.Options.Force {
//TODO: Uninstall, rollback. //TODO: Uninstall, rollback.
l.Options.Context.Fatal("Failed installing package "+p.Package.GetName(), err.Error()) l.Options.Context.Fatal("Failed installing package "+p.Package.GetName(), err.Error())