From d115950164c7cda64c1ed69f5432ab8b8f0c4435 Mon Sep 17 00:00:00 2001 From: Arun Sharma Date: Tue, 1 Sep 2026 09:48:37 -0700 Subject: [PATCH] fix(httpfs): disable SO_REUSEPORT in the test http server RepeatOpenDoesNotIssueSecondHead failed flakily in the ladybug repo CI (headCount()==0) under `ctest -j10`. The vendored httplib enables SO_REUSEPORT by default on Linux, which lets multiple sockets bind the same port and load-balances connections between them. ctest runs each gtest case in its own process, so two concurrent test processes both successfully bound 127.0.0.1:18123 and the kernel routed some requests to the other process's server - the HEAD-count assertion then observed requests that never reached the server it was checking (reproduced locally: two concurrent processes both bound 18123, and the failing process saw headCount 0 or 2). Override the server socket options to set only SO_REUSEADDR so a second bind of the same port fails with EADDRINUSE and the existing port scan falls through to a genuinely free port. 20 consecutive `ctest -j10` runs pass with this change; without it ~25% of runs failed. --- httpfs/test/httpfs_test.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/httpfs/test/httpfs_test.cpp b/httpfs/test/httpfs_test.cpp index 44f9aa2f..d59fdff9 100644 --- a/httpfs/test/httpfs_test.cpp +++ b/httpfs/test/httpfs_test.cpp @@ -39,6 +39,18 @@ class LocalHttpServer { } return httplib::Server::HandlerResponse::Unhandled; }); + // The vendored httplib enables SO_REUSEPORT by default on Linux, which + // allows multiple sockets to bind the same port and load-balances + // connections between them. When ctest runs these tests in parallel, + // two processes' servers then share a port and requests land on the + // wrong server, making request counts flaky (observed as headCount()==0 + // under `ctest -j10`). Restrict to SO_REUSEADDR so a second bind fails + // and the loop below picks a genuinely free port instead. + server_.set_socket_options([](socket_t sock) { + int yes = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&yes), + sizeof(yes)); + }); for (int port = 18123; port < 18153; ++port) { if (server_.bind_to_port("127.0.0.1", port)) { port_ = port;