Parcourir la source

split goroutine shutdown code

Thibault bui Koechlin il y a 5 ans
Parent
commit
e9c16ee064
1 fichiers modifiés avec 31 ajouts et 2 suppressions
  1. 31 2
      cmd/crowdsec/serve.go

+ 31 - 2
cmd/crowdsec/serve.go

@@ -6,6 +6,7 @@ import (
 	"syscall"
 	"time"
 
+	leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket"
 	"github.com/crowdsecurity/crowdsec/pkg/outputs"
 	log "github.com/sirupsen/logrus"
 
@@ -13,33 +14,61 @@ import (
 )
 
 func reloadHandler(sig os.Signal) error {
+
+	//stop go routines
+	if err := ShutdownRoutines(); err != nil {
+		log.Errorf("Failed to shut down routines: %s", err)
+	}
+	//dump buckets state
+	if err := leaky.DumpBucketsStateAt("buckets_state.json", time.Now(), buckets); err != nil {
+		log.Fatalf("Failed dumping bucket state : %s", err)
+	}
+	//reload configurations
+
+	//restore bucket state
+	//start processing routines
+	//start acquis routine
+
+	log.Printf("reloading")
 	dumpMetrics()
 	return nil
 }
 
-func termHandler(sig os.Signal) error {
-	log.Warningf("Shutting down routines")
+func ShutdownRoutines() error {
+	var reterr error
 
 	acquisTomb.Kill(nil)
 	log.Infof("waiting for acquisition to finish")
 	if err := acquisTomb.Wait(); err != nil {
 		log.Warningf("Acquisition returned error : %s", err)
+		reterr = err
 	}
 	log.Infof("acquisition is finished, wait for parser/bucket/ouputs.")
 	parsersTomb.Kill(nil)
 	if err := parsersTomb.Wait(); err != nil {
 		log.Warningf("Parsers returned error : %s", err)
+		reterr = err
 	}
 	log.Infof("parsers is done")
 	bucketsTomb.Kill(nil)
 	if err := bucketsTomb.Wait(); err != nil {
 		log.Warningf("Buckets returned error : %s", err)
+		reterr = err
 	}
 	log.Infof("buckets is done")
 	outputsTomb.Kill(nil)
 	if err := outputsTomb.Wait(); err != nil {
 		log.Warningf("Ouputs returned error : %s", err)
+		reterr = err
+
+	}
+	return reterr
+}
 
+func termHandler(sig os.Signal) error {
+	log.Warningf("Shutting down routines")
+	if err := ShutdownRoutines(); err != nil {
+		log.Warningf("Error encountered while shutting down routines : %s", err)
 	}
 	log.Infof("ouputs is done")
 	dumpMetrics()