From d0c0b223bcbcd23f4f64ec05d0e620e321505d02 Mon Sep 17 00:00:00 2001
From: Jan Vcelak <jan.vcelak@nic.cz>
Date: Mon, 19 May 2014 13:22:48 +0200
Subject: [PATCH] config: add option system.background-workers

---
 src/knot/conf/cf-lex.l   |  1 +
 src/knot/conf/cf-parse.y |  4 ++++
 src/knot/conf/conf.h     |  1 +
 src/knot/main.c          |  2 +-
 src/knot/server/server.c | 10 +++++++---
 src/knot/server/server.h |  2 +-
 6 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/knot/conf/cf-lex.l b/src/knot/conf/cf-lex.l
index 0bb85d771..555c9aa1f 100644
--- a/src/knot/conf/cf-lex.l
+++ b/src/knot/conf/cf-lex.l
@@ -117,6 +117,7 @@ update-in       { lval.t = yytext; return UPDATE_IN; }
 notify-in       { lval.t = yytext; return NOTIFY_IN; }
 notify-out      { lval.t = yytext; return NOTIFY_OUT; }
 workers         { lval.t = yytext; return WORKERS; }
+background-workers { lval.t = yytext; return BACKGROUND_WORKERS; }
 user            { lval.t = yytext; return USER; }
 pidfile         { lval.t = yytext; return PIDFILE; }
 rundir          { lval.t = yytext; return RUNDIR; }
diff --git a/src/knot/conf/cf-parse.y b/src/knot/conf/cf-parse.y
index 58e3f0aeb..dddaa6c63 100644
--- a/src/knot/conf/cf-parse.y
+++ b/src/knot/conf/cf-parse.y
@@ -461,6 +461,7 @@ static void ident_auto(int tok, conf_t *conf, bool val)
 %token <tok> MAX_UDP_PAYLOAD
 %token <tok> TSIG_ALGO_NAME
 %token <tok> WORKERS
+%token <tok> BACKGROUND_WORKERS
 %token <tok> USER
 %token <tok> RUNDIR
 %token <tok> PIDFILE
@@ -590,6 +591,9 @@ system:
  | system WORKERS NUM ';' {
      SET_NUM(new_config->workers, $3.i, 1, 255, "workers");
  }
+ | system BACKGROUND_WORKERS NUM ';' {
+     SET_NUM(new_config->bg_workers, $3.i, 1, 255, "background-workers");
+ }
  | system USER TEXT ';' {
      new_config->uid = new_config->gid = -1; // Invalidate
      char* dpos = strchr($3.t, '.'); // Find uid.gid format
diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h
index 217fa1a6a..d7d3ed657 100644
--- a/src/knot/conf/conf.h
+++ b/src/knot/conf/conf.h
@@ -215,6 +215,7 @@ typedef struct conf_t {
 	size_t nsid_len;/*!< Server's NSID length. */
 	size_t max_udp_payload; /*!< Maximal UDP payload size. */
 	int   workers;  /*!< Number of workers per interface. */
+	int   bg_workers; /*!< Number of background workers. */
 	int   uid;      /*!< Specified user id. */
 	int   gid;      /*!< Specified group id. */
 	int   max_conn_idle; /*!< TCP idle timeout. */
diff --git a/src/knot/main.c b/src/knot/main.c
index b18241b1d..ce9823805 100644
--- a/src/knot/main.c
+++ b/src/knot/main.c
@@ -280,7 +280,7 @@ int main(int argc, char **argv)
 
 	/* Initialize server. */
 	server_t server;
-	res = server_init(&server);
+	res = server_init(&server, config->bg_workers);
 	if (res != KNOT_EOK) {
 		log_server_fatal("Could not initialize server: %s\n",
 		                 knot_strerror(res));
diff --git a/src/knot/server/server.c b/src/knot/server/server.c
index 679a2b812..c7587c8a1 100644
--- a/src/knot/server/server.c
+++ b/src/knot/server/server.c
@@ -261,7 +261,7 @@ static int reconfigure_sockets(const struct conf_t *conf, server_t *s)
 	return bound;
 }
 
-int server_init(server_t *server)
+int server_init(server_t *server, int bg_workers)
 {
 	/* Clear the structure. */
 	dbg_server("%s(%p)\n", __func__, server);
@@ -282,8 +282,12 @@ int server_init(server_t *server)
 	}
 
 	/* Create zone events threads. */
-#warning TODO: config option
-	server->workers = worker_pool_create(4); //! \todo config option
+	if (bg_workers < 1) {
+		bg_workers = dt_optimal_size();
+	}
+	assert(bg_workers > 0);
+
+	server->workers = worker_pool_create(bg_workers);
 	if (server->workers == NULL) {
 		dt_delete(&server->iosched);
 		evsched_deinit(&server->sched);
diff --git a/src/knot/server/server.h b/src/knot/server/server.h
index 696f8b388..248e10309 100644
--- a/src/knot/server/server.h
+++ b/src/knot/server/server.h
@@ -132,7 +132,7 @@ typedef struct server_t {
  * \retval KNOT_EOK on success.
  * \retval KNOT_EINVAL on invalid parameters.
  */
-int server_init(server_t *server);
+int server_init(server_t *server, int bg_workers);
 
 /*!
  * \brief Properly destroys the server structure.
-- 
GitLab