From 46fd73e36950a2dcfdac336680bb5ad9ee5903aa Mon Sep 17 00:00:00 2001 From: Libor Peltan Date: Wed, 27 Apr 2022 09:50:48 +0200 Subject: [PATCH] zonedb-reload: when recreating zone, replan also refresh... ...as it might be planned by incomming NOTIFY during zonedb-reload and in this case its not in timers --- src/knot/events/replan.c | 1 + tests-extra/tests/zone/reload_notify/test.py | 40 ++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 tests-extra/tests/zone/reload_notify/test.py diff --git a/src/knot/events/replan.c b/src/knot/events/replan.c index 007ddfa79..da91518cd 100644 --- a/src/knot/events/replan.c +++ b/src/knot/events/replan.c @@ -56,6 +56,7 @@ static void replan_from_zone(zone_t *zone, zone_t *old_zone) replan_ddns(zone, old_zone); const zone_event_type_t types[] = { + ZONE_EVENT_REFRESH, ZONE_EVENT_FLUSH, ZONE_EVENT_BACKUP, ZONE_EVENT_NOTIFY, diff --git a/tests-extra/tests/zone/reload_notify/test.py b/tests-extra/tests/zone/reload_notify/test.py new file mode 100644 index 000000000..9709ff577 --- /dev/null +++ b/tests-extra/tests/zone/reload_notify/test.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +'''Test race conditions about incomming NOTIFY during zonedb-reload''' + +from dnstest.test import Test +from dnstest.utils import * + +import random +import threading + +t = Test() + +master = t.server("knot") +slave = t.server("knot") +zones = t.zone_rnd(60, dnssec=False, records=10) +t.link(zones, master, slave, ixfr=True) + +t.start() + +serials = slave.zones_wait(zones) + +def send_reload(server): + server.ctl("reload") + +def send_update(up): + up.send() + +for z in zones: + up = master.update(z) + up.add("dojdojwodijowjeojdwe", 3600, "A", "1.2.3.4") + + threading.Thread(target=send_update, args=[up]).start() + +t.sleep(random.choice([0.1, 0.2, 0.5, 1, 2, 4])) + +slave.reload() + +slave.zones_wait(zones, serials) + +t.end()