You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.6 KiB
59 lines
2.6 KiB
From 98169577b83b45a40105cf58e6cffe0272074817 Mon Sep 17 00:00:00 2001 |
|
From: Peter Portante <peter.a.portante@gmail.com> |
|
Date: Sun, 28 Jan 2018 16:48:04 -0500 |
|
Subject: [PATCH] journalctl: Periodically call sd_journal_process in |
|
journalctl |
|
|
|
If `journalctl` take a long time to process messages, and during that |
|
time journal file rotation occurs, a `journalctl` client will keep |
|
those rotated files open until it calls `sd_journal_process()`, which |
|
typically happens as a result of calling `sd_journal_wait()` below in |
|
the "following" case. By periodically calling `sd_journal_process()` |
|
during the processing loop we shrink the window of time a client |
|
instance has open file descriptors for rotated (deleted) journal |
|
files. |
|
|
|
(Lennart: slightly reworked version, that dropped some of the commenting |
|
which was solved otherwise) |
|
|
|
(cherry picked from commit ec316d199a13d8db3f6550d60e369893de2fb417) |
|
|
|
Related: #1540538 |
|
--- |
|
src/journal/journalctl.c | 16 ++++++++++++++++ |
|
1 file changed, 16 insertions(+) |
|
|
|
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c |
|
index 0be70764e..1e6d0761c 100644 |
|
--- a/src/journal/journalctl.c |
|
+++ b/src/journal/journalctl.c |
|
@@ -67,6 +67,8 @@ |
|
|
|
#define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE) |
|
|
|
+#define PROCESS_INOTIFY_INTERVAL 1024 /* Every 1,024 messages processed */ |
|
+ |
|
enum { |
|
/* Special values for arg_lines */ |
|
ARG_LINES_DEFAULT = -2, |
|
@@ -2294,6 +2296,20 @@ int main(int argc, char *argv[]) { |
|
goto finish; |
|
|
|
n_shown++; |
|
+ |
|
+ /* If journalctl take a long time to process messages, and during that time journal file |
|
+ * rotation occurs, a journalctl client will keep those rotated files open until it calls |
|
+ * sd_journal_process(), which typically happens as a result of calling sd_journal_wait() below |
|
+ * in the "following" case. By periodically calling sd_journal_process() during the processing |
|
+ * loop we shrink the window of time a client instance has open file descriptors for rotated |
|
+ * (deleted) journal files. */ |
|
+ if ((n_shown % PROCESS_INOTIFY_INTERVAL) == 0) { |
|
+ r = sd_journal_process(j); |
|
+ if (r < 0) { |
|
+ log_error_errno(r, "Failed to process inotify events: %m"); |
|
+ goto finish; |
|
+ } |
|
+ } |
|
} |
|
|
|
if (!arg_follow) {
|
|
|