grim/convey

Parents fe6910f8166f
Children ca2b01050753
Don't potentially deadlock on commands if we bomb out early with errors
--- a/command/command.go Fri Aug 02 01:41:21 2019 -0500
+++ b/command/command.go Fri Aug 02 03:19:39 2019 -0500
@@ -38,7 +38,7 @@
errCollector = newLogCollector(logger, log.ErrorLevel)
)
- return run(name, cmdv, timeout, outCollector, errCollector)
+ return run(name, cmdv, timeout, &sync.WaitGroup{}, outCollector, errCollector)
}
// RunOutput works just like Run but returns stdout and stderr instead of
@@ -50,14 +50,13 @@
errCollector = newStringCollector(wg)
)
- wg.Add(2)
- err := run(name, cmdv, timeout, outCollector.handler, errCollector.handler)
+ err := run(name, cmdv, timeout, wg, outCollector.handler, errCollector.handler)
wg.Wait()
return outCollector.output, errCollector.output, err
}
-func run(name string, cmdv []string, timeout time.Duration, outHandler, errHandler collector) error {
+func run(name string, cmdv []string, timeout time.Duration, wg *sync.WaitGroup, outHandler, errHandler collector) error {
logger := logging.NewAdapter(name)
logger.Debugf("running command \"%v\"", cmdv)
@@ -76,6 +75,10 @@
return err
}
+ // at this point we're committed to running the log handlers so increment
+ // the waitgroup
+ wg.Add(2)
+
// Pass output to the handlers
go outHandler(bufio.NewScanner(outReader))
go errHandler(bufio.NewScanner(errReader))