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:
parent
b387ac56b6
commit
c1184c1fde
Notes:
sideshowbarker
2024-07-17 20:04:51 +09:00
Author: https://github.com/alimpfard Commit: https://github.com/SerenityOS/serenity/commit/c1184c1fde5 Pull-request: https://github.com/SerenityOS/serenity/pull/12186
2 changed files with 18 additions and 11 deletions
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue