Browse Source

logger/journald: simplify control flow

Signed-off-by: Cory Snider <csnider@mirantis.com>
Cory Snider 3 years ago
parent
commit
7ff4b64319
1 changed files with 6 additions and 19 deletions
  1. 6 19
      daemon/logger/journald/read.go

+ 6 - 19
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))
 }