#include "io-util.h"
#include "journal-vacuum.h"
#include "log.h"
+#include "logs-show.h"
#include "managed-journal-file.h"
#include "parse-util.h"
#include "rm-rf.h"
(void) managed_journal_file_close(f);
}
-static void append_number(ManagedJournalFile *f, int n, uint64_t *seqnum) {
- char *p;
+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[1];
+ struct iovec iovec[2];
+ size_t n_iov = 0;
dual_timestamp_get(&ts);
previous_ts = ts;
assert_se(asprintf(&p, "NUMBER=%d", n) >= 0);
- iovec[0] = IOVEC_MAKE_STRING(p);
- assert_ret(journal_file_append_entry(f->file, &ts, NULL, iovec, 1, seqnum, NULL, NULL, NULL));
- free(p);
+ iovec[n_iov++] = IOVEC_MAKE_STRING(p);
+
+ if (boot_id) {
+ assert_se(q = strjoin("_BOOT_ID=", SD_ID128_TO_STRING(*boot_id)));
+ iovec[n_iov++] = IOVEC_MAKE_STRING(q);
+ }
+
+ assert_ret(journal_file_append_entry(f->file, &ts, boot_id, iovec, n_iov, seqnum, NULL, NULL, NULL));
}
static void test_check_number(sd_journal *j, int n) {
+ sd_id128_t boot_id;
const void *d;
_cleanup_free_ char *k = NULL;
size_t l;
int x;
+ assert_se(sd_journal_get_monotonic_usec(j, NULL, &boot_id) >= 0);
assert_ret(sd_journal_get_data(j, "NUMBER", &d, &l));
assert_se(k = strndup(d, l));
- printf("%s (expected=%i)\n", k, n);
+ printf("%s %s (expected=%i)\n", SD_ID128_TO_STRING(boot_id), k, n);
assert_se(safe_atoi(k + STRLEN("NUMBER="), &x) >= 0);
assert_se(n == x);
static void setup_sequential(void) {
ManagedJournalFile *f1, *f2, *f3;
+ sd_id128_t id;
f1 = test_open("one.journal");
f2 = test_open("two.journal");
f3 = test_open("three.journal");
- append_number(f1, 1, NULL);
- append_number(f1, 2, NULL);
- append_number(f1, 3, NULL);
- append_number(f2, 4, NULL);
- append_number(f2, 5, NULL);
- append_number(f2, 6, NULL);
- append_number(f3, 7, NULL);
- append_number(f3, 8, NULL);
- append_number(f3, 9, NULL);
+ 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);
+ append_number(f2, 4, &id, NULL);
+ assert_se(sd_id128_randomize(&id) >= 0);
+ log_info("boot_id: %s", SD_ID128_TO_STRING(id));
+ append_number(f2, 5, &id, NULL);
+ append_number(f2, 6, &id, NULL);
+ append_number(f3, 7, &id, NULL);
+ append_number(f3, 8, &id, NULL);
+ assert_se(sd_id128_randomize(&id) >= 0);
+ log_info("boot_id: %s", SD_ID128_TO_STRING(id));
+ append_number(f3, 9, &id, NULL);
test_close(f1);
test_close(f2);
test_close(f3);
static void setup_interleaved(void) {
ManagedJournalFile *f1, *f2, *f3;
+ sd_id128_t id;
f1 = test_open("one.journal");
f2 = test_open("two.journal");
f3 = test_open("three.journal");
- append_number(f1, 1, NULL);
- append_number(f2, 2, NULL);
- append_number(f3, 3, NULL);
- append_number(f1, 4, NULL);
- append_number(f2, 5, NULL);
- append_number(f3, 6, NULL);
- append_number(f1, 7, NULL);
- append_number(f2, 8, NULL);
- append_number(f3, 9, NULL);
+ 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(f2, 2, &id, NULL);
+ append_number(f3, 3, &id, NULL);
+ append_number(f1, 4, &id, NULL);
+ append_number(f2, 5, &id, NULL);
+ append_number(f3, 6, &id, NULL);
+ append_number(f1, 7, &id, NULL);
+ append_number(f2, 8, &id, NULL);
+ append_number(f3, 9, &id, NULL);
test_close(f1);
test_close(f2);
test_close(f3);
test_skip_one(setup_interleaved);
}
+static void test_boot_id_one(void (*setup)(void), size_t n_boots_expected) {
+ char t[] = "/var/tmp/journal-boot-id-XXXXXX";
+ sd_journal *j;
+ _cleanup_free_ BootId *boots = NULL;
+ size_t n_boots;
+
+ mkdtemp_chdir_chattr(t);
+
+ setup();
+
+ assert_ret(sd_journal_open_directory(&j, t, 0));
+ assert_se(journal_get_boots(j, &boots, &n_boots) >= 0);
+ assert_se(boots);
+ assert_se(n_boots == n_boots_expected);
+ sd_journal_close(j);
+
+ FOREACH_ARRAY(b, boots, n_boots) {
+ assert_ret(sd_journal_open_directory(&j, t, 0));
+ assert_se(journal_find_boot_by_id(j, b->id) == 1);
+ sd_journal_close(j);
+ }
+
+ for (int i = - (int) n_boots + 1; i <= (int) n_boots; i++) {
+ sd_id128_t id;
+
+ assert_ret(sd_journal_open_directory(&j, t, 0));
+ assert_se(journal_find_boot_by_offset(j, i, &id) == 1);
+ if (i <= 0)
+ assert_se(sd_id128_equal(id, boots[n_boots + i - 1].id));
+ else
+ assert_se(sd_id128_equal(id, boots[i - 1].id));
+ sd_journal_close(j);
+ }
+
+ log_info("Done...");
+
+ if (arg_keep)
+ log_info("Not removing %s", t);
+ else {
+ journal_directory_vacuum(".", 3000000, 0, 0, NULL, true);
+
+ assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0);
+ }
+
+ puts("------------------------------------------------------------");
+}
+
+TEST(boot_id) {
+ test_boot_id_one(setup_sequential, 3);
+}
+
static void test_sequence_numbers_one(void) {
_cleanup_(mmap_cache_unrefp) MMapCache *m = NULL;
char t[] = "/var/tmp/journal-seq-XXXXXX";
assert_se(managed_journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, JOURNAL_COMPRESS, 0644,
UINT64_MAX, NULL, m, NULL, NULL, &one) == 0);
- append_number(one, 1, &seqnum);
+ append_number(one, 1, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 1);
- append_number(one, 2, &seqnum);
+ append_number(one, 2, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 2);
assert_se(sd_id128_is_null(two->file->header->tail_entry_boot_id)); /* Not written yet. */
assert_se(sd_id128_equal(two->file->header->seqnum_id, one->file->header->seqnum_id));
- append_number(two, 3, &seqnum);
+ append_number(two, 3, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 3);
- append_number(two, 4, &seqnum);
+ append_number(two, 4, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 4);
test_close(two);
- append_number(one, 5, &seqnum);
+ append_number(one, 5, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 5);
- append_number(one, 6, &seqnum);
+ append_number(one, 6, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 6);
assert_se(sd_id128_equal(two->file->header->seqnum_id, seqnum_id));
- append_number(two, 7, &seqnum);
+ append_number(two, 7, NULL, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
assert_se(seqnum == 5);