changeset 8322:d9bc33166361 quic

Do not set timers after the connection is closed. The qc->closing flag is set when a connection close is initiated for the first time. No timers will be set if the flag is active. TODO: this is a temporary solution to avoid running timer handlers after connection (and it's pool) was destroyed. It looks like currently we have no clear policy of connection closing in regard to timers.
author Vladimir Homutov <vl@nginx.com>
date Sat, 04 Apr 2020 22:27:29 +0300
parents e45719a9b148
children 853908b5a216
files src/event/ngx_event_quic.c
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -704,6 +704,7 @@ ngx_quic_close_connection(ngx_connection
     qc = c->quic;
 
     if (qc) {
+        qc->closing = 1;
         tree = &qc->streams.tree;
 
         if (tree->root != tree->sentinel) {
@@ -727,6 +728,10 @@ ngx_quic_close_connection(ngx_connection
 
                 ngx_post_event(rev, &ngx_posted_events);
 
+                if (rev->timer_set) {
+                    ngx_del_timer(rev);
+                }
+
 #if (NGX_DEBUG)
                 ns++;
 #endif
@@ -735,7 +740,6 @@ ngx_quic_close_connection(ngx_connection
             ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
                            "quic connection has %ui active streams", ns);
 
-            qc->closing = 1;
             return;
         }
 
@@ -1622,7 +1626,7 @@ ngx_quic_output(ngx_connection_t *c)
         }
     }
 
-    if (!qc->send_timer_set) {
+    if (!qc->send_timer_set && !qc->closing) {
         qc->send_timer_set = 1;
         ngx_add_timer(c->read, qc->tp.max_idle_timeout);
     }