]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
server: allow separate start of answering
authorDavid Vašek <david.vasek@nic.cz>
Wed, 4 Jun 2025 13:51:53 +0000 (15:51 +0200)
committerDavid Vašek <david.vasek@nic.cz>
Thu, 17 Jul 2025 16:37:53 +0000 (18:37 +0200)
src/knot/server/server.c
src/knot/server/server.h

index b88ba0171763578f07cdb5092421a5228df0b7e8..9bf95c5a24e6c8da644f6bdc2c19e24d272834e2 100644 (file)
@@ -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;
index bbe5d923c5e9e3a79ab80a67e619934de5c69eec..6c7a50874e685876870240144bcc9a9f8d7dffdb 100644 (file)
@@ -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.