mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
fix a race in json logger reader
The json decoder starts to decode immediately an inotify event is received. But at the time the inotify event is trigged, the json log entry might haven't been fully written to the disk. In this case the decoder will return an "io.UnexpectedEOF" error, but there is still data remaining in the decoder's buffer. And the data should be passed to the decoder when the next inotify event is triggered. Signed-off-by: Shijiang Wei <mountkin@gmail.com>
This commit is contained in:
parent
c545dce004
commit
e41eae8b42
1 changed files with 11 additions and 0 deletions
|
@ -357,6 +357,17 @@ func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan int
|
|||
retries++
|
||||
continue
|
||||
}
|
||||
|
||||
// io.ErrUnexpectedEOF is returned from json.Decoder when there is
|
||||
// remaining data in the parser's buffer while an io.EOF occurs.
|
||||
// If the json logger writes a partial json log entry to the disk
|
||||
// while at the same time the decoder tries to decode it, the race codition happens.
|
||||
if err == io.ErrUnexpectedEOF && retries <= maxJSONDecodeRetry {
|
||||
reader := io.MultiReader(dec.Buffered(), f)
|
||||
dec = json.NewDecoder(reader)
|
||||
retries++
|
||||
continue
|
||||
}
|
||||
logWatcher.Err <- err
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue