]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
external validation: replace per zone flag ZONE_SHUT_DOWN with server state ServerShu...
authorDaniel Salzman <daniel.salzman@nic.cz>
Fri, 1 Aug 2025 06:04:29 +0000 (08:04 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Fri, 1 Aug 2025 15:31:18 +0000 (17:31 +0200)
src/knot/server/server.c
src/knot/server/server.h
src/knot/updates/zone-update.c
src/knot/zone/zone.c
src/knot/zone/zone.h
src/knot/zone/zonedb-load.c

index ceb203958f8812926c1c1e2231418dd74666fb0f..6b45bd14336fa2bd7e0e3ee65ff553cd4bb0e34f 100644 (file)
@@ -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");
 }
 
index 6c7a50874e685876870240144bcc9a9f8d7dffdb..f1f68650e8c3248ad393ab2506bd7a4976e8d19d 100644 (file)
@@ -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;
 
 /*!
index e602d5b0939f5171d4443ffe8786c66ec3a0a90a..cb7bbe1a4d964526a8f0057f84ceefee7ac3e0f6 100644 (file)
@@ -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;
        }
index c52fd317247b87072771120295dfb6938ba423fc..80b8a8a1cce54ec0bf7034600aaba8280f4a2a11 100644 (file)
@@ -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) {
index a33fe6337a965314aa811441e1270b2075a1c059..9d5d3f007f0bc325b5b02d968d215ccc51005e53 100644 (file)
@@ -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.
  *
index 8b5095aa5c5996131c599dd8c9f53e559f506bdb..f9fa0b2188cc90ada82c6ae438f1b5c93b653a1b 100644 (file)
@@ -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);