From cae79e1bab677ed1c2ce3adc5d54163a78f0d30b Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Fri, 22 Feb 2019 14:53:30 -0800 Subject: [PATCH] restore allowance for tcp-clients < interfaces in the "refactor tcpquota and pipeline refs" commit, the counting of active interfaces was tightened in such a way that named could fail to listen on an interface if there were more interfaces than tcp-clients. when checking the quota to start accepting on an interface, if the number of active clients was above zero, then it was presumed that some other client was able to handle accepting new connections. this, however, ignored the fact that the current client could be included in that count, so if the quota was already exceeded before all the interfaces were listening, some interfaces would never listen. we now check whether the current client has been marked active; if so, then the number of active clients on the interface must be greater than 1, not 0. (cherry picked from commit 02365b87ea0b1ea5ea8b17376f6734c811c95e61) --- doc/arm/Bv9ARM-book.xml | 3 ++- lib/ns/client.c | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index 9213ef588b..b18dee1356 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -8253,7 +8253,8 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; The number of file descriptors reserved for TCP, stdio, etc. This needs to be big enough to cover the number of - interfaces named listens on, tcp-clients as well as + interfaces named listens on plus + tcp-clients, as well as to provide room for outgoing TCP queries and incoming zone transfers. The default is 512. The minimum value is 128 and the diff --git a/lib/ns/client.c b/lib/ns/client.c index 8dd3018182..6edb46d6d7 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -3428,8 +3428,9 @@ client_accept(ns_client_t *client) { * * So, we check here to see if any other clients are * already servicing TCP queries on this interface (whether - * accepting, reading, or processing). If we find at least - * one, then it's okay *not* to call accept - we can let this + * accepting, reading, or processing). If we find that at + * least one client other than this one is active, then + * it's okay *not* to call accept - we can let this * client go inactive and another will take over when it's * done. * @@ -3443,7 +3444,8 @@ client_accept(ns_client_t *client) { * quota is tcp-clients plus the number of listening * interfaces plus 1.) */ - exit = (atomic_load(&client->interface->ntcpactive) > 0U); + exit = (atomic_load(&client->interface->ntcpactive) > + (client->tcpactive ? 1U : 0U)); if (exit) { client->newstate = NS_CLIENTSTATE_INACTIVE; (void)exit_check(client);