]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
print journal index data and test for consistency
authorEvan Hunt <each@isc.org>
Wed, 3 Mar 2021 22:59:30 +0000 (14:59 -0800)
committerEvan Hunt <each@isc.org>
Thu, 4 Mar 2021 03:19:50 +0000 (19:19 -0800)
'named-journalprint -x' now prints the journal's index table and
the offset of each transaction in the journal, so that index consistency
can be confirmed.

(cherry picked from commit a4972324a6846f4c338e5c7ea88ee88eea95697e)

lib/dns/journal.c

index 32756735f1535c38a6352d4ca7c0a69654278f18..fad38c0f5796890023e407898654da8ecb845a3b 100644 (file)
@@ -344,6 +344,7 @@ struct dns_journal {
        struct {
                /* These define the part of the journal we iterate over. */
                journal_pos_t bpos; /*%< Position before first, */
+               journal_pos_t cpos; /*%< before current, */
                journal_pos_t epos; /*%< and after last transaction */
                /* The rest is iterator state. */
                uint32_t current_serial; /*%< Current SOA serial */
@@ -483,6 +484,8 @@ static isc_result_t
 journal_read_xhdr(dns_journal_t *j, journal_xhdr_t *xhdr) {
        isc_result_t result;
 
+       j->it.cpos.offset = j->offset;
+
        switch (j->xhdr_version) {
        case XHDR_VERSION1: {
                journal_rawxhdr_ver1_t raw;
@@ -1635,6 +1638,15 @@ dns_journal_print(isc_mem_t *mctx, uint32_t flags, const char *filename,
        if (printxhdr) {
                fprintf(file, "Journal format = %sHeader version = %d\n",
                        j->header.format + 1, j->header_ver1 ? 1 : 2);
+               fprintf(file, "Index (size = %u):\n", j->header.index_size);
+               for (uint32_t i = 0; i < j->header.index_size; i++) {
+                       if (j->index[i].offset == 0) {
+                               fputc('\n', file);
+                               break;
+                       }
+                       fprintf(file, "%lld", (long long)j->index[i].offset);
+                       fputc((i + 1) % 8 == 0 ? '\n' : ' ', file);
+               }
        }
        if (j->header.serialset) {
                fprintf(file, "Source serial = %u\n", j->header.sourceserial);
@@ -1660,16 +1672,20 @@ dns_journal_print(isc_mem_t *mctx, uint32_t flags, const char *filename,
                dns_name_t *name = NULL;
                dns_rdata_t *rdata = NULL;
                dns_difftuple_t *tuple = NULL;
+               static uint32_t i = 0;
+               bool print = false;
                uint32_t ttl;
 
                dns_journal_current_rr(j, &name, &ttl, &rdata);
 
                if (rdata->type == dns_rdatatype_soa) {
                        n_soa++;
-               }
-
-               if (n_soa == 3) {
-                       n_soa = 1;
+                       if (n_soa == 3) {
+                               n_soa = 1;
+                       }
+                       if (n_soa == 1) {
+                               print = printxhdr;
+                       }
                }
                if (n_soa == 0) {
                        isc_log_write(JOURNAL_COMMON_LOGARGS, ISC_LOG_ERROR,
@@ -1679,13 +1695,21 @@ dns_journal_print(isc_mem_t *mctx, uint32_t flags, const char *filename,
                        FAIL(ISC_R_UNEXPECTED);
                }
 
-               if (printxhdr && n_soa == 1) {
+               if (print) {
                        fprintf(file,
-                               "Transaction: version %d size %u rrcount %u "
-                               "startserial %u endserial %u\n",
-                               j->xhdr_version, j->curxhdr.size,
-                               j->curxhdr.count, j->curxhdr.serial0,
-                               j->curxhdr.serial1);
+                               "Transaction: version %d offset %lld size %u "
+                               "rrcount %u start %u end %u\n",
+                               j->xhdr_version, (long long)j->it.cpos.offset,
+                               j->curxhdr.size, j->curxhdr.count,
+                               j->curxhdr.serial0, j->curxhdr.serial1);
+                       if (j->it.cpos.offset > j->index[i].offset) {
+                               fprintf(file,
+                                       "ERROR: Offset mismatch, "
+                                       "expected %lld\n",
+                                       (long long)j->index[i].offset);
+                       } else if (j->it.cpos.offset == j->index[i].offset) {
+                               i++;
+                       }
                }
                CHECK(dns_difftuple_create(
                        diff.mctx, n_soa == 1 ? DNS_DIFFOP_DEL : DNS_DIFFOP_ADD,