diff --git a/daemon/logger/journald/read.go b/daemon/logger/journald/read.go index 03b0dbeeae..49e4e1b8ae 100644 --- a/daemon/logger/journald/read.go +++ b/daemon/logger/journald/read.go @@ -224,8 +224,6 @@ drain: } func (s *journald) followJournal(logWatcher *logger.LogWatcher, j *C.sd_journal, cursor *C.char, untilUnixMicro uint64) *C.char { - defer close(logWatcher.Msg) - waitTimeout := C.uint64_t(250000) // 0.25s LOOP: @@ -265,6 +263,9 @@ func (s *journald) readLogs(logWatcher *logger.LogWatcher, config logger.ReadCon sinceUnixMicro uint64 untilUnixMicro uint64 ) + + defer close(logWatcher.Msg) + // Quoting https://www.freedesktop.org/software/systemd/man/sd-journal.html: // Functions that operate on sd_journal objects are thread // agnostic — given sd_journal pointer may only be used from one @@ -277,28 +278,18 @@ func (s *journald) readLogs(logWatcher *logger.LogWatcher, config logger.ReadCon // Get a handle to the journal. if rc := C.sd_journal_open(&j, C.int(0)); rc != 0 { logWatcher.Err <- errors.New("error opening journal: " + CErr(rc)) - close(logWatcher.Msg) return } + defer C.sd_journal_close(j) + if config.Follow { // Initialize library inotify watches early if rc := C.sd_journal_get_fd(j); rc < 0 { logWatcher.Err <- errors.New("error getting journald fd: " + CErr(rc)) - close(logWatcher.Msg) return } } - // If we end up following the log, we can set the journal context - // pointer and the channel pointer to nil so that we won't close them - // here, potentially while the goroutine that uses them is still - // running. Otherwise, close them when we return from this function. - following := false - defer func() { - if !following { - close(logWatcher.Msg) - } - C.sd_journal_close(j) - }() + // Remove limits on the size of data items that we'll retrieve. if rc := C.sd_journal_set_data_threshold(j, C.size_t(0)); rc != 0 { logWatcher.Err <- errors.New("error setting journal data threshold: " + CErr(rc)) @@ -365,11 +356,7 @@ func (s *journald) readLogs(logWatcher *logger.LogWatcher, config logger.ReadCon } if config.Follow { cursor = s.followJournal(logWatcher, j, cursor, untilUnixMicro) - // Let followJournal handle freeing the journal context - // object and closing the channel. - following = true } - C.free(unsafe.Pointer(cursor)) }