From: Libor Peltan Date: Wed, 20 Nov 2019 15:04:05 +0000 (+0100) Subject: load/double changeset: proper check of zone-in-journal non-existence X-Git-Tag: embedded_lmdb~105^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75632433db952613e505e8a0f031c225c839fb97;p=thirdparty%2Fknot-dns.git load/double changeset: proper check of zone-in-journal non-existence ...the previous did not work with old_contents_exists --- diff --git a/src/knot/events/handlers/load.c b/src/knot/events/handlers/load.c index 577dc7b9c9..843f5b913f 100644 --- a/src/knot/events/handlers/load.c +++ b/src/knot/events/handlers/load.c @@ -217,7 +217,7 @@ int event_load(conf_t *conf, zone_t *zone) uint32_t middle_serial = zone_contents_serial(up.new_cont); - if (do_diff && old_contents_exist && journal_conts == NULL && dnssec_enable) { + if (do_diff && old_contents_exist && dnssec_enable && !zone_journal_has_zij(zone)) { ret = zone_update_start_extra(&up); if (ret != KNOT_EOK) { goto cleanup; diff --git a/src/knot/journal/journal_metadata.c b/src/knot/journal/journal_metadata.c index 38900b7020..e8e8c092e2 100644 --- a/src/knot/journal/journal_metadata.c +++ b/src/knot/journal/journal_metadata.c @@ -298,7 +298,7 @@ int journal_set_flushed(zone_journal_t j) return txn.ret; } -int journal_info(zone_journal_t j, bool *exists, uint32_t *first_serial, +int journal_info(zone_journal_t j, bool *exists, uint32_t *first_serial, bool *has_zij, uint32_t *serial_to, bool *has_merged, uint32_t *merged_serial, uint64_t *occupied, uint64_t *occupied_total) { @@ -318,6 +318,9 @@ int journal_info(zone_journal_t j, bool *exists, uint32_t *first_serial, if (first_serial != NULL) { *first_serial = md.first_serial; } + if (has_zij != NULL) { + *has_zij = journal_contains(&txn, true, 0, j.zone); + } if (serial_to != NULL) { *serial_to = md.serial_to; } diff --git a/src/knot/journal/journal_metadata.h b/src/knot/journal/journal_metadata.h index 17580a4fd3..b91b431db2 100644 --- a/src/knot/journal/journal_metadata.h +++ b/src/knot/journal/journal_metadata.h @@ -135,6 +135,7 @@ int journal_set_flushed(zone_journal_t j); * \param j Zone journal. * \param exists Output: bool if the zone exists in the journal. * \param first_serial Optional output: serial-from of the first changeset in journal. + * \param has_zij Optional output: bool if there is zone-in-journal. * \param serial_to Optional output: serial.to of the last changeset in journal. * \param has_merged Optional output: bool if there is a special (non zone-in-journal) merged changeset. * \param merged_serial Optional output: serial-from of the merged changeset. @@ -143,14 +144,14 @@ int journal_set_flushed(zone_journal_t j); * * \return KNOT_E* */ -int journal_info(zone_journal_t j, bool *exists, uint32_t *first_serial, +int journal_info(zone_journal_t j, bool *exists, uint32_t *first_serial, bool *has_zij, uint32_t *serial_to, bool *has_merged, uint32_t *merged_serial, uint64_t *occupied, uint64_t *occupied_total); /*! \brief Return true if this zone exists in journal DB. */ inline static bool journal_is_existing(zone_journal_t j) { bool ex = false; - (void)journal_info(j, &ex, NULL, NULL, NULL, NULL, NULL, NULL); + (void)journal_info(j, &ex, NULL, NULL, NULL, NULL, NULL, NULL, NULL); return ex; } diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c index 1c12b1be7b..63b331ee54 100644 --- a/src/knot/nameserver/ixfr.c +++ b/src/knot/nameserver/ixfr.c @@ -106,7 +106,7 @@ static int ixfr_load_chsets(journal_read_t **journal_read, zone_t *zone, zone_journal_t j = zone_journal(zone); bool j_exists = false; - int ret = journal_info(j, &j_exists, NULL, &j_serial_to, NULL, NULL, NULL, NULL); + int ret = journal_info(j, &j_exists, NULL, NULL, &j_serial_to, NULL, NULL, NULL, NULL); if (ret != KNOT_EOK) { return ret; } else if (!j_exists) { diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c index 89ea931393..be37ad8531 100644 --- a/src/knot/zone/zone.c +++ b/src/knot/zone/zone.c @@ -285,6 +285,13 @@ int zone_flush_journal(conf_t *conf, zone_t *zone, bool verbose) return flush_journal(conf, zone, false, verbose); } +bool zone_journal_has_zij(zone_t *zone) +{ + bool exists = false, zij = false; + journal_info(zone_journal(zone), &exists, NULL, &zij, NULL, NULL, NULL, NULL, NULL); + return exists && zij; +} + zone_contents_t *zone_switch_contents(zone_t *zone, zone_contents_t *new_contents) { if (zone == NULL) { diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h index d419581f5e..bed37ec054 100644 --- a/src/knot/zone/zone.h +++ b/src/knot/zone/zone.h @@ -130,6 +130,8 @@ int zone_in_journal_store(conf_t *conf, zone_t *zone, zone_contents_t *new_conte /*! \brief Synchronize zone file with journal. */ int zone_flush_journal(conf_t *conf, zone_t *zone, bool verbose); +bool zone_journal_has_zij(zone_t *zone); + /*! * \brief Atomically switch the content of the zone. */ diff --git a/src/knot/zone/zonedb.c b/src/knot/zone/zonedb.c index 5cf8fc527b..58b98f7bc2 100644 --- a/src/knot/zone/zonedb.c +++ b/src/knot/zone/zonedb.c @@ -33,7 +33,7 @@ static void discard_zone(zone_t *zone) // Flush if bootstrapped or if the journal doesn't exist. if (!zone->zonefile.exists || journal_info( - zone_journal(zone), &exists, NULL, &journal_serial, NULL, NULL, NULL, NULL + zone_journal(zone), &exists, NULL, NULL, &journal_serial, NULL, NULL, NULL, NULL ) != KNOT_EOK || !exists || journal_serial != zone_serial) { zone_flush_journal(conf(), zone, false); } diff --git a/src/utils/kjournalprint/main.c b/src/utils/kjournalprint/main.c index 38fb193b72..a9140a974d 100644 --- a/src/utils/kjournalprint/main.c +++ b/src/utils/kjournalprint/main.c @@ -172,7 +172,7 @@ int print_journal(char *path, knot_dname_t *name, print_params_t *params) return ret; } - ret = journal_info(j, &exists, NULL, NULL, NULL, NULL, &occupied, &occupied_all); + ret = journal_info(j, &exists, NULL, NULL, NULL, NULL, NULL, &occupied, &occupied_all); if (ret != KNOT_EOK || !exists) { fprintf(stderr, "This zone does not exist in DB %s\n", path); knot_lmdb_deinit(&jdb); diff --git a/tests/knot/test_journal.c b/tests/knot/test_journal.c index 1efe783d97..70bef41a0e 100644 --- a/tests/knot/test_journal.c +++ b/tests/knot/test_journal.c @@ -566,7 +566,7 @@ static changeset_t * tm_chs(const knot_dname_t * apex, int x) static int merged_present(void) { bool exists, has_merged; - return journal_info(jj, &exists, NULL, NULL, &has_merged, NULL, NULL, NULL) == KNOT_EOK && exists && has_merged; + return journal_info(jj, &exists, NULL, NULL, NULL, &has_merged, NULL, NULL, NULL) == KNOT_EOK && exists && has_merged; } static void test_merge(const knot_dname_t *apex)