mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-04 00:25:29 +00:00
print journal index data and test for consistency
'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.
This commit is contained in:
@@ -344,6 +344,7 @@ struct dns_journal {
|
|||||||
struct {
|
struct {
|
||||||
/* These define the part of the journal we iterate over. */
|
/* These define the part of the journal we iterate over. */
|
||||||
journal_pos_t bpos; /*%< Position before first, */
|
journal_pos_t bpos; /*%< Position before first, */
|
||||||
|
journal_pos_t cpos; /*%< before current, */
|
||||||
journal_pos_t epos; /*%< and after last transaction */
|
journal_pos_t epos; /*%< and after last transaction */
|
||||||
/* The rest is iterator state. */
|
/* The rest is iterator state. */
|
||||||
uint32_t current_serial; /*%< Current SOA serial */
|
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) {
|
journal_read_xhdr(dns_journal_t *j, journal_xhdr_t *xhdr) {
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
|
|
||||||
|
j->it.cpos.offset = j->offset;
|
||||||
|
|
||||||
switch (j->xhdr_version) {
|
switch (j->xhdr_version) {
|
||||||
case XHDR_VERSION1: {
|
case XHDR_VERSION1: {
|
||||||
journal_rawxhdr_ver1_t raw;
|
journal_rawxhdr_ver1_t raw;
|
||||||
@@ -1635,6 +1638,15 @@ dns_journal_print(isc_mem_t *mctx, uint32_t flags, const char *filename,
|
|||||||
if (printxhdr) {
|
if (printxhdr) {
|
||||||
fprintf(file, "Journal format = %sHeader version = %d\n",
|
fprintf(file, "Journal format = %sHeader version = %d\n",
|
||||||
j->header.format + 1, j->header_ver1 ? 1 : 2);
|
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) {
|
if (j->header.serialset) {
|
||||||
fprintf(file, "Source serial = %u\n", j->header.sourceserial);
|
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_name_t *name = NULL;
|
||||||
dns_rdata_t *rdata = NULL;
|
dns_rdata_t *rdata = NULL;
|
||||||
dns_difftuple_t *tuple = NULL;
|
dns_difftuple_t *tuple = NULL;
|
||||||
|
static uint32_t i = 0;
|
||||||
|
bool print = false;
|
||||||
uint32_t ttl;
|
uint32_t ttl;
|
||||||
|
|
||||||
dns_journal_current_rr(j, &name, &ttl, &rdata);
|
dns_journal_current_rr(j, &name, &ttl, &rdata);
|
||||||
|
|
||||||
if (rdata->type == dns_rdatatype_soa) {
|
if (rdata->type == dns_rdatatype_soa) {
|
||||||
n_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) {
|
if (n_soa == 0) {
|
||||||
isc_log_write(JOURNAL_COMMON_LOGARGS, ISC_LOG_ERROR,
|
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);
|
FAIL(ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printxhdr && n_soa == 1) {
|
if (print) {
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"Transaction: version %d size %u rrcount %u "
|
"Transaction: version %d offset %lld size %u "
|
||||||
"startserial %u endserial %u\n",
|
"rrcount %u start %u end %u\n",
|
||||||
j->xhdr_version, j->curxhdr.size,
|
j->xhdr_version, (long long)j->it.cpos.offset,
|
||||||
j->curxhdr.count, j->curxhdr.serial0,
|
j->curxhdr.size, j->curxhdr.count,
|
||||||
j->curxhdr.serial1);
|
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(
|
CHECK(dns_difftuple_create(
|
||||||
diff.mctx, n_soa == 1 ? DNS_DIFFOP_DEL : DNS_DIFFOP_ADD,
|
diff.mctx, n_soa == 1 ? DNS_DIFFOP_DEL : DNS_DIFFOP_ADD,
|
||||||
|
Reference in New Issue
Block a user