mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
log: simplify fix for datarace when rotating files
This commit is contained in:
parent
7e30ab3e6b
commit
ec192798b8
1 changed files with 24 additions and 31 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue