RequestServer: Replace disconnected sockets in the grace period too

We previously only replaced disconnected sockets on the queued-request
path, leading to attempts to send requests on a disconnected socket if
the disconnection happened in the deletion grace period.
This commit is contained in:
Ali Mohammad Pur 2022-01-28 21:11:54 +03:30 committed by Andreas Kling
parent b387ac56b6
commit c1184c1fde
Notes: sideshowbarker 2024-07-17 20:04:51 +09:00
2 changed files with 18 additions and 11 deletions

View file

@ -50,17 +50,7 @@ void request_did_finish(URL const& url, Core::Socket const* socket)
};
connection->removal_timer->start();
} else {
using SocketType = RemoveCVReference<decltype(*connection->socket)>;
bool is_connected;
if constexpr (IsSame<SocketType, TLS::TLSv12>)
is_connected = connection->socket->is_established();
else
is_connected = connection->socket->is_connected();
if (!is_connected) {
// Create another socket for the connection.
connection->socket = SocketType::construct(nullptr);
dbgln_if(REQUESTSERVER_DEBUG, "Creating a new socket for {} -> {}", url, connection->socket);
}
recreate_socket_if_needed(*connection, url);
dbgln_if(REQUESTSERVER_DEBUG, "Running next job in queue for connection {} @{}", &connection, connection->socket);
auto request = connection->request_queue.take_first();
connection->timer.start();

View file

@ -68,6 +68,22 @@ void dump_jobs();
constexpr static inline size_t MaxConcurrentConnectionsPerURL = 2;
constexpr static inline size_t ConnectionKeepAliveTimeMilliseconds = 10'000;
template<typename T>
void recreate_socket_if_needed(T& connection, URL const& url)
{
using SocketType = RemoveCVReference<decltype(*connection.socket)>;
bool is_connected;
if constexpr (IsSame<SocketType, TLS::TLSv12>)
is_connected = connection.socket->is_established();
else
is_connected = connection.socket->is_connected();
if (!is_connected) {
// Create another socket for the connection.
connection.socket = SocketType::construct(nullptr);
dbgln_if(REQUESTSERVER_DEBUG, "Creating a new socket for {} -> {}", url, connection.socket);
}
}
decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job)
{
using CacheEntryType = RemoveCVReference<decltype(*cache.begin()->value)>;
@ -105,6 +121,7 @@ decltype(auto) get_or_create_connection(auto& cache, URL const& url, auto& job)
}
auto& connection = sockets_for_url[index];
if (!connection.has_started) {
recreate_socket_if_needed(connection, url);
dbgln_if(REQUESTSERVER_DEBUG, "Immediately start request for url {} in {} - {}", url, &connection, connection.socket);
connection.has_started = true;
connection.removal_timer->stop();