/* This program tests skipping around in a multi-file journal. */
static bool arg_keep = false;
+static dual_timestamp previous_ts = {};
_noreturn_ static void log_assert_errno(const char *text, int error, const char *file, unsigned line, const char *func) {
log_internal(LOG_CRIT, error, file, line, func,
log_assert_errno(#expr, -_r_, PROJECT_FILE, __LINE__, __func__); \
} while (false)
-static ManagedJournalFile *test_open(const char *name) {
+static ManagedJournalFile *test_open_internal(const char *name, JournalFileFlags flags) {
_cleanup_(mmap_cache_unrefp) MMapCache *m = NULL;
ManagedJournalFile *f;
m = mmap_cache_new();
assert_se(m != NULL);
- assert_ret(managed_journal_file_open(-1, name, O_RDWR|O_CREAT, JOURNAL_COMPRESS, 0644, UINT64_MAX, NULL, m, NULL, NULL, &f));
+ assert_ret(managed_journal_file_open(-1, name, O_RDWR|O_CREAT, flags, 0644, UINT64_MAX, NULL, m, NULL, NULL, &f));
return f;
}
+static ManagedJournalFile *test_open(const char *name) {
+ return test_open_internal(name, JOURNAL_COMPRESS);
+}
+
+static ManagedJournalFile *test_open_strict(const char *name) {
+ return test_open_internal(name, JOURNAL_COMPRESS | JOURNAL_STRICT_ORDER);
+}
+
static void test_close(ManagedJournalFile *f) {
(void) managed_journal_file_close(f);
}
static void append_number(ManagedJournalFile *f, int n, const sd_id128_t *boot_id, uint64_t *seqnum) {
_cleanup_free_ char *p = NULL, *q = NULL;
dual_timestamp ts;
- static dual_timestamp previous_ts = {};
struct iovec iovec[2];
size_t n_iov = 0;
assert_ret(journal_file_append_entry(f->file, &ts, boot_id, iovec, n_iov, seqnum, NULL, NULL, NULL));
}
+static void append_unreferenced_data(ManagedJournalFile *f, const sd_id128_t *boot_id) {
+ _cleanup_free_ char *q = NULL;
+ dual_timestamp ts;
+ struct iovec iovec;
+
+ assert(boot_id);
+
+ ts.monotonic = usec_sub_unsigned(previous_ts.monotonic, 10);
+ ts.realtime = usec_sub_unsigned(previous_ts.realtime, 10);
+
+ assert_se(q = strjoin("_BOOT_ID=", SD_ID128_TO_STRING(*boot_id)));
+ iovec = IOVEC_MAKE_STRING(q);
+
+ assert_se(journal_file_append_entry(f->file, &ts, boot_id, &iovec, 1, NULL, NULL, NULL, NULL) == -EREMCHG);
+}
+
static void test_check_number(sd_journal *j, int n) {
sd_id128_t boot_id;
const void *d;
test_close(f3);
}
+static void setup_unreferenced_data(void) {
+ ManagedJournalFile *f1, *f2, *f3;
+ sd_id128_t id;
+
+ /* For issue #29275. */
+
+ f1 = test_open_strict("one.journal");
+ f2 = test_open_strict("two.journal");
+ f3 = test_open_strict("three.journal");
+ assert_se(sd_id128_randomize(&id) >= 0);
+ log_info("boot_id: %s", SD_ID128_TO_STRING(id));
+ append_number(f1, 1, &id, NULL);
+ append_number(f1, 2, &id, NULL);
+ append_number(f1, 3, &id, NULL);
+ assert_se(sd_id128_randomize(&id) >= 0);
+ log_info("boot_id: %s", SD_ID128_TO_STRING(id));
+ append_unreferenced_data(f1, &id);
+ append_number(f2, 4, &id, NULL);
+ append_number(f2, 5, &id, NULL);
+ append_number(f2, 6, &id, NULL);
+ assert_se(sd_id128_randomize(&id) >= 0);
+ log_info("boot_id: %s", SD_ID128_TO_STRING(id));
+ append_unreferenced_data(f2, &id);
+ append_number(f3, 7, &id, NULL);
+ append_number(f3, 8, &id, NULL);
+ append_number(f3, 9, &id, NULL);
+ test_close(f1);
+ test_close(f2);
+ test_close(f3);
+}
+
static void mkdtemp_chdir_chattr(char *path) {
assert_se(mkdtemp(path));
assert_se(chdir(path) >= 0);
TEST(boot_id) {
test_boot_id_one(setup_sequential, 3);
+ test_boot_id_one(setup_unreferenced_data, 3);
}
static void test_sequence_numbers_one(void) {