From f10431fe2de1037c3c0d51d8238cecf6c1206703 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 4 May 2017 13:02:40 -0400 Subject: [PATCH] 8019: Use tl.stopping channel instead of tl.flush to signal Close. Use unbuffered channel to signal flush. --- services/crunch-run/logging.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/services/crunch-run/logging.go b/services/crunch-run/logging.go index 3aedf51779..96feb5faab 100644 --- a/services/crunch-run/logging.go +++ b/services/crunch-run/logging.go @@ -34,9 +34,10 @@ type ThrottledLogger struct { *log.Logger buf *bytes.Buffer sync.Mutex - writer io.WriteCloser - flush chan struct{} - stopped chan struct{} + writer io.WriteCloser + flush chan struct{} + stopped chan struct{} + stopping chan struct{} Timestamper Immediate *log.Logger pendingFlush bool @@ -97,9 +98,10 @@ func (tl *ThrottledLogger) flusher() { defer ticker.Stop() for stopping := false; !stopping; { select { - case _, open := <-tl.flush: - // if !open, will flush tl.buf and exit the loop - stopping = !open + case <-tl.stopping: + // flush tl.buf and exit the loop + stopping = true + case <-tl.flush: case <-ticker.C: } @@ -120,10 +122,10 @@ func (tl *ThrottledLogger) flusher() { // underlying Writer. func (tl *ThrottledLogger) Close() error { select { - case <-tl.flush: + case <-tl.stopping: // already stopped default: - close(tl.flush) + close(tl.stopping) } <-tl.stopped return tl.writer.Close() @@ -173,8 +175,9 @@ func ReadWriteLines(in io.Reader, writer io.Writer, done chan<- bool) { // at most once per "crunchLogSecondsBetweenEvents" seconds. func NewThrottledLogger(writer io.WriteCloser) *ThrottledLogger { tl := &ThrottledLogger{} - tl.flush = make(chan struct{}, 1) + tl.flush = make(chan struct{}) tl.stopped = make(chan struct{}) + tl.stopping = make(chan struct{}) tl.writer = writer tl.Logger = log.New(tl, "", 0) tl.Timestamper = RFC3339Timestamp -- 2.30.2