From: Daniel Salzman Date: Thu, 26 Jun 2025 16:18:37 +0000 (+0200) Subject: conf: rework notify-delay to be more practical and consistent with Bind X-Git-Tag: v3.5.0~49^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c59b46adba460ea590e8c199814405e8a799407;p=thirdparty%2Fknot-dns.git conf: rework notify-delay to be more practical and consistent with Bind --- diff --git a/doc/reference.rst b/doc/reference.rst index 19f0d47091..14b3a057d9 100644 --- a/doc/reference.rst +++ b/doc/reference.rst @@ -2739,9 +2739,8 @@ Empty value is allowed for template value overriding. notify-delay ------------ -The time delay in seconds before an outgoing NOTIFY message is sent upon loading -a new zone (e.g. to ensure that secondaries have enough time to adjust their catalogues). -Set to -1 to prevent sending NOTIFY messages in this context. +A time delay in seconds before an outgoing NOTIFY message is sent. This delay +also defines the time granularity at which NOTIFY messages are sent per zone. *Default:* ``0`` diff --git a/src/knot/ctl/commands.c b/src/knot/ctl/commands.c index 8b9d42c602..abb55e095f 100644 --- a/src/knot/ctl/commands.c +++ b/src/knot/ctl/commands.c @@ -988,7 +988,7 @@ static int zone_txn_commit_l(zone_t *zone, _unused_ ctl_args_t *args) free(zone->control_update); zone->control_update = NULL; - zone_schedule_notify(zone, 0); + zone_schedule_notify(conf(), zone, 0); return KNOT_EOK; } diff --git a/src/knot/events/handlers/dnssec.c b/src/knot/events/handlers/dnssec.c index d669d1e237..f8108b417b 100644 --- a/src/knot/events/handlers/dnssec.c +++ b/src/knot/events/handlers/dnssec.c @@ -50,7 +50,7 @@ void event_dnssec_reschedule(conf_t *conf, zone_t *zone, ZONE_EVENT_DNSKEY_SYNC, refresh->plan_dnskey_sync ? now + jitter : ignore ); if (zone_changed) { - zone_schedule_notify(zone, 0); + zone_schedule_notify(conf, zone, 0); } } diff --git a/src/knot/events/handlers/load.c b/src/knot/events/handlers/load.c index 941380fe12..54b29ba163 100644 --- a/src/knot/events/handlers/load.c +++ b/src/knot/events/handlers/load.c @@ -416,11 +416,7 @@ load_end: replan_from_timers(conf, zone); if (!zone_timers_serial_notified(&zone->timers, new_serial)) { - val = conf_zone_get(conf, C_NOTIFY_DELAY, zone->name); - int64_t delay = conf_int(&val); - if (delay >= 0) { - zone_schedule_notify(zone, delay); - } + zone_schedule_notify(conf, zone, 0); } zone_skip_free(&skip); diff --git a/src/knot/events/handlers/refresh.c b/src/knot/events/handlers/refresh.c index 5fc6f04b99..e633cffd47 100644 --- a/src/knot/events/handlers/refresh.c +++ b/src/knot/events/handlers/refresh.c @@ -1492,7 +1492,7 @@ int event_refresh(conf_t *conf, zone_t *zone) /* Reschedule events. */ replan_from_timers(conf, zone); if (trctx.send_notify) { - zone_schedule_notify(zone, 1); + zone_schedule_notify(conf, zone, 1); } if (trctx.more_xfr && ret == KNOT_EOK) { zone_events_schedule_now(zone, ZONE_EVENT_REFRESH); diff --git a/src/knot/events/handlers/update.c b/src/knot/events/handlers/update.c index 287369d93f..9e08984ebf 100644 --- a/src/knot/events/handlers/update.c +++ b/src/knot/events/handlers/update.c @@ -256,7 +256,7 @@ static void process_requests(conf_t *conf, zone_t *zone, list_t *requests) "%.02f seconds", old_serial, new_serial, time_diff_ms(&t_start, &t_end) / 1000.0); - zone_schedule_notify(zone, 1); + zone_schedule_notify(conf, zone, 1); } static int remote_forward(conf_t *conf, knot_request_t *request, conf_remote_t *remote, diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c index 2b3d8f0360..5819c4d5c8 100644 --- a/src/knot/zone/zone.c +++ b/src/knot/zone/zone.c @@ -465,10 +465,12 @@ void zone_notifailed_clear(zone_t *zone) pthread_mutex_unlock(&zone->preferred_lock); } -void zone_schedule_notify(zone_t *zone, time_t delay) +void zone_schedule_notify(conf_t *conf, zone_t *zone, time_t delay) { + conf_val_t val = conf_zone_get(conf, C_NOTIFY_DELAY, zone->name); + int64_t conf_delay = conf_int(&val); zone_notifailed_clear(zone); - zone_events_schedule_at(zone, ZONE_EVENT_NOTIFY, time(NULL) + delay); + zone_events_schedule_at(zone, ZONE_EVENT_NOTIFY, time(NULL) + conf_delay + delay); } zone_contents_t *zone_switch_contents(zone_t *zone, zone_contents_t *new_contents) diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h index c366d4aeab..b5792cfdb6 100644 --- a/src/knot/zone/zone.h +++ b/src/knot/zone/zone.h @@ -215,7 +215,7 @@ bool zone_journal_has_zij(zone_t *zone); * \brief Clear failed_notify list before planning new NOTIFY. */ void zone_notifailed_clear(zone_t *zone); -void zone_schedule_notify(zone_t *zone, time_t delay); +void zone_schedule_notify(conf_t *conf, zone_t *zone, time_t delay); /*! * \brief Atomically switch the content of the zone. diff --git a/tests-extra/tools/dnstest/server.py b/tests-extra/tools/dnstest/server.py index 9fb5aedde1..7f778e0acb 100644 --- a/tests-extra/tools/dnstest/server.py +++ b/tests-extra/tools/dnstest/server.py @@ -1869,7 +1869,7 @@ class Knot(Server): s.item_str("storage", self.dir) s.item_str("zonefile-sync", self.zonefile_sync) if self.notify_delay is None: - self.notify_delay = random.randint(0, 2) + self.notify_delay = random.randint(0, 1) s.item_str("notify-delay", self.notify_delay) if self.zonemd_verify: s.item_str("zonemd-verify", "on")