# HG changeset patch # User Roman Arutyunyan <a...@nginx.com> # Date 1655904279 -14400 # Wed Jun 22 17:24:39 2022 +0400 # Branch quic # Node ID 1912c09e0e4d746ec0a4c2140b6d2046b283b647 # Parent ea555f7caec372e93e1b9a11ed822002e97ed58b QUIC: removed ngx_quic_shutdown_connection().
HTTP/3 shutdown is now controlled by HTTP/3 layer. QUIC connection is finalized after reaching requests limit when all request streams have finished. diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c --- a/src/event/quic/ngx_event_quic.c +++ b/src/event/quic/ngx_event_quic.c @@ -82,7 +82,6 @@ ngx_quic_connstate_dbg(ngx_connection_t } } - p = ngx_slprintf(p, last, "%s", qc->shutdown ? " shutdown" : ""); p = ngx_slprintf(p, last, "%s", qc->closing ? " closing" : ""); p = ngx_slprintf(p, last, "%s", qc->draining ? " draining" : ""); p = ngx_slprintf(p, last, "%s", qc->key_phase ? " kp" : ""); @@ -425,9 +424,6 @@ ngx_quic_input_handler(ngx_event_t *rev) if (!rev->ready) { if (qc->closing) { ngx_quic_close_connection(c, NGX_OK); - - } else if (qc->shutdown) { - ngx_quic_shutdown_quic(c); } return; @@ -635,21 +631,6 @@ ngx_quic_finalize_connection(ngx_connect } -void -ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - qc->shutdown = 1; - qc->shutdown_code = err; - qc->shutdown_reason = reason; - - ngx_quic_shutdown_quic(c); -} - - static void ngx_quic_close_timer_handler(ngx_event_t *ev) { @@ -1438,36 +1419,3 @@ ngx_quic_push_handler(ngx_event_t *ev) ngx_quic_connstate_dbg(c); } - - -void -ngx_quic_shutdown_quic(ngx_connection_t *c) -{ - ngx_rbtree_t *tree; - ngx_rbtree_node_t *node; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (qc->closing) { - return; - } - - tree = &qc->streams.tree; - - if (tree->root != tree->sentinel) { - for (node = ngx_rbtree_min(tree->root, tree->sentinel); - node; - node = ngx_rbtree_next(tree, node)) - { - qs = (ngx_quic_stream_t *) node; - - if (!qs->cancelable) { - return; - } - } - } - - ngx_quic_finalize_connection(c, qc->shutdown_code, qc->shutdown_reason); -} diff --git a/src/event/quic/ngx_event_quic.h b/src/event/quic/ngx_event_quic.h --- a/src/event/quic/ngx_event_quic.h +++ b/src/event/quic/ngx_event_quic.h @@ -111,8 +111,6 @@ void ngx_quic_terminate_connection(ngx_c const char *reason); void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err, const char *reason); -void ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason); ngx_int_t ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err); ngx_int_t ngx_quic_shutdown_stream(ngx_connection_t *c, int how); ngx_int_t ngx_quic_handle_read_event(ngx_event_t *rev, ngx_uint_t flags); diff --git a/src/event/quic/ngx_event_quic_connection.h b/src/event/quic/ngx_event_quic_connection.h --- a/src/event/quic/ngx_event_quic_connection.h +++ b/src/event/quic/ngx_event_quic_connection.h @@ -246,13 +246,9 @@ struct ngx_quic_connection_s { ngx_uint_t error_ftype; const char *error_reason; - ngx_uint_t shutdown_code; - const char *shutdown_reason; - unsigned error_app:1; unsigned send_timer_set:1; unsigned closing:1; - unsigned shutdown:1; unsigned draining:1; unsigned key_phase:1; unsigned validated:1; @@ -265,7 +261,6 @@ ngx_int_t ngx_quic_apply_transport_param void ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level); void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc); -void ngx_quic_shutdown_quic(ngx_connection_t *c); #if (NGX_DEBUG) void ngx_quic_connstate_dbg(ngx_connection_t *c); diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c --- a/src/event/quic/ngx_event_quic_streams.c +++ b/src/event/quic/ngx_event_quic_streams.c @@ -385,7 +385,7 @@ ngx_quic_get_stream(ngx_connection_t *c, return qs; } - if (qc->shutdown || qc->closing) { + if (qc->closing) { return NGX_QUIC_STREAM_GONE; } @@ -1081,10 +1081,6 @@ ngx_quic_close_stream(ngx_quic_stream_t ngx_quic_queue_frame(qc, frame); } - if (qc->shutdown) { - ngx_post_event(pc->read, &ngx_posted_events); - } - return NGX_OK; } diff --git a/src/http/v3/ngx_http_v3.h b/src/http/v3/ngx_http_v3.h --- a/src/http/v3/ngx_http_v3.h +++ b/src/http/v3/ngx_http_v3.h @@ -95,10 +95,6 @@ ngx_quic_finalize_connection((c)->quic ? (c)->quic->parent : (c), \ code, reason) -#define ngx_http_v3_shutdown_connection(c, code, reason) \ - ngx_quic_shutdown_connection((c)->quic ? (c)->quic->parent : (c), \ - code, reason) - typedef struct { size_t max_table_capacity; 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 @@ -14,6 +14,7 @@ static void ngx_http_v3_init_hq_stream(ngx_connection_t *c); #endif static void ngx_http_v3_init_request_stream(ngx_connection_t *c); +static void ngx_http_v3_cleanup_connection(void *data); static void ngx_http_v3_wait_request_handler(ngx_event_t *rev); static void ngx_http_v3_cleanup_request(void *data); static void ngx_http_v3_process_request(ngx_event_t *rev); @@ -184,6 +185,8 @@ 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; @@ -221,9 +224,10 @@ ngx_http_v3_init_request_stream(ngx_conn return; } + pc = c->quic->parent; + if (n + 1 == clcf->keepalive_requests - || ngx_current_msec - c->quic->parent->start_time - > clcf->keepalive_time) + || ngx_current_msec - pc->start_time > clcf->keepalive_time) { h3c->goaway = 1; @@ -231,9 +235,25 @@ ngx_http_v3_init_request_stream(ngx_conn ngx_http_close_connection(c); return; } + } - ngx_http_v3_shutdown_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "reached maximum number of requests"); + cln = ngx_pool_cleanup_add(c->pool, 0); + if (cln == NULL) { + ngx_quic_finalize_connection(pc, NGX_HTTP_V3_ERR_INTERNAL_ERROR, + "internal error"); + ngx_http_close_connection(c); + return; + } + + cln->handler = ngx_http_v3_cleanup_connection; + cln->data = c; + + if (h3c->nrequests++ == 0) { + ngx_reusable_connection(pc, 0); + } + + if (h3c->keepalive.timer_set) { + ngx_del_timer(&h3c->keepalive); } rev = c->read; @@ -258,16 +278,43 @@ ngx_http_v3_init_request_stream(ngx_conn static void +ngx_http_v3_cleanup_connection(void *data) +{ + ngx_connection_t *c = data; + + ngx_connection_t *pc; + ngx_http_v3_session_t *h3c; + ngx_http_core_loc_conf_t *clcf; + + h3c = ngx_http_v3_get_session(c); + + if (--h3c->nrequests == 0) { + pc = c->quic->parent; + + if (h3c->goaway) { + ngx_quic_finalize_connection(pc, NGX_HTTP_V3_ERR_NO_ERROR, + "connection shutdown"); + return; + } + + ngx_reusable_connection(pc, 1); + + clcf = ngx_http_v3_get_module_loc_conf(c, ngx_http_core_module); + ngx_add_timer(&h3c->keepalive, clcf->keepalive_timeout); + } +} + + +static void ngx_http_v3_wait_request_handler(ngx_event_t *rev) { size_t size; ssize_t n; ngx_buf_t *b; - ngx_connection_t *c, *pc; + ngx_connection_t *c; ngx_pool_cleanup_t *cln; ngx_http_request_t *r; ngx_http_connection_t *hc; - ngx_http_v3_session_t *h3c; ngx_http_core_srv_conf_t *cscf; c = rev->data; @@ -387,16 +434,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++; - - pc = c->quic->parent; - ngx_reusable_connection(pc, 0); - - if (h3c->keepalive.timer_set) { - ngx_del_timer(&h3c->keepalive); - } - rev->handler = ngx_http_v3_process_request; ngx_http_v3_process_request(rev); } @@ -438,30 +475,8 @@ ngx_http_v3_cleanup_request(void *data) { ngx_http_request_t *r = data; - ngx_connection_t *c, *pc; - 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) { - pc = c->quic->parent; - - if (ngx_terminate || ngx_exiting) { - ngx_quic_finalize_connection(pc, NGX_HTTP_V3_ERR_NO_ERROR, NULL); - return; - } - - ngx_reusable_connection(pc, 1); - - clcf = ngx_http_v3_get_module_loc_conf(c, ngx_http_core_module); - ngx_add_timer(&h3c->keepalive, clcf->keepalive_timeout); + r->connection->error = 1; } } _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org