mirror of
https://github.com/mudler/luet.git
synced 2025-07-12 14:48:28 +00:00
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:
parent
6b7e77df65
commit
4a45b5410d
@ -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())
|
||||||
|
|
||||||
|
@ -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())
|
||||||
|
Loading…
Reference in New Issue
Block a user