From caaed7c515cafa320651c525fa5a37a78daec132 Mon Sep 17 00:00:00 2001 From: mmetc <92726601+mmetc@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:03:15 +0200 Subject: [PATCH] Timeout on shutdown while waiting for events to be flushed (#2423) --- cmd/crowdsec/serve.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cmd/crowdsec/serve.go b/cmd/crowdsec/serve.go index ad61d781e..8513e0046 100644 --- a/cmd/crowdsec/serve.go +++ b/cmd/crowdsec/serve.go @@ -141,12 +141,24 @@ func ShutdownCrowdsecRoutines() error { time.Sleep(1 * time.Second) // ugly workaround for now outputsTomb.Kill(nil) - if err := outputsTomb.Wait(); err != nil { - log.Warningf("Ouputs returned error : %s", err) - reterr = err + done := make(chan error, 1) + go func() { + done <- outputsTomb.Wait() + }() + + // wait for outputs to finish, max 3 seconds + select { + case err := <-done: + if err != nil { + log.Warningf("Outputs returned error : %s", err) + reterr = err + } + log.Debugf("outputs are done") + case <-time.After(3 * time.Second): + // this can happen if outputs are stuck in a http retry loop + log.Warningf("Outputs didn't finish in time, some events may have not been flushed") } - log.Debugf("outputs are done") // He's dead, Jim. crowdsecTomb.Kill(nil)