log: simplify fix for datarace when rotating files

This commit is contained in:
Martin Holst Swende 2019-06-13 19:34:38 +02:00
parent 7e30ab3e6b
commit ec192798b8
No known key found for this signature in database
GPG key ID: 683B438C05A5DDF0

View file

@ -158,17 +158,10 @@ func RotatingFileHandler(path string, limit uint, formatter Format) (Handler, er
if counter == nil { if counter == nil {
counter = new(countingWriter) counter = new(countingWriter)
} }
h := FuncHandler(func(r *Record) error { h := StreamHandler(counter, formatter)
_, err := counter.Write(formatter.Format(r))
return err
})
return FuncHandler(func(r *Record) error { return FuncHandler(func(r *Record) error {
// lazy evaluate, this needs no lock.
lazyEvaluateRecord(r)
counter.Lock() counter.Lock()
defer counter.Unlock()
if counter.count > limit { if counter.count > limit {
counter.Close() counter.Close()
counter.w = nil counter.w = nil
@ -180,11 +173,13 @@ func RotatingFileHandler(path string, limit uint, formatter Format) (Handler, er
0600, 0600,
) )
if err != nil { if err != nil {
counter.Unlock()
return err return err
} }
counter.w = f counter.w = f
counter.count = 0 counter.count = 0
} }
counter.Unlock()
return h.Log(r) return h.Log(r)
}), nil }), nil
} }
@ -392,17 +387,12 @@ func BufferedHandler(bufSize int, h Handler) Handler {
// it if you write your own Handler. // it if you write your own Handler.
func LazyHandler(h Handler) Handler { func LazyHandler(h Handler) Handler {
return FuncHandler(func(r *Record) error { return FuncHandler(func(r *Record) error {
lazyEvaluateRecord(r)
return h.Log(r)
})
}
func lazyEvaluateRecord(r *Record) {
// go through the values (odd indices) and reassign // go through the values (odd indices) and reassign
// the values of any lazy fn to the result of its execution // the values of any lazy fn to the result of its execution
hadErr := false hadErr := false
for i := 1; i < len(r.Ctx); i += 2 { for i := 1; i < len(r.Ctx); i += 2 {
if lz, ok := r.Ctx[i].(Lazy); ok { lz, ok := r.Ctx[i].(Lazy)
if ok {
v, err := evaluateLazy(lz) v, err := evaluateLazy(lz)
if err != nil { if err != nil {
hadErr = true hadErr = true
@ -419,6 +409,9 @@ func lazyEvaluateRecord(r *Record) {
if hadErr { if hadErr {
r.Ctx = append(r.Ctx, errorKey, "bad lazy") r.Ctx = append(r.Ctx, errorKey, "bad lazy")
} }
return h.Log(r)
})
} }
func evaluateLazy(lz Lazy) (interface{}, error) { func evaluateLazy(lz Lazy) (interface{}, error) {