[PATCH] Resolver: make TCP write timer event cancelable.
A.Bavshin at F5.com
Thu May 26 15:50:22 UTC 2022
# HG changeset patch
# User Aleksei Bavshin <a.bavshin at f5.com>
# Date 1653579686 25200
# Thu May 26 08:41:26 2022 -0700
# Branch se
# Node ID afb3646a08b6ebcf46fdbd2e7bf97cdcccca774b
# Parent 5a98e9cb437f7719afa2bde62de68e174fd8e03e
Resolver: make TCP write timer event cancelable.
In certain circumstances, this timer could become the only remaining
non-cancelable timer in a worker, effectively delaying the worker shutdown.
We're keeping the resolver alive to avoid disrupting any leftover tasks in the
worker that may require up-to-date upstream peer data, but it is unnecessary
in absence of other connections. And any useful workload would have its own
non-cancelable timers, so it is safe to allow canceling this one.
The scenario in question is a periodic resolver task with a period less than
the TCP write timeout and responses large enough to warrant fallback to a TCP
connection - something that could be reproduced with a dynamic upstream
implementation. With each event loop wakeup, we either see a previously
set write timer instance or schedule a new one.
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
@@ -1624,6 +1624,7 @@ ngx_resolver_send_tcp_query(ngx_resolver
rec->tcp->data = rec;
+ rec->tcp->write->cancelable = 1;
rec->tcp->write->handler = ngx_resolver_tcp_write;
rec->tcp->read->handler = ngx_resolver_tcp_read;
rec->tcp->read->resolver = 1;
More information about the nginx-devel