diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2021-12-27 19:48:42 +0300 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2021-12-27 19:48:42 +0300 |
commit | 2a00e6141f154d77a835e53b6527a1b3225f6f74 (patch) | |
tree | 948a3adf557d6c070e9d7160c3105c0d02044fb6 /src | |
parent | 20c35434ef8d185cc70e8d68ef4730ce08f8b7d6 (diff) | |
download | nginx-2a00e6141f154d77a835e53b6527a1b3225f6f74.tar.gz nginx-2a00e6141f154d77a835e53b6527a1b3225f6f74.zip |
SSL: SSL_sendfile(SF_NODISKIO) support.
Diffstat (limited to 'src')
-rw-r--r-- | src/event/ngx_event_openssl.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c index b03ca59ae..57e2d44ca 100644 --- a/src/event/ngx_event_openssl.c +++ b/src/event/ngx_event_openssl.c @@ -2942,7 +2942,7 @@ ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) { #ifdef BIO_get_ktls_send - int sslerr; + int sslerr, flags; ssize_t n; ngx_err_t err; @@ -2954,8 +2954,14 @@ ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) ngx_set_errno(0); +#if (NGX_HAVE_SENDFILE_NODISKIO) + flags = (c->busy_count <= 2) ? SF_NODISKIO : 0; +#else + flags = 0; +#endif + n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos, - size, 0); + size, flags); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %d", n); @@ -2974,6 +2980,10 @@ ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) ngx_post_event(c->read, &ngx_posted_events); } +#if (NGX_HAVE_SENDFILE_NODISKIO) + c->busy_count = 0; +#endif + c->sent += n; return n; @@ -3038,6 +3048,23 @@ ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) ngx_post_event(c->read, &ngx_posted_events); } +#if (NGX_HAVE_SENDFILE_NODISKIO) + + if (ngx_errno == EBUSY) { + c->busy_count++; + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, + "SSL_sendfile() busy, count:%d", c->busy_count); + + if (c->write->posted) { + ngx_delete_posted_event(c->write); + } + + ngx_post_event(c->write, &ngx_posted_next_events); + } + +#endif + c->write->ready = 0; return NGX_AGAIN; } |