From 9617a6ec3c4d1ab4978cc6f823a38bfc5a7c43df Mon Sep 17 00:00:00 2001 From: YACOVM Date: Tue, 27 Sep 2016 13:46:59 +0300 Subject: [PATCH] Urgent logging fix for gossip This is an urgent logging fix to a bug that might break gossip tests. in op/go-logging/backend.go, the log invokes IsEnabledFor which goes to a global field defaultBackend that IsEnabledFor method for that global field invokes GetLevel which reads from a map. If a logger is initalized at the same time another goroutine reads from the map, a concurrent read-write would occur and will result in panic. Change-Id: Ief788f3da722aa38b7c743179d6dd1a1dc60936a Signed-off-by: Yacov Manevich --- gossip/util/logging.go | 67 +++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/gossip/util/logging.go b/gossip/util/logging.go index 7ca274c693a..99d23ac1a78 100644 --- a/gossip/util/logging.go +++ b/gossip/util/logging.go @@ -43,7 +43,6 @@ func init() { } type Logger struct { - lock *sync.Mutex logger logging.Logger module string } @@ -79,7 +78,7 @@ func GetLogger(module string, peerId string) *Logger { return nil } logging.SetLevel(lvl, module) - lgr := &Logger{lock: &sync.Mutex{}} + lgr := &Logger{} lgr.logger = *logging.MustGetLogger(module) lgr.logger.ExtraCalldepth++ lgr.module = module @@ -88,97 +87,97 @@ func GetLogger(module string, peerId string) *Logger { } func (l *Logger) Fatal(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Fatal(args) } func (l *Logger) Fatalf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Fatalf(format, args) } func (l *Logger) Panic(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Panic(args) } func (l *Logger) Panicf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Panicf(format, args) } func (l *Logger) Critical(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Critical(args) } func (l *Logger) Criticalf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Criticalf(format, args) } func (l *Logger) Error(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Error(args) } func (l *Logger) Errorf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Errorf(format, args) } func (l *Logger) Warning(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Warning(args) } func (l *Logger) Warningf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Warningf(format, args) } func (l *Logger) Notice(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Notice(args) } func (l *Logger) Noticef(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Noticef(format, args) } func (l *Logger) Info(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Info(args) } func (l *Logger) Infof(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Infof(format, args) } func (l *Logger) Debug(args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Debug(args) } func (l *Logger) Debugf(format string, args ...interface{}) { - l.lock.Lock() - defer l.lock.Unlock() + lock.Lock() + defer lock.Unlock() l.logger.Debugf(format, args) }