From 472c2d828c586e5458e93627f54ca6d966b27fcf Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Sat, 19 Mar 2022 09:15:45 -0700 Subject: [PATCH] Fix waitgroup add after wait on config reload (#14584) Fix `panic: "POST /minio/peer/v21/signalservice?signal=2": sync: WaitGroup is reused before previous Wait has returned` Log entries already on the channel would cause `logEntry` to increment the waitgroup when sending messages, after Cancel has been called. Instead of tracking every single message, just check the send goroutine. Faster and safe, since it will not decrement until the channel is closed. Regression from #14289 --- internal/logger/target/http/http.go | 5 ++--- internal/logger/target/kafka/kafka.go | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/internal/logger/target/http/http.go b/internal/logger/target/http/http.go index f811965a6..56b18661b 100644 --- a/internal/logger/target/http/http.go +++ b/internal/logger/target/http/http.go @@ -128,9 +128,6 @@ func acceptedResponseStatusCode(code int) bool { } func (h *Target) logEntry(entry interface{}) { - h.wg.Add(1) - defer h.wg.Done() - logJSON, err := json.Marshal(&entry) if err != nil { return @@ -181,6 +178,8 @@ func (h *Target) startHTTPLogger() { // Create a routine which sends json logs received // from an internal channel. go func() { + h.wg.Add(1) + defer h.wg.Done() for entry := range h.logCh { h.logEntry(entry) } diff --git a/internal/logger/target/kafka/kafka.go b/internal/logger/target/kafka/kafka.go index 08003a4d0..39f63a87c 100644 --- a/internal/logger/target/kafka/kafka.go +++ b/internal/logger/target/kafka/kafka.go @@ -27,7 +27,7 @@ import ( "sync" "sync/atomic" - sarama "github.com/Shopify/sarama" + "github.com/Shopify/sarama" saramatls "github.com/Shopify/sarama/tools/tls" "github.com/minio/minio/internal/logger/message/audit" @@ -62,9 +62,6 @@ func (h *Target) Send(entry interface{}, errKind string) error { } func (h *Target) logEntry(entry interface{}) { - h.wg.Add(1) - defer h.wg.Done() - logJSON, err := json.Marshal(&entry) if err != nil { return @@ -90,6 +87,8 @@ func (h *Target) startKakfaLogger() { // Create a routine which sends json logs received // from an internal channel. go func() { + h.wg.Add(1) + defer h.wg.Done() for entry := range h.logCh { h.logEntry(entry) }