Mercurial > hg > nginx
view src/http/v3/ngx_http_v3.c @ 9202:e88cdaa0f1ff
AIO operations now add timers (ticket #2162).
Each AIO (thread IO) operation being run is now accompanied with 1-minute
timer. This timer prevents unexpected shutdown of the worker process while
an AIO operation is running, and logs an alert if the operation is running
for too long.
This fixes "open socket left" alerts during worker processes shutdown
due to pending AIO (or thread IO) operations while corresponding requests
have no timers. In particular, such errors were observed while reading
cache headers (ticket #2162), and with worker_shutdown_timeout.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 29 Jan 2024 10:31:37 +0300 |
parents | 4939fd04737f |
children |
line wrap: on
line source
/* * Copyright (C) Roman Arutyunyan * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static void ngx_http_v3_keepalive_handler(ngx_event_t *ev); static void ngx_http_v3_cleanup_session(void *data); ngx_int_t ngx_http_v3_init_session(ngx_connection_t *c) { ngx_pool_cleanup_t *cln; ngx_http_connection_t *hc; ngx_http_v3_session_t *h3c; hc = c->data; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init session"); h3c = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_session_t)); if (h3c == NULL) { goto failed; } h3c->http_connection = hc; ngx_queue_init(&h3c->blocked); h3c->keepalive.log = c->log; h3c->keepalive.data = c; h3c->keepalive.handler = ngx_http_v3_keepalive_handler; h3c->table.send_insert_count.log = c->log; h3c->table.send_insert_count.data = c; h3c->table.send_insert_count.handler = ngx_http_v3_inc_insert_count_handler; cln = ngx_pool_cleanup_add(c->pool, 0); if (cln == NULL) { goto failed; } cln->handler = ngx_http_v3_cleanup_session; cln->data = h3c; c->data = h3c; return NGX_OK; failed: ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create http3 session"); return NGX_ERROR; } static void ngx_http_v3_keepalive_handler(ngx_event_t *ev) { ngx_connection_t *c; c = ev->data; ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 keepalive handler"); ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, "keepalive timeout"); } static void ngx_http_v3_cleanup_session(void *data) { ngx_http_v3_session_t *h3c = data; ngx_http_v3_cleanup_table(h3c); if (h3c->keepalive.timer_set) { ngx_del_timer(&h3c->keepalive); } if (h3c->table.send_insert_count.posted) { ngx_delete_posted_event(&h3c->table.send_insert_count); } } ngx_int_t ngx_http_v3_check_flood(ngx_connection_t *c) { ngx_http_v3_session_t *h3c; h3c = ngx_http_v3_get_session(c); if (h3c->total_bytes / 8 > h3c->payload_bytes + 1048576) { ngx_log_error(NGX_LOG_INFO, c->log, 0, "http3 flood detected"); ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, "HTTP/3 flood detected"); return NGX_ERROR; } return NGX_OK; }