Latest update - 9207

This commit is contained in:
2024-02-01 10:29:43 +09:00
parent c377e65044
commit 3261561cf8
13 changed files with 192 additions and 37 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2002-2021 Igor Sysoev * Copyright (C) 2002-2021 Igor Sysoev
* Copyright (C) 2011-2023 Nginx, Inc. * Copyright (C) 2011-2024 Nginx, Inc.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
+3
View File
@@ -5226,6 +5226,9 @@ ngx_ssl_get_curves(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)
} }
curves = ngx_palloc(pool, n * sizeof(int)); curves = ngx_palloc(pool, n * sizeof(int));
if (curves == NULL) {
return NGX_ERROR;
}
n = SSL_get1_curves(c->ssl->connection, curves); n = SSL_get1_curves(c->ssl->connection, curves);
len = 0; len = 0;
+6 -2
View File
@@ -57,7 +57,9 @@ ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write)
do_write = 1; do_write = 1;
} }
if (p->upstream->fd != (ngx_socket_t) -1) { if (p->upstream
&& p->upstream->fd != (ngx_socket_t) -1)
{
rev = p->upstream->read; rev = p->upstream->read;
flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0; flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0;
@@ -108,7 +110,9 @@ ngx_event_pipe_read_upstream(ngx_event_pipe_t *p)
ngx_msec_t delay; ngx_msec_t delay;
ngx_chain_t *chain, *cl, *ln; ngx_chain_t *chain, *cl, *ln;
if (p->upstream_eof || p->upstream_error || p->upstream_done) { if (p->upstream_eof || p->upstream_error || p->upstream_done
|| p->upstream == NULL)
{
return NGX_OK; return NGX_OK;
} }
+39 -4
View File
@@ -170,6 +170,8 @@ ngx_http_copy_aio_handler(ngx_output_chain_ctx_t *ctx, ngx_file_t *file)
file->aio->data = r; file->aio->data = r;
file->aio->handler = ngx_http_copy_aio_event_handler; file->aio->handler = ngx_http_copy_aio_event_handler;
ngx_add_timer(&file->aio->event, 60000);
r->main->blocked++; r->main->blocked++;
r->aio = 1; r->aio = 1;
ctx->aio = 1; ctx->aio = 1;
@@ -192,13 +194,33 @@ ngx_http_copy_aio_event_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http aio: \"%V?%V\"", &r->uri, &r->args); "http aio: \"%V?%V\"", &r->uri, &r->args);
if (ev->timedout) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"aio operation took too long");
ev->timedout = 0;
return;
}
if (ev->timer_set) {
ngx_del_timer(ev);
}
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
r->write_event_handler(r); if (r->main->terminated) {
/*
* trigger connection event handler if the request was
* terminated
*/
c->write->handler(c->write);
} else {
r->write_event_handler(r);
ngx_http_run_posted_requests(c); ngx_http_run_posted_requests(c);
} }
}
#endif #endif
@@ -264,6 +286,8 @@ ngx_http_copy_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)
return NGX_ERROR; return NGX_ERROR;
} }
ngx_add_timer(&task->event, 60000);
r->main->blocked++; r->main->blocked++;
r->aio = 1; r->aio = 1;
@@ -288,6 +312,17 @@ ngx_http_copy_thread_event_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http thread: \"%V?%V\"", &r->uri, &r->args); "http thread: \"%V?%V\"", &r->uri, &r->args);
if (ev->timedout) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"thread operation took too long");
ev->timedout = 0;
return;
}
if (ev->timer_set) {
ngx_del_timer(ev);
}
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
@@ -305,11 +340,11 @@ ngx_http_copy_thread_event_handler(ngx_event_t *ev)
#endif #endif
if (r->done) { if (r->done || r->main->terminated) {
/* /*
* trigger connection event handler if the subrequest was * trigger connection event handler if the subrequest was
* already finalized; this can happen if the handler is used * already finalized (this can happen if the handler is used
* for sendfile() in threads * for sendfile() in threads), or if the request was terminated
*/ */
c->write->handler(c->write); c->write->handler(c->write);
+31 -5
View File
@@ -3961,7 +3961,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
ngx_str_t *value, size; ngx_str_t *value, size;
ngx_url_t u; ngx_url_t u;
ngx_uint_t n, i; ngx_uint_t n, i, backlog;
ngx_http_listen_opt_t lsopt; ngx_http_listen_opt_t lsopt;
cscf->listen = 1; cscf->listen = 1;
@@ -4000,6 +4000,8 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
lsopt.ipv6only = 1; lsopt.ipv6only = 1;
#endif #endif
backlog = 0;
for (n = 2; n < cf->args->nelts; n++) { for (n = 2; n < cf->args->nelts; n++) {
if (ngx_strcmp(value[n].data, "default_server") == 0 if (ngx_strcmp(value[n].data, "default_server") == 0
@@ -4058,6 +4060,8 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
return NGX_CONF_ERROR; return NGX_CONF_ERROR;
} }
backlog = 1;
continue; continue;
} }
@@ -4305,9 +4309,29 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
return NGX_CONF_ERROR; return NGX_CONF_ERROR;
} }
#if (NGX_HTTP_V3)
if (lsopt.quic) { if (lsopt.quic) {
#if (NGX_HAVE_TCP_FASTOPEN)
if (lsopt.fastopen != -1) {
return "\"fastopen\" parameter is incompatible with \"quic\"";
}
#endif
if (backlog) {
return "\"backlog\" parameter is incompatible with \"quic\"";
}
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
if (lsopt.accept_filter) {
return "\"accept_filter\" parameter is incompatible with \"quic\"";
}
#endif
#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
if (lsopt.deferred_accept) {
return "\"deferred\" parameter is incompatible with \"quic\"";
}
#endif
#if (NGX_HTTP_SSL) #if (NGX_HTTP_SSL)
if (lsopt.ssl) { if (lsopt.ssl) {
return "\"ssl\" parameter is incompatible with \"quic\""; return "\"ssl\" parameter is incompatible with \"quic\"";
@@ -4320,13 +4344,15 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
} }
#endif #endif
if (lsopt.so_keepalive) {
return "\"so_keepalive\" parameter is incompatible with \"quic\"";
}
if (lsopt.proxy_protocol) { if (lsopt.proxy_protocol) {
return "\"proxy_protocol\" parameter is incompatible with \"quic\""; return "\"proxy_protocol\" parameter is incompatible with \"quic\"";
} }
} }
#endif
for (n = 0; n < u.naddrs; n++) { for (n = 0; n < u.naddrs; n++) {
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
+71 -12
View File
@@ -14,7 +14,7 @@
static ngx_int_t ngx_http_file_cache_lock(ngx_http_request_t *r, static ngx_int_t ngx_http_file_cache_lock(ngx_http_request_t *r,
ngx_http_cache_t *c); ngx_http_cache_t *c);
static void ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev); static void ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev);
static void ngx_http_file_cache_lock_wait(ngx_http_request_t *r, static ngx_int_t ngx_http_file_cache_lock_wait(ngx_http_request_t *r,
ngx_http_cache_t *c); ngx_http_cache_t *c);
static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r, static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,
ngx_http_cache_t *c); ngx_http_cache_t *c);
@@ -463,6 +463,7 @@ ngx_http_file_cache_lock(ngx_http_request_t *r, ngx_http_cache_t *c)
static void static void
ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev) ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev)
{ {
ngx_int_t rc;
ngx_connection_t *c; ngx_connection_t *c;
ngx_http_request_t *r; ngx_http_request_t *r;
@@ -474,13 +475,31 @@ ngx_http_file_cache_lock_wait_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http file cache wait: \"%V?%V\"", &r->uri, &r->args); "http file cache wait: \"%V?%V\"", &r->uri, &r->args);
ngx_http_file_cache_lock_wait(r, r->cache); rc = ngx_http_file_cache_lock_wait(r, r->cache);
if (rc == NGX_AGAIN) {
return;
}
r->cache->waiting = 0;
r->main->blocked--;
if (r->main->terminated) {
/*
* trigger connection event handler if the request was
* terminated
*/
c->write->handler(c->write);
} else {
r->write_event_handler(r);
ngx_http_run_posted_requests(c); ngx_http_run_posted_requests(c);
} }
}
static void static ngx_int_t
ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c) ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)
{ {
ngx_uint_t wait; ngx_uint_t wait;
@@ -495,7 +514,7 @@ ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
"cache lock timeout"); "cache lock timeout");
c->lock_timeout = 0; c->lock_timeout = 0;
goto wakeup; return NGX_OK;
} }
cache = c->file_cache; cache = c->file_cache;
@@ -513,14 +532,10 @@ ngx_http_file_cache_lock_wait(ngx_http_request_t *r, ngx_http_cache_t *c)
if (wait) { if (wait) {
ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer); ngx_add_timer(&c->wait_event, (timer > 500) ? 500 : timer);
return; return NGX_AGAIN;
} }
wakeup: return NGX_OK;
c->waiting = 0;
r->main->blocked--;
r->write_event_handler(r);
} }
@@ -690,6 +705,8 @@ ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)
c->file.aio->data = r; c->file.aio->data = r;
c->file.aio->handler = ngx_http_cache_aio_event_handler; c->file.aio->handler = ngx_http_cache_aio_event_handler;
ngx_add_timer(&c->file.aio->event, 60000);
r->main->blocked++; r->main->blocked++;
r->aio = 1; r->aio = 1;
@@ -737,13 +754,33 @@ ngx_http_cache_aio_event_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http file cache aio: \"%V?%V\"", &r->uri, &r->args); "http file cache aio: \"%V?%V\"", &r->uri, &r->args);
if (ev->timedout) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"aio operation took too long");
ev->timedout = 0;
return;
}
if (ev->timer_set) {
ngx_del_timer(ev);
}
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
r->write_event_handler(r); if (r->main->terminated) {
/*
* trigger connection event handler if the request was
* terminated
*/
c->write->handler(c->write);
} else {
r->write_event_handler(r);
ngx_http_run_posted_requests(c); ngx_http_run_posted_requests(c);
} }
}
#endif #endif
@@ -786,6 +823,8 @@ ngx_http_cache_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)
return NGX_ERROR; return NGX_ERROR;
} }
ngx_add_timer(&task->event, 60000);
r->main->blocked++; r->main->blocked++;
r->aio = 1; r->aio = 1;
@@ -807,13 +846,33 @@ ngx_http_cache_thread_event_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http file cache thread: \"%V?%V\"", &r->uri, &r->args); "http file cache thread: \"%V?%V\"", &r->uri, &r->args);
if (ev->timedout) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"thread operation took too long");
ev->timedout = 0;
return;
}
if (ev->timer_set) {
ngx_del_timer(ev);
}
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
r->write_event_handler(r); if (r->main->terminated) {
/*
* trigger connection event handler if the request was
* terminated
*/
c->write->handler(c->write);
} else {
r->write_event_handler(r);
ngx_http_run_posted_requests(c); ngx_http_run_posted_requests(c);
} }
}
#endif #endif
+5
View File
@@ -2694,6 +2694,8 @@ ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http terminate request count:%d", mr->count); "http terminate request count:%d", mr->count);
mr->terminated = 1;
if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) { if (rc > 0 && (mr->headers_out.status == 0 || mr->connection->sent == 0)) {
mr->headers_out.status = rc; mr->headers_out.status = rc;
} }
@@ -2716,8 +2718,11 @@ ngx_http_terminate_request(ngx_http_request_t *r, ngx_int_t rc)
if (mr->write_event_handler) { if (mr->write_event_handler) {
if (mr->blocked) { if (mr->blocked) {
r = r->connection->data;
r->connection->error = 1; r->connection->error = 1;
r->write_event_handler = ngx_http_request_finalizer; r->write_event_handler = ngx_http_request_finalizer;
return; return;
} }
+1
View File
@@ -550,6 +550,7 @@ struct ngx_http_request_s {
unsigned root_tested:1; unsigned root_tested:1;
unsigned done:1; unsigned done:1;
unsigned logged:1; unsigned logged:1;
unsigned terminated:1;
unsigned buffered:4; unsigned buffered:4;
+20 -3
View File
@@ -3949,6 +3949,8 @@ ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file)
r->aio = 1; r->aio = 1;
p->aio = 1; p->aio = 1;
ngx_add_timer(&task->event, 60000);
return NGX_OK; return NGX_OK;
} }
@@ -3967,6 +3969,17 @@ ngx_http_upstream_thread_event_handler(ngx_event_t *ev)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http upstream thread: \"%V?%V\"", &r->uri, &r->args); "http upstream thread: \"%V?%V\"", &r->uri, &r->args);
if (ev->timedout) {
ngx_log_error(NGX_LOG_ALERT, c->log, 0,
"thread operation took too long");
ev->timedout = 0;
return;
}
if (ev->timer_set) {
ngx_del_timer(ev);
}
r->main->blocked--; r->main->blocked--;
r->aio = 0; r->aio = 0;
@@ -3984,11 +3997,11 @@ ngx_http_upstream_thread_event_handler(ngx_event_t *ev)
#endif #endif
if (r->done) { if (r->done || r->main->terminated) {
/* /*
* trigger connection event handler if the subrequest was * trigger connection event handler if the subrequest was
* already finalized; this can happen if the handler is used * already finalized (this can happen if the handler is used
* for sendfile() in threads * for sendfile() in threads), or if the request was terminated
*/ */
c->write->handler(c->write); c->write->handler(c->write);
@@ -4561,6 +4574,10 @@ ngx_http_upstream_finalize_request(ngx_http_request_t *r,
u->peer.connection = NULL; u->peer.connection = NULL;
if (u->pipe) {
u->pipe->upstream = NULL;
}
if (u->pipe && u->pipe->temp_file) { if (u->pipe && u->pipe->temp_file) {
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http upstream temp fd: %d", "http upstream temp fd: %d",
+4
View File
@@ -110,6 +110,8 @@ ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
return NGX_ERROR; return NGX_ERROR;
} }
task->event.log = file->log;
file->thread_task = task; file->thread_task = task;
} }
@@ -493,6 +495,8 @@ ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
return NGX_ERROR; return NGX_ERROR;
} }
task->event.log = file->log;
file->thread_task = task; file->thread_task = task;
} }
+1
View File
@@ -332,6 +332,7 @@ ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file, size_t size)
return NGX_ERROR; return NGX_ERROR;
} }
task->event.log = c->log;
task->handler = ngx_linux_sendfile_thread_handler; task->handler = ngx_linux_sendfile_thread_handler;
c->sendfile_task = task; c->sendfile_task = task;
+2 -2
View File
@@ -948,7 +948,7 @@ ngx_worker_process_exit(ngx_cycle_t *cycle)
} }
} }
if (ngx_exiting) { if (ngx_exiting && !ngx_terminate) {
c = cycle->connections; c = cycle->connections;
for (i = 0; i < cycle->connection_n; i++) { for (i = 0; i < cycle->connection_n; i++) {
if (c[i].fd != -1 if (c[i].fd != -1
@@ -963,12 +963,12 @@ ngx_worker_process_exit(ngx_cycle_t *cycle)
ngx_debug_quit = 1; ngx_debug_quit = 1;
} }
} }
}
if (ngx_debug_quit) { if (ngx_debug_quit) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting"); ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting");
ngx_debug_point(); ngx_debug_point();
} }
}
/* /*
* Copy ngx_cycle->log related data to the special static exit cycle, * Copy ngx_cycle->log related data to the special static exit cycle,
+1 -1
View File
@@ -834,7 +834,7 @@ ngx_worker_process_exit(ngx_cycle_t *cycle)
} }
} }
if (ngx_exiting) { if (ngx_exiting && !ngx_terminate) {
c = cycle->connections; c = cycle->connections;
for (i = 0; i < cycle->connection_n; i++) { for (i = 0; i < cycle->connection_n; i++) {
if (c[i].fd != (ngx_socket_t) -1 if (c[i].fd != (ngx_socket_t) -1