From b3e3abec8f4323dd0a234d14ca489153b8c55ecc Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Wed, 17 Feb 2021 09:43:44 +0100 Subject: [PATCH] Fixup spinner data race Add spinner lock --- go.mod | 2 +- go.sum | 4 ++-- pkg/compiler/backend/common.go | 13 ++++++++++--- pkg/compiler/backend/simpledocker.go | 11 +---------- pkg/compiler/backend/simpleimg.go | 6 ------ pkg/logger/logger.go | 7 ++++++- 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 7a354a97..6d204b56 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Sabayon/pkgs-checker v0.7.2 github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef github.com/asdine/storm v0.0.0-20190418133842-e0f77eada154 - github.com/briandowns/spinner v1.7.0 + github.com/briandowns/spinner v1.12.1-0.20201220203425-e201aaea0a31 github.com/cavaliercoder/grab v1.0.1-0.20201108051000-98a5bfe305ec github.com/containerd/containerd v1.4.1-0.20201117152358-0edc412565dc github.com/crillab/gophersat v1.3.2-0.20201023142334-3fc2ac466765 diff --git a/go.sum b/go.sum index 17a6d2ef..3705eb0d 100644 --- a/go.sum +++ b/go.sum @@ -144,8 +144,8 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.7.0 h1:aan1hBBOoscry2TXAkgtxkJiq7Se0+9pt+TUWaPrB4g= -github.com/briandowns/spinner v1.7.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/briandowns/spinner v1.12.1-0.20201220203425-e201aaea0a31 h1:yInAg9pE5qGec5eQ7XdfOTTaGwGxD3bKFVjmD6VKkwc= +github.com/briandowns/spinner v1.12.1-0.20201220203425-e201aaea0a31/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= diff --git a/pkg/compiler/backend/common.go b/pkg/compiler/backend/common.go index 8209bd22..1627c5e8 100644 --- a/pkg/compiler/backend/common.go +++ b/pkg/compiler/backend/common.go @@ -21,6 +21,7 @@ import ( "github.com/mudler/luet/pkg/compiler" "github.com/mudler/luet/pkg/config" + . "github.com/mudler/luet/pkg/logger" "github.com/google/go-containerregistry/pkg/crane" "github.com/pkg/errors" @@ -49,8 +50,14 @@ func NewBackend(s string) compiler.CompilerBackend { } func runCommand(cmd *exec.Cmd) (string, error) { + buffered := !config.LuetCfg.GetGeneral().ShowBuildOutput + if buffered { + Spinner(22) + defer SpinnerStop() + } + ans := "" - writer := NewBackendWriter(!config.LuetCfg.GetGeneral().ShowBuildOutput) + writer := NewBackendWriter(buffered) cmd.Stdout = writer cmd.Stderr = writer @@ -68,7 +75,7 @@ func runCommand(cmd *exec.Cmd) (string, error) { res := cmd.ProcessState.ExitCode() if res != 0 { errMsg := fmt.Sprintf("Failed building image (exiting with %d)", res) - if !config.LuetCfg.GetGeneral().ShowBuildOutput { + if buffered { errMsg = fmt.Sprintf("Failed building image (exiting with %d): %s", res, writer.GetCombinedOutput()) } @@ -76,7 +83,7 @@ func runCommand(cmd *exec.Cmd) (string, error) { return "", errors.Wrap(err, errMsg) } - if !config.LuetCfg.GetGeneral().ShowBuildOutput { + if buffered { ans = writer.GetCombinedOutput() } diff --git a/pkg/compiler/backend/simpledocker.go b/pkg/compiler/backend/simpledocker.go index 98a42ca5..824569c2 100644 --- a/pkg/compiler/backend/simpledocker.go +++ b/pkg/compiler/backend/simpledocker.go @@ -53,11 +53,6 @@ func (*SimpleDocker) BuildImage(opts compiler.CompilerBackendOptions) error { } buildarg := []string{"build", "-f", dockerfileName, "-t", name, context} - if !config.LuetCfg.GetGeneral().ShowBuildOutput { - Spinner(22) - defer SpinnerStop() - } - Info(":whale2: Building image " + name) cmd := exec.Command("docker", buildarg...) cmd.Dir = path @@ -66,10 +61,6 @@ func (*SimpleDocker) BuildImage(opts compiler.CompilerBackendOptions) error { return err } - if !config.LuetCfg.GetGeneral().ShowBuildOutput { - SpinnerStop() - } - Info(":whale: Building image " + name + " done") if os.Getenv("DOCKER_SQUASH") == "true" { @@ -77,7 +68,7 @@ func (*SimpleDocker) BuildImage(opts compiler.CompilerBackendOptions) error { var client *docker.Client Spinner(22) - + defer SpinnerStop() client, err = docker.NewClientFromEnv() if err != nil { return errors.Wrap(err, "could not connect to the Docker daemon") diff --git a/pkg/compiler/backend/simpleimg.go b/pkg/compiler/backend/simpleimg.go index a85757f8..c75f9da9 100644 --- a/pkg/compiler/backend/simpleimg.go +++ b/pkg/compiler/backend/simpleimg.go @@ -21,7 +21,6 @@ import ( "strings" "github.com/mudler/luet/pkg/compiler" - "github.com/mudler/luet/pkg/config" . "github.com/mudler/luet/pkg/logger" "github.com/pkg/errors" @@ -48,11 +47,6 @@ func (*SimpleImg) BuildImage(opts compiler.CompilerBackendOptions) error { Info(":tea: Building image " + name) - if !config.LuetCfg.GetGeneral().ShowBuildOutput { - Spinner(22) - defer SpinnerStop() - } - cmd := exec.Command("img", buildarg...) cmd.Dir = path _, err := runCommand(cmd) diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 6b2028cf..4f07644b 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -8,6 +8,7 @@ import ( "runtime" "strings" + "sync" . "github.com/mudler/luet/pkg/config" "github.com/briandowns/spinner" @@ -20,7 +21,7 @@ import ( var s *spinner.Spinner = nil var z *zap.Logger = nil var aurora Aurora = nil - +var spinnerLock = sync.Mutex{} func NewSpinner() { if s == nil { s = spinner.New( @@ -84,6 +85,8 @@ func ZapLogger() error { } func Spinner(i int) { + spinnerLock.Lock() + defer spinnerLock.Unlock() var confLevel int if LuetCfg.GetGeneral().Debug { confLevel = 3 @@ -120,6 +123,8 @@ func SpinnerText(suffix, prefix string) { } func SpinnerStop() { + spinnerLock.Lock() + defer spinnerLock.Unlock() var confLevel int if LuetCfg.GetGeneral().Debug { confLevel = 3