Skip to content
Snippets Groups Projects
Commit 686aeee7 authored by Daniel Salzman's avatar Daniel Salzman
Browse files

zone: flush zone after retransfer even if serial not changed

parent d82c82d7
No related branches found
No related tags found
No related merge requests found
Pipeline #52065 passed
......@@ -1180,6 +1180,7 @@ int event_refresh(conf_t *conf, zone_t *zone)
if (zone->flags & ZONE_FORCE_AXFR) {
zone->flags &= ~ZONE_FORCE_AXFR;
trctx.force_axfr = true;
zone->zonefile.retransfer = true;
}
int ret = zone_master_try(conf, zone, try_refresh, &trctx, "refresh");
......
......@@ -91,7 +91,7 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
zone_contents_t *contents = zone->contents;
uint32_t serial_to = zone_contents_serial(contents);
if (!force && zone->zonefile.exists && zone->zonefile.serial == serial_to &&
!zone->zonefile.resigned) {
!zone->zonefile.retransfer && !zone->zonefile.resigned) {
ret = KNOT_EOK; /* No differences. */
goto flush_journal_replan;
}
......@@ -132,6 +132,7 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
zone->zonefile.mtime = st.st_mtim;
zone->zonefile.serial = serial_to;
zone->zonefile.resigned = false;
zone->zonefile.retransfer = false;
/* Flush journal. */
if (journal_is_existing(j)) {
......
......@@ -58,6 +58,7 @@ typedef struct zone
uint32_t serial;
bool exists;
bool resigned;
bool retransfer;
} zonefile;
/*! \brief Zone events. */
......
$ORIGIN example.com.
$TTL 3600
@ SOA dns1 hostmaster 2010111201 10800 3600 1209600 7200
NS dns1
NS dns2
MX 10 mail
dns1 A 192.0.2.1
AAAA 2001:DB8::1
dns2 A 192.0.2.2
AAAA 2001:DB8::2
mail A 192.0.2.3
AAAA 2001:DB8::3
diff A 1.2.3.4
......@@ -13,8 +13,13 @@ slave = t.server("knot")
zone = t.zone("example.com.", storage=".")
t.link(zone, master, slave)
slave.zonefile_sync = 0
# Load newer zone to the slave
slave.update_zonefile(zone, version=1)
slave.update_zonefile(zone, version="slave")
zfpath = slave.zones[zone[0].name].zfile.path
mtime0 = os.stat(zfpath).st_mtime
t.start()
......@@ -24,11 +29,29 @@ serial_slave = slave.zone_wait(zone)
# Check that the slave's serial is larger than master's
assert serial_master <= serial_slave
# Force refresh
# Retransfer zone with lower serial
slave.ctl("zone-retransfer example.com.")
t.sleep(2)
serial_slave = slave.zone_wait(zone)
compare(serial_slave, serial_master, "Serial after retransfer")
mtime1 = os.stat(zfpath).st_mtime
if mtime1 == mtime0:
set_err("Not flushed after retransfer")
# Retransfer zone with the same serial
master.update_zonefile(zone, version="master")
master.reload()
slave.ctl("zone-retransfer example.com.")
t.sleep(2)
resp = slave.dig("diff.example.com", "A")
resp.check(rcode="NOERROR")
mtime2 = os.stat(zfpath).st_mtime
if mtime2 == mtime1:
set_err("Not flushed after retransfer")
t.end()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment