]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
DoH: Limit the number of delayed IO processing requests
authorArtem Boldariev <artem@boldariev.com>
Mon, 24 Feb 2025 16:32:23 +0000 (18:32 +0200)
committerArtem Boldariev <artem@boldariev.com>
Mon, 3 Mar 2025 09:32:11 +0000 (11:32 +0200)
Previously, a function for continuing IO processing on the next UV
tick was introduced (http_do_bio_async()). The intention behind this
function was to ensure that http_do_bio() is eventually called at
least once in the future. However, the current implementation allows
queueing multiple such delayed requests needlessly. There is currently
no need for these excessive requests as http_do_bio() can requeue them
if needed. At the same time, each such request can lead to a memory
allocation, particularly in BIND 9.18.

This commit ensures that the number of enqueued delayed IO processing
requests never exceeds one in order to avoid potentially bombarding IO
threads with the delayed requests needlessly.

lib/isc/netmgr/http.c

index 21a52936dccd1708f598f0d67283fcd7e0767be3..1e440837b3dc02386c9f90a539850fba420dc8e0 100644 (file)
@@ -190,6 +190,8 @@ struct isc_nm_http_session {
 
        size_t data_in_flight;
 
+       bool async_queued;
+
        /*
         * The statistical values below are for usage on server-side
         * only. They are meant to detect clients that are taking too many
@@ -1725,6 +1727,8 @@ http_do_bio_async_cb(void *arg) {
 
        REQUIRE(VALID_HTTP2_SESSION(session));
 
+       session->async_queued = false;
+
        if (session->handle != NULL &&
            !isc__nmsocket_closing(session->handle->sock))
        {
@@ -1741,10 +1745,12 @@ http_do_bio_async(isc_nm_http_session_t *session) {
        REQUIRE(VALID_HTTP2_SESSION(session));
 
        if (session->handle == NULL ||
-           isc__nmsocket_closing(session->handle->sock))
+           isc__nmsocket_closing(session->handle->sock) ||
+           session->async_queued)
        {
                return;
        }
+       session->async_queued = true;
        isc__nm_httpsession_attach(session, &tmpsess);
        isc_async_run(session->handle->sock->worker->loop, http_do_bio_async_cb,
                      tmpsess);