diff --git a/tests/journal.c b/tests/journal.c index 1592624535a272b07d039f1aef534f2d939c7bcb..8aba457e64964bddaaa454df2e3f2beca6b1bcb5 100644 --- a/tests/journal.c +++ b/tests/journal.c @@ -36,17 +36,18 @@ static int randstr(char* dst, size_t len) } /*! \brief Journal fillup test with size check. */ -static void test_fillup(journal_t *journal, int fsize, const char *note) +static void test_fillup(journal_t *journal, size_t fsize, unsigned iter) { - const int chunk = 512 + rand() % 512; + const unsigned chunk = 512 + rand() % 512; int ret = KNOT_EOK; char *mptr = NULL; size_t large_entry_len = chunk * 1024; char *large_entry = malloc(chunk * 1024); assert(large_entry); randstr(large_entry, large_entry_len); - for (int i = 0; i < chunk; ++i) { - uint64_t chk_key = (uint64_t)journal + i; + unsigned i = 0; + for (; i < 512; ++i) { + uint64_t chk_key = 0xBEBE + (iter * 512) + i; ret = journal_map(journal, chk_key, &mptr, large_entry_len, false); if (ret != KNOT_EOK) { break; @@ -55,13 +56,16 @@ static void test_fillup(journal_t *journal, int fsize, const char *note) memcpy(mptr, large_entry, large_entry_len); journal_unmap(journal, chk_key, mptr, 1); } - is_int(KNOT_EBUSY, ret, "journal: %s fillup", note); + is_int(KNOT_EBUSY, ret, "journal: fillup #%u (%d entries)", iter, i); free(large_entry); /* Check file size. */ struct stat st; fstat(journal->fd, &st); - ok(st.st_size < fsize + large_entry_len, "journal: %s fillup file size check", note); + ok(st.st_size < fsize + large_entry_len, "journal: fillup / size check #%u", iter); + if (st.st_size > fsize + large_entry_len) { + diag("journal: fillup / size check #%u fsize(%zu) > max(%zu)", iter, st.st_size, fsize + large_entry_len); + } } int main(int argc, char *argv[]) @@ -69,7 +73,7 @@ int main(int argc, char *argv[]) plan_lazy(); /* Create tmpdir */ - int fsize = 10 * 1024 * 1024; + size_t fsize = 10 * 1024 * 1024; char *tmpdir = test_tmpdir(); char jfilename[256]; snprintf(jfilename, sizeof(jfilename), "%s/%s", tmpdir, "journal.XXXXXX"); @@ -146,18 +150,19 @@ int main(int argc, char *argv[]) is_int(KNOT_ESPACE, ret, "journal: overfill"); /* Fillup */ - test_fillup(journal, fsize, "iter#1"); + unsigned iterations = 10; + for (unsigned i = 0; i < iterations; ++i) { + /* Journal flush. */ + journal_close(journal); + ret = journal_mark_synced(jfilename); + is_int(KNOT_EOK, ret, "journal: flush after fillup #%u", i); + journal = journal_open(jfilename, fsize); + ok(journal != NULL, "journal: reopen after flush #%u", i); + /* Journal fillup. */ + test_fillup(journal, fsize, i); + } - /* Journal flush + refill. */ - journal_close(journal); - ret = journal_mark_synced(jfilename); - is_int(KNOT_EOK, ret, "journal: flush after fillup"); - journal = journal_open(jfilename, fsize); - ok(journal != NULL, "journal: reopen after flush"); - /* Fillup */ - test_fillup(journal, fsize, "iter#2"); - /* Close journal. */ journal_close(journal);