mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
journald logs: drain 1 more time at container exit
In the journald log driver, attempt to drain the journal 1 more time after being told to stop following the log. Due to a possible race condition, sometimes data is written to the journal at almost the same time the log watch is closed, and depending on the order of operations, sometimes you miss the last journal entry. Signed-off-by: Andy Goldstein <agoldste@redhat.com>
This commit is contained in:
parent
e9c0de0de6
commit
76f58d7294
1 changed files with 20 additions and 11 deletions
|
@ -245,20 +245,28 @@ func (s *journald) followJournal(logWatcher *logger.LogWatcher, config logger.Re
|
||||||
s.readers.mu.Lock()
|
s.readers.mu.Lock()
|
||||||
s.readers.readers[logWatcher] = logWatcher
|
s.readers.readers[logWatcher] = logWatcher
|
||||||
s.readers.mu.Unlock()
|
s.readers.mu.Unlock()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
// Keep copying journal data out until we're notified to stop
|
for {
|
||||||
// or we hit an error.
|
// Keep copying journal data out until we're notified to stop
|
||||||
status := C.wait_for_data_cancelable(j, pfd[0])
|
// or we hit an error.
|
||||||
for status == 1 {
|
status := C.wait_for_data_cancelable(j, pfd[0])
|
||||||
|
if status < 0 {
|
||||||
|
cerrstr := C.strerror(C.int(-status))
|
||||||
|
errstr := C.GoString(cerrstr)
|
||||||
|
fmtstr := "error %q while attempting to follow journal for container %q"
|
||||||
|
logrus.Errorf(fmtstr, errstr, s.vars["CONTAINER_ID_FULL"])
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
cursor = s.drainJournal(logWatcher, config, j, cursor)
|
cursor = s.drainJournal(logWatcher, config, j, cursor)
|
||||||
status = C.wait_for_data_cancelable(j, pfd[0])
|
|
||||||
}
|
if status != 1 {
|
||||||
if status < 0 {
|
// We were notified to stop
|
||||||
cerrstr := C.strerror(C.int(-status))
|
break
|
||||||
errstr := C.GoString(cerrstr)
|
}
|
||||||
fmtstr := "error %q while attempting to follow journal for container %q"
|
|
||||||
logrus.Errorf(fmtstr, errstr, s.vars["CONTAINER_ID_FULL"])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up.
|
// Clean up.
|
||||||
C.close(pfd[0])
|
C.close(pfd[0])
|
||||||
s.readers.mu.Lock()
|
s.readers.mu.Lock()
|
||||||
|
@ -267,6 +275,7 @@ func (s *journald) followJournal(logWatcher *logger.LogWatcher, config logger.Re
|
||||||
C.sd_journal_close(j)
|
C.sd_journal_close(j)
|
||||||
close(logWatcher.Msg)
|
close(logWatcher.Msg)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Wait until we're told to stop.
|
// Wait until we're told to stop.
|
||||||
select {
|
select {
|
||||||
case <-logWatcher.WatchClose():
|
case <-logWatcher.WatchClose():
|
||||||
|
|
Loading…
Add table
Reference in a new issue