summaryrefslogtreecommitdiffstats
path: root/src/libsystemd/sd-journal/test-journal-flush.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd/sd-journal/test-journal-flush.c')
-rw-r--r--src/libsystemd/sd-journal/test-journal-flush.c92
1 files changed, 87 insertions, 5 deletions
diff --git a/src/libsystemd/sd-journal/test-journal-flush.c b/src/libsystemd/sd-journal/test-journal-flush.c
index 3f07835..b06645a 100644
--- a/src/libsystemd/sd-journal/test-journal-flush.c
+++ b/src/libsystemd/sd-journal/test-journal-flush.c
@@ -7,6 +7,8 @@
#include "alloc-util.h"
#include "chattr-util.h"
+#include "dirent-util.h"
+#include "fd-util.h"
#include "journal-file-util.h"
#include "journal-internal.h"
#include "logs-show.h"
@@ -17,6 +19,83 @@
#include "tests.h"
#include "tmpfile-util.h"
+static int open_archive_file(sd_journal **ret) {
+ _cleanup_closedir_ DIR *d = NULL;
+ _cleanup_close_ int newest_fd = -EBADF;
+ unsigned long long newest_realtime = 0;
+ bool newest_is_system = false;
+ sd_id128_t machine_id;
+ const char *p;
+ int r;
+
+ r = sd_id128_get_machine(&machine_id);
+ if (r < 0)
+ return r;
+
+ p = strjoina("/var/log/journal/", SD_ID128_TO_STRING(machine_id), "/");
+
+ d = opendir(p);
+ if (!d)
+ return -errno;
+
+ FOREACH_DIRENT_ALL(de, d, return -errno) {
+ unsigned long long realtime;
+ bool is_system;
+ size_t q;
+ int fd;
+
+ if (!dirent_is_file_with_suffix(de, ".journal"))
+ continue;
+
+ is_system = startswith(de->d_name, "system@");
+ if (newest_is_system && !is_system)
+ continue;
+
+ q = strlen(de->d_name);
+
+ if (q < 1 + 32 + 1 + 16 + 1 + 16 + 8)
+ continue;
+
+ if (de->d_name[q-8-16-1] != '-' ||
+ de->d_name[q-8-16-1-16-1] != '-' ||
+ de->d_name[q-8-16-1-16-1-32-1] != '@')
+ continue;
+
+ if (sscanf(de->d_name + q-8-16, "%16llx.journal", &realtime) != 1)
+ continue;
+
+ if (newest_realtime >= realtime)
+ continue;
+
+ fd = openat(dirfd(d), de->d_name, O_CLOEXEC | O_NONBLOCK | O_RDONLY);
+ if (fd < 0) {
+ log_info_errno(errno, "Failed to open /var/log/journal/%s, ignoring: %m", de->d_name);
+ continue;
+ }
+
+ close_and_replace(newest_fd, fd);
+ newest_realtime = realtime;
+ newest_is_system = is_system;
+ }
+
+ if (newest_fd < 0)
+ return log_info_errno(SYNTHETIC_ERRNO(ENOENT), "No archive journal found.");
+
+ r = sd_journal_open_files_fd(ret, &newest_fd, 1, SD_JOURNAL_ASSUME_IMMUTABLE);
+
+ _cleanup_free_ char *path = NULL;
+ (void) fd_get_path(newest_fd, &path);
+
+ if (r < 0)
+ log_info_errno(r, "Failed to open %s, ignoring: %m", strna(path));
+ else {
+ log_info("Opened %s.", strna(path));
+ TAKE_FD(newest_fd);
+ }
+
+ return r;
+}
+
static void test_journal_flush_one(int argc, char *argv[]) {
_cleanup_(mmap_cache_unrefp) MMapCache *m = NULL;
_cleanup_free_ char *fn = NULL;
@@ -32,13 +111,16 @@ static void test_journal_flush_one(int argc, char *argv[]) {
assert_se(fn = path_join(dn, "test.journal"));
- r = journal_file_open(-1, fn, O_CREAT|O_RDWR, 0, 0644, 0, NULL, m, NULL, &new_journal);
+ r = journal_file_open(-EBADF, fn, O_CREAT|O_RDWR, 0, 0644, 0, NULL, m, NULL, &new_journal);
assert_se(r >= 0);
if (argc > 1)
- r = sd_journal_open_files(&j, (const char **) strv_skip(argv, 1), 0);
- else
- r = sd_journal_open(&j, 0);
+ r = sd_journal_open_files(&j, (const char **) strv_skip(argv, 1), SD_JOURNAL_ASSUME_IMMUTABLE);
+ else {
+ r = open_archive_file(&j);
+ if (r < 0)
+ r = sd_journal_open(&j, SD_JOURNAL_ASSUME_IMMUTABLE);
+ }
assert_se(r == 0);
sd_journal_set_data_threshold(j, 0);
@@ -75,7 +157,7 @@ static void test_journal_flush_one(int argc, char *argv[]) {
/* Open the new journal before archiving and offlining the file. */
sd_journal_close(j);
- assert_se(sd_journal_open_directory(&j, dn, 0) >= 0);
+ assert_se(sd_journal_open_directory(&j, dn, SD_JOURNAL_ASSUME_IMMUTABLE) >= 0);
/* Read the online journal. */
assert_se(sd_journal_seek_tail(j) >= 0);