summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2021-03-28 17:45:31 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2021-03-28 17:45:31 +0300
commitcb9fca08465a90a46a8a5143c58b994c3419b49c (patch)
tree84fe28cffa59dbb6db9fb66c8d8905eb0d4ec34a
parentfd0546aa33d2b28fc89753c15439f356485ad845 (diff)
downloadnginx-cb9fca08465a90a46a8a5143c58b994c3419b49c.tar.gz
Resolver: added missing event handling after reading.
If we need to be notified about further events, ngx_handle_read_event() needs to be called after a read event is processed. Without this, an event can be removed from the kernel and won't be reported again, notably when using oneshot event methods, such as eventport on Solaris. While here, error handling is also added, similar to one present in ngx_resolver_tcp_read(). This is not expected to make a difference and mostly added for consistency.
-rw-r--r--src/core/ngx_resolver.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index 5b716ee75..49616b776 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -1563,13 +1563,28 @@ ngx_resolver_udp_read(ngx_event_t *rev)
do {
n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE);
- if (n < 0) {
- return;
+ if (n == NGX_AGAIN) {
+ break;
+ }
+
+ if (n == NGX_ERROR) {
+ goto failed;
}
ngx_resolver_process_response(rec->resolver, buf, n, 0);
} while (rev->ready);
+
+ if (ngx_handle_read_event(rev, 0) != NGX_OK) {
+ goto failed;
+ }
+
+ return;
+
+failed:
+
+ ngx_close_connection(rec->udp);
+ rec->udp = NULL;
}