[PATCH 10 of 10] QUIC: application init() callback

Roman Arutyunyan arut at nginx.com
Tue Oct 25 09:11:02 UTC 2022


Hi,

On Thu, Oct 20, 2022 at 06:33:22PM +0400, Roman Arutyunyan wrote:
> Hi,
> 
> On Thu, Oct 20, 2022 at 03:51:54PM +0400, Sergey Kandaurov wrote:
> > On Thu, Sep 08, 2022 at 01:06:37PM +0400, Roman Arutyunyan wrote:
> > > # HG changeset patch
> > > # User Roman Arutyunyan <arut at nginx.com>
> > > # Date 1662627905 -14400
> > > #      Thu Sep 08 13:05:05 2022 +0400
> > > # Branch quic
> > > # Node ID 8e58a27b320807aae00194b82e2c997287e3ad42
> > > # Parent  861d6897151fe6773898db6cfdb36f56403302c5
> > > QUIC: application init() callback.
> > > 
> > > It's called after handshake completion or prior to the first early data stream
> > > creation.  The callback should initialize application-level data before
> > > creating streams.
> > > 
> > > HTTP/3 callback implementation sets keepalive timer and sends SETTINGS.
> > > 
> > > Also, this allows to limit max handshake time in ngx_http_v3_init_stream().
> > 
> > Also brings header timeout (to limit handshake time)
> > and keepalive timeout in hq mode.
> 
> Looks like for hq keepalive timeout is now set in ngx_http_v3_init_stream()
> when main connection is created and in ngx_http_v3_init() at the end of
> handshake.  After that it's neither set nor deleted.  The code which does this,
> only works for http/3, but not hq.  This should be addressed.

[..]

Attached is a patch which fixes this.  Now there's a connection cleanup
which works for hq as well.  The patch should be applied before the patch #10.

--
Roman Arutyunyan
-------------- next part --------------
# HG changeset patch
# User Roman Arutyunyan <arut at nginx.com>
# Date 1666687929 -14400
#      Tue Oct 25 12:52:09 2022 +0400
# Branch quic
# Node ID 16896749d64305c5e873434e420c95f58823dd4f
# Parent  e9285a39ff34aab034bb11b10e6ad723fd9cc2fa
HTTP/3: implement keepalive for hq.

Previously, keepalive timer was deleted in ngx_http_v3_wait_request_handler()
and set in request cleanup handler.  This worked for HTTP/3 connections, but not
for hq connections.  Now keepalive timer is deleted in
ngx_http_v3_init_request_stream() and set in connection cleanup handler,
which works both for HTTP/3 and hq.

diff --git a/src/http/v3/ngx_http_v3_request.c b/src/http/v3/ngx_http_v3_request.c
--- a/src/http/v3/ngx_http_v3_request.c
+++ b/src/http/v3/ngx_http_v3_request.c
@@ -12,6 +12,7 @@
 
 static void ngx_http_v3_init_request_stream(ngx_connection_t *c);
 static void ngx_http_v3_wait_request_handler(ngx_event_t *rev);
+static void ngx_http_v3_cleanup_connection(void *data);
 static void ngx_http_v3_cleanup_request(void *data);
 static void ngx_http_v3_process_request(ngx_event_t *rev);
 static ngx_int_t ngx_http_v3_process_header(ngx_http_request_t *r,
@@ -134,6 +135,7 @@ ngx_http_v3_init_request_stream(ngx_conn
     uint64_t                   n;
     ngx_event_t               *rev;
     ngx_connection_t          *pc;
+    ngx_pool_cleanup_t        *cln;
     ngx_http_connection_t     *hc;
     ngx_http_v3_session_t     *h3c;
     ngx_http_core_loc_conf_t  *clcf;
@@ -189,6 +191,21 @@ ngx_http_v3_init_request_stream(ngx_conn
                                         "reached maximum number of requests");
     }
 
+    cln = ngx_pool_cleanup_add(c->pool, 0);
+    if (cln == NULL) {
+        ngx_http_close_connection(c);
+        return;
+    }
+
+    cln->handler = ngx_http_v3_cleanup_connection;
+    cln->data = c;
+
+    h3c->nrequests++;
+
+    if (h3c->keepalive.timer_set) {
+        ngx_del_timer(&h3c->keepalive);
+    }
+
     rev = c->read;
 
 #if (NGX_HTTP_V3_HQ)
@@ -225,7 +242,6 @@ ngx_http_v3_wait_request_handler(ngx_eve
     ngx_connection_t          *c;
     ngx_pool_cleanup_t        *cln;
     ngx_http_request_t        *r;
-    ngx_http_v3_session_t     *h3c;
     ngx_http_connection_t     *hc;
     ngx_http_core_srv_conf_t  *cscf;
 
@@ -346,13 +362,6 @@ ngx_http_v3_wait_request_handler(ngx_eve
     cln->handler = ngx_http_v3_cleanup_request;
     cln->data = r;
 
-    h3c = ngx_http_v3_get_session(c);
-    h3c->nrequests++;
-
-    if (h3c->keepalive.timer_set) {
-        ngx_del_timer(&h3c->keepalive);
-    }
-
     rev->handler = ngx_http_v3_process_request;
     ngx_http_v3_process_request(rev);
 }
@@ -387,20 +396,13 @@ ngx_http_v3_reset_stream(ngx_connection_
 
 
 static void
-ngx_http_v3_cleanup_request(void *data)
+ngx_http_v3_cleanup_connection(void *data)
 {
-    ngx_http_request_t  *r = data;
+    ngx_connection_t  *c = data;
 
-    ngx_connection_t          *c;
     ngx_http_v3_session_t     *h3c;
     ngx_http_core_loc_conf_t  *clcf;
 
-    c = r->connection;
-
-    if (!r->response_sent) {
-        c->error = 1;
-    }
-
     h3c = ngx_http_v3_get_session(c);
 
     if (--h3c->nrequests == 0) {
@@ -411,6 +413,17 @@ ngx_http_v3_cleanup_request(void *data)
 
 
 static void
+ngx_http_v3_cleanup_request(void *data)
+{
+    ngx_http_request_t  *r = data;
+
+    if (!r->response_sent) {
+        r->connection->error = 1;
+    }
+}
+
+
+static void
 ngx_http_v3_process_request(ngx_event_t *rev)
 {
     u_char                       *p;


More information about the nginx-devel mailing list