Blob Blame History Raw
diff -up ./plugins/imjournal/imjournal.c.journal ./plugins/imjournal/imjournal.c
--- ./plugins/imjournal/imjournal.c.journal	2017-03-13 14:38:11.820000000 +0100
+++ ./plugins/imjournal/imjournal.c	2017-03-13 14:45:16.006000000 +0100
@@ -115,6 +115,25 @@ static const char *pid_field_name;	/* re
 static ratelimit_t *ratelimiter = NULL;
 static sd_journal *j;
 
+static rsRetVal persistJournalState(void);
+static rsRetVal loadJournalState(void);
+
+static rsRetVal openJournal(sd_journal** jj) {
+	DEFiRet;
+
+	if (sd_journal_open(jj, SD_JOURNAL_LOCAL_ONLY) < 0)
+		iRet = RS_RET_IO_ERROR;
+	RETiRet;
+}
+
+static void closeJournal(sd_journal** jj) {
+
+	if (cs.stateFile) { /* can't persist without a state file */
+		persistJournalState();
+	}
+	sd_journal_close(*jj);
+}
+
 
 /* ugly workaround to handle facility numbers; values
  * derived from names need to be eight times smaller,
@@ -436,20 +455,25 @@ persistJournalState (void)
 }
 
 
+static rsRetVal skipOldMessages(void);
 /* Polls the journal for new messages. Similar to sd_journal_wait()
  * except for the special handling of EINTR.
  */
+
+#define POLL_TIMEOUT 1000 /* timeout for poll is 1s */
+
 static rsRetVal
 pollJournal(void)
 {
 	DEFiRet;
 	struct pollfd pollfd;
-	int r;
+	int pr = 0;
+	int jr = 0;
 
 	pollfd.fd = sd_journal_get_fd(j);
 	pollfd.events = sd_journal_get_events(j);
-	r = poll(&pollfd, 1, -1);
-	if (r == -1) {
+	pr = poll(&pollfd, 1, POLL_TIMEOUT);
+	if (pr == -1) {
 		if (errno == EINTR) {
 			/* EINTR is also received during termination
 			 * so return now to check the term state.
@@ -465,12 +489,30 @@ pollJournal(void)
 		}
 	}
 
-	assert(r == 1);
 
-	r = sd_journal_process(j);
-	if (r < 0) {
-		char errStr[256];
+	jr = sd_journal_process(j);
+	
+	if (pr == 1 && jr == SD_JOURNAL_INVALIDATE) {
+		/* do not persist stateFile sd_journal_get_cursor will fail! */
+		char* tmp = cs.stateFile;
+		cs.stateFile = NULL;
+		closeJournal(&j);
+		cs.stateFile = tmp;
+
+		iRet = openJournal(&j);
+		if (iRet != RS_RET_OK) {
+			char errStr[256];
+			rs_strerror_r(errno, errStr, sizeof(errStr));
+			errmsg.LogError(0, RS_RET_IO_ERROR,
+				"sd_journal_open() failed: '%s'", errStr);
+			ABORT_FINALIZE(RS_RET_ERR);
+		}
 
+		iRet = loadJournalState();
+		errmsg.LogError(0, RS_RET_OK, "imjournal: "
+			"journal reloaded...");	
+	} else if (jr < 0) {
+		char errStr[256];
 		rs_strerror_r(errno, errStr, sizeof(errStr));
 		errmsg.LogError(0, RS_RET_ERR,
 			"sd_journal_process() failed: '%s'", errStr);
@@ -694,20 +736,13 @@ ENDfreeCnf
 /* open journal */
 BEGINwillRun
 CODESTARTwillRun
-	int ret;
-	ret = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
-	if (ret < 0) {
-		iRet = RS_RET_IO_ERROR;
-	}
+	iRet = openJournal(&j);
 ENDwillRun
 
 /* close journal */
 BEGINafterRun
 CODESTARTafterRun
-	if (cs.stateFile) { /* can't persist without a state file */
-		persistJournalState();
-	}
-	sd_journal_close(j);
+	closeJournal(&j);
 	ratelimitDestruct(ratelimiter);
 ENDafterRun