From: David VaĊĦek Date: Wed, 4 Jun 2025 13:51:53 +0000 (+0200) Subject: server: allow separate start of answering X-Git-Tag: v3.5.0~47^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6fd803bbcf09614ec72e51ff17565b3925d5bb1;p=thirdparty%2Fknot-dns.git server: allow separate start of answering --- diff --git a/src/knot/server/server.c b/src/knot/server/server.c index b88ba01717..9bf95c5a24 100644 --- a/src/knot/server/server.c +++ b/src/knot/server/server.c @@ -992,23 +992,32 @@ static void server_free_handler(iohandler_t *h) free(h->thread_id); } -static void worker_wait_cb(worker_pool_t *pool) +int server_start_answering(server_t *server) { - systemd_zone_load_timeout_notify(); - - static uint64_t last_ns = 0; - struct timespec now = time_now(); - uint64_t now_ns = 1000000000 * now.tv_sec + now.tv_nsec; - /* Too frequent worker_pool_status() call with many zones is expensive. */ - if (now_ns - last_ns > 1000000000) { - int running, queued; - worker_pool_status(pool, true, &running, &queued); - systemd_tasks_status_notify(running + queued); - last_ns = now_ns; + if (server == NULL) { + return KNOT_EINVAL; + } + + assert(server->state & ServerRunning); + if (server->state & ServerAnswering) { + return KNOT_EOK; + } + + log_info("server started"); + server->state |= ServerAnswering; + for (int proto = IO_UDP; proto <= IO_XDP; ++proto) { + if (server->handlers[proto].size > 0) { + int ret = dt_start(server->handlers[proto].handler.unit); + if (ret != KNOT_EOK) { + return ret; + } + } } + + return KNOT_EOK; } -int server_start(server_t *server, bool async) +int server_start(server_t *server, bool answering) { if (server == NULL) { return KNOT_EINVAL; @@ -1017,24 +1026,14 @@ int server_start(server_t *server, bool async) /* Start workers. */ worker_pool_start(server->workers); - /* Wait for enqueued events if not asynchronous. */ - if (!async) { - worker_pool_wait_cb(server->workers, worker_wait_cb); - systemd_tasks_status_notify(0); - } - /* Start evsched handler. */ evsched_start(&server->sched); + server->state |= ServerRunning; + /* Start I/O handlers. */ - server->state |= ServerRunning | ServerAnswering; - for (int proto = IO_UDP; proto <= IO_XDP; ++proto) { - if (server->handlers[proto].size > 0) { - int ret = dt_start(server->handlers[proto].handler.unit); - if (ret != KNOT_EOK) { - return ret; - } - } + if (answering) { + return server_start_answering(server); } return KNOT_EOK; diff --git a/src/knot/server/server.h b/src/knot/server/server.h index bbe5d923c5..6c7a50874e 100644 --- a/src/knot/server/server.h +++ b/src/knot/server/server.h @@ -146,17 +146,28 @@ int server_init(server_t *server, int bg_workers); */ void server_deinit(server_t *server); +/*! + * \brief Starts answering to requests alone + * (if not already started by server_start()), + * + * \param server Server structure to be used for operation. + * + * \retval Error code, KNOT_EOK on success. + * + */ +int server_start_answering(server_t *server); + /*! * \brief Starts the server. * - * \param server Server structure to be used for operation. - * \param async Don't wait for zones to load if true. + * \param server Server structure to be used for operation. + * \param answering Start answering to requests if true. * * \retval KNOT_EOK on success. * \retval KNOT_EINVAL on invalid parameters. * */ -int server_start(server_t *server, bool async); +int server_start(server_t *server, bool answering); /*! * \brief Waits for the server to finish.