]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: sink: distinguish between hard and soft close in _sink_forward_io_handler()
authorAurelien DARRAGON <adarragon@haproxy.com>
Tue, 23 Jul 2024 17:18:32 +0000 (19:18 +0200)
committerAurelien DARRAGON <adarragon@haproxy.com>
Wed, 24 Jul 2024 15:58:52 +0000 (17:58 +0200)
Aborting the socket on soft-stop is not the same as aborting it due to
unexpected error. As such, let's leverage the granularity offered by
sedesc flags to better reflect the situation: abort during soft-stop is
handled as a soft close thanks to EOI+EOS flags, while abort due to
unexpected error is handled as hard error thanks to ERROR+EOS flags.

Thanks to this change, hard error will always emit RST packet even if
the NOLINGER option wasn't set on the socket.

src/sink.c

index 18c519a7d313472ebbd53f17c9f9fe60dbb0d95e..d935f49a8273a7fdf284aa073a019fcc26542797 100644 (file)
@@ -361,7 +361,7 @@ static void _sink_forward_io_handler(struct appctx *appctx,
 
        /* if stopping was requested, close immediately */
        if (unlikely(stopping))
-               goto close;
+               goto soft_close;
 
        /* if the connection is not established, inform the stream that we want
         * to be notified whenever the connection completes.
@@ -377,7 +377,7 @@ static void _sink_forward_io_handler(struct appctx *appctx,
        if (appctx != sft->appctx) {
                /* FIXME: is this even supposed to happen? */
                HA_SPIN_UNLOCK(SFT_LOCK, &sft->lock);
-               goto close;
+               goto hard_close;
        }
 
        MT_LIST_DELETE(&appctx->wait_entry);
@@ -404,8 +404,11 @@ out:
        co_skip(sc_oc(sc), sc_oc(sc)->output);
        return;
 
-close:
+soft_close:
        se_fl_set(appctx->sedesc, SE_FL_EOS|SE_FL_EOI);
+       return;
+hard_close:
+       se_fl_set(appctx->sedesc, SE_FL_EOS|SE_FL_ERROR);
 }
 
 /*