From cc94954f69ed2d26451bae6610b38de260d2252f Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 22 Dec 2016 01:32:20 -0500 Subject: [PATCH] 10585: Clean up defaults and error checks; release ticker when finished. --- services/crunchstat/crunchstat.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/services/crunchstat/crunchstat.go b/services/crunchstat/crunchstat.go index 510df3bac6..e71989afb8 100644 --- a/services/crunchstat/crunchstat.go +++ b/services/crunchstat/crunchstat.go @@ -16,8 +16,10 @@ import ( const MaxLogLine = 1 << 14 // Child stderr lines >16KiB will be split -var signalOnDeadPPID int -var ppidCheckInterval = time.Second +var ( + signalOnDeadPPID int = 15 + ppidCheckInterval = time.Second +) func main() { reporter := crunchstat.Reporter{ @@ -27,7 +29,7 @@ func main() { flag.StringVar(&reporter.CgroupRoot, "cgroup-root", "", "Root of cgroup tree") flag.StringVar(&reporter.CgroupParent, "cgroup-parent", "", "Name of container parent under cgroup") flag.StringVar(&reporter.CIDFile, "cgroup-cid", "", "Path to container id file") - flag.IntVar(&signalOnDeadPPID, "signal-on-dead-ppid", 15, "Signal to send child if crunchstat's parent process disappears") + flag.IntVar(&signalOnDeadPPID, "signal-on-dead-ppid", signalOnDeadPPID, "Signal to send child if crunchstat's parent process disappears (0 to disable)") flag.DurationVar(&ppidCheckInterval, "ppid-check-interval", ppidCheckInterval, "Time between checks for parent process disappearance") pollMsec := flag.Int64("poll", 1000, "Reporting interval, in milliseconds") @@ -35,6 +37,8 @@ func main() { if reporter.CgroupRoot == "" { reporter.Logger.Fatal("error: must provide -cgroup-root") + } else if signalOnDeadPPID < 0 { + reporter.Logger.Fatalf("-signal-on-dead-ppid=%d is invalid (use a positive signal number, or 0 to disable)", signalOnDeadPPID) } reporter.PollPeriod = time.Duration(*pollMsec) * time.Millisecond @@ -84,7 +88,7 @@ func runCommand(argv []string, logger *log.Logger) error { // Kill our child proc if our parent process disappears if signalOnDeadPPID != 0 { - go sendSignalOnDeadPPID(signalOnDeadPPID, os.Getppid(), cmd, logger) + go sendSignalOnDeadPPID(ppidCheckInterval, signalOnDeadPPID, os.Getppid(), cmd, logger) } // Funnel stderr through our channel @@ -107,8 +111,9 @@ func runCommand(argv []string, logger *log.Logger) error { return cmd.Wait() } -func sendSignalOnDeadPPID(signum, ppidOrig int, cmd *exec.Cmd, logger *log.Logger) { - for _ = range time.NewTicker(ppidCheckInterval).C { +func sendSignalOnDeadPPID(intvl time.Duration, signum, ppidOrig int, cmd *exec.Cmd, logger *log.Logger) { + ticker := time.NewTicker(intvl) + for _ = range ticker.C { ppid := os.Getppid() if ppid == ppidOrig { continue @@ -120,9 +125,10 @@ func sendSignalOnDeadPPID(signum, ppidOrig int, cmd *exec.Cmd, logger *log.Logge logger.Printf("notice: crunchstat ppid changed from %d to %d -- killing child pid %d with signal %d", ppidOrig, ppid, cmd.Process.Pid, signum) err := cmd.Process.Signal(syscall.Signal(signum)) if err != nil { - logger.Printf("error: sending signal: %d", err) + logger.Printf("error: sending signal: %s", err) continue } + ticker.Stop() break } } -- 2.30.2