From: Daniel Salzman Date: Fri, 1 Aug 2025 06:04:29 +0000 (+0200) Subject: external validation: replace per zone flag ZONE_SHUT_DOWN with server state ServerShu... X-Git-Tag: v3.5.0~38^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d2d91c988b41ef44a81533cbac8aec1dbdd1bdf6;p=thirdparty%2Fknot-dns.git external validation: replace per zone flag ZONE_SHUT_DOWN with server state ServerShutting --- diff --git a/src/knot/server/server.c b/src/knot/server/server.c index ceb203958f..6b45bd1433 100644 --- a/src/knot/server/server.c +++ b/src/knot/server/server.c @@ -1039,13 +1039,6 @@ int server_start(server_t *server, bool answering) return KNOT_EOK; } -static void zonedb_shutdown(server_t *server) -{ - if (server->zone_db != NULL) { - knot_zonedb_foreach(server->zone_db, zone_shutdown); - } -} - void server_wait(server_t *server) { if (server == NULL) { @@ -1411,8 +1404,8 @@ void server_stop(server_t *server) /* Stop scheduler. */ evsched_stop(&server->sched); - /* Shut down zones. */ - zonedb_shutdown(server); + /* Mark the server is shutting down. */ + server->state |= ServerShutting; /* Interrupt background workers. */ worker_pool_stop(server->workers); @@ -1630,7 +1623,7 @@ void server_update_zones(conf_t *conf, server_t *server, reload_t mode) /* Suspend adding events to worker pool queue, wait for queued events. */ log_debug("suspending zone events"); evsched_pause(&server->sched); - zonedb_shutdown(server); + server->state |= ServerShutting; worker_pool_wait(server->workers); log_debug("suspended zone events"); @@ -1645,6 +1638,7 @@ void server_update_zones(conf_t *conf, server_t *server, reload_t mode) if (server->zone_db) { knot_zonedb_foreach(server->zone_db, zone_events_start); } + server->state &= ~ServerShutting; log_debug("resumed zone events"); } diff --git a/src/knot/server/server.h b/src/knot/server/server.h index 6c7a50874e..f1f68650e8 100644 --- a/src/knot/server/server.h +++ b/src/knot/server/server.h @@ -39,6 +39,7 @@ typedef enum { ServerIdle = 0 << 0, /*!< Server is idle. */ ServerRunning = 1 << 0, /*!< Server is running. */ ServerAnswering = 1 << 1, /*!< Server is answering queries. */ + ServerShutting = 1 << 2, /*!< Server is shutting down. */ } server_state_t; /*! diff --git a/src/knot/updates/zone-update.c b/src/knot/updates/zone-update.c index e602d5b093..cb7bbe1a4d 100644 --- a/src/knot/updates/zone-update.c +++ b/src/knot/updates/zone-update.c @@ -992,7 +992,8 @@ int zone_update_external(conf_t *conf, zone_update_t *update, conf_val_t *ev_id) assert(update->zone->control_update == NULL); - if (zone_get_flag(update->zone, ZONE_SHUT_DOWN, false)) { + /* Don't start external validation if shutting down. */ + if (update->zone->server->state & ServerShutting) { pthread_mutex_unlock(&update->zone->cu_lock); return KNOT_EEXTERNAL; } diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c index c52fd31724..80b8a8a1cc 100644 --- a/src/knot/zone/zone.c +++ b/src/knot/zone/zone.c @@ -200,16 +200,6 @@ void zone_control_clear(zone_t *zone) zone->control_update = NULL; } -void zone_shutdown(zone_t *zone) -{ - pthread_mutex_lock(&zone->cu_lock); - if (zone->control_update != NULL && (zone->control_update->flags & UPDATE_WFEV)) { - knot_sem_post(&zone->control_update->external); - } - zone_set_flag(zone, ZONE_SHUT_DOWN); - pthread_mutex_unlock(&zone->cu_lock); -} - void zone_free(zone_t **zone_ptr) { if (zone_ptr == NULL || *zone_ptr == NULL) { diff --git a/src/knot/zone/zone.h b/src/knot/zone/zone.h index a33fe6337a..9d5d3f007f 100644 --- a/src/knot/zone/zone.h +++ b/src/knot/zone/zone.h @@ -39,7 +39,6 @@ typedef enum { ZONE_XFR_FROZEN = 1 << 7, /*!< Outgoing AXFR/IXFR temporarily disabled. */ ZONE_USER_FLUSH = 1 << 8, /*!< User-triggered flush. */ ZONE_LAST_SIGN_OK = 1 << 9, /*!< Last full-sign event finished OK. */ - ZONE_SHUT_DOWN = 1 << 10, /*!< Zone events are shutting down. */ } zone_flag_t; /*! @@ -149,13 +148,6 @@ typedef struct zone */ zone_t* zone_new(const knot_dname_t *name); -/*! - * \brief Declare that zone is shutting down. - * - * \param zone Zone to be shut down. - */ -void zone_shutdown(zone_t *zone); - /*! * \brief Deallocates the zone structure. * diff --git a/src/knot/zone/zonedb-load.c b/src/knot/zone/zonedb-load.c index 8b5095aa5c..f9fa0b2188 100644 --- a/src/knot/zone/zonedb-load.c +++ b/src/knot/zone/zonedb-load.c @@ -533,8 +533,6 @@ static knot_zonedb_t *create_zonedb(conf_t *conf, server_t *server, reload_t mod it = knot_zonedb_iter_begin(db_new); while (!knot_zonedb_iter_finished(it)) { zone_t *z = knot_zonedb_iter_val(it); - zone_unset_flag(z, ZONE_SHUT_DOWN); - conf_val_t val = conf_zone_get(conf, C_REVERSE_GEN, z->name); while (val.code == KNOT_EOK) { const knot_dname_t *forw_name = conf_dname(&val);