]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-h2: handle idle-ping on conn reverse
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Tue, 8 Apr 2025 09:52:41 +0000 (11:52 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 17 Apr 2025 12:49:36 +0000 (14:49 +0200)
This commit extends MUX H2 connection reversal step to properly take
into account the new idle-ping feature. It first ensures that h2c task
is properly instantiated/freed depending now on both timers and
idle-ping configuration. Also, h2c_update_timeout() is now called
instead of manually requeuing the task, which ensures the proper timer
value is selected depending on the new connection side.

doc/configuration.txt
src/mux_h2.c

index b1f471c6a74baea8313ff3891f1a60b8715b7274..62e622e8791e40986e112611f24cb13d98ce59d4 100644 (file)
@@ -17633,6 +17633,10 @@ idle-ping <delay>
   This feature relies on specific underlying protocol support. For now, only H2
   mux implements it. Idle-ping is simply ignored by other protocols.
 
+  This option is particularly useful when using reverse HTTP. Setting it on the
+  bind line is useful for the peer which is responsible to actively initiate
+  connections and will then receive incoming traffic through them.
+
 interface <interface>
   Restricts the socket to a specific interface. When specified, only packets
   received from that particular interface are processed by the socket. This is
@@ -18663,6 +18667,11 @@ idle-ping <delay>
   This feature relies on specific underlying protocol support. For now, only H2
   mux implements it. Idle-ping is simply ignored by other protocols.
 
+  This option is particularly useful when using reverse HTTP. Setting it on the
+  server line is useful for the peer which listen for incoming connections and
+  attach them to a corresponding server to be able to reuse later on traffic
+  forwarding.
+
 init-addr {last | libc | none | <ip>},[...]*
   May be used in the following contexts: tcp, http, log
 
index 697918158d621312207b282b1d8b16e509b91698..dbda2d34b8c85968f4b8208caed95d48ac524555 100644 (file)
@@ -4096,7 +4096,7 @@ static int h2_conn_reverse(struct h2c *h2c)
        /* If only the new side has a defined timeout, task must be allocated.
         * On the contrary, if only old side has a timeout, it must be freed.
         */
-       if (!h2c->task && tick_isset(h2c->timeout)) {
+       if (!h2c->task && (tick_isset(h2c->timeout) || tick_isset(conn_idle_ping(conn)))) {
                h2c->task = task_new_here();
                if (!h2c->task)
                        goto err;
@@ -4104,16 +4104,14 @@ static int h2_conn_reverse(struct h2c *h2c)
                h2c->task->process = h2_timeout_task;
                h2c->task->context = h2c;
        }
-       else if (!tick_isset(h2c->timeout)) {
+       else if (!tick_isset(h2c->timeout) && !tick_isset(conn_idle_ping(conn))) {
                task_destroy(h2c->task);
                h2c->task = NULL;
        }
 
        /* Requeue task if instantiated with the new timeout value. */
-       if (h2c->task) {
-               h2c->task->expire = tick_add(now_ms, h2c->timeout);
-               task_queue(h2c->task);
-       }
+       if (h2c->task)
+               h2c_update_timeout(h2c);
 
        TRACE_LEAVE(H2_EV_H2C_WAKE, h2c->conn);
        return 1;