mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 16:50:48 +00:00
Add separate handshake_timeout for receiving Hello packet from replica
This commit is contained in:
parent
3d26232cc0
commit
846804fed0
@ -1048,6 +1048,12 @@ Timeouts in seconds on the socket used for communicating with the client.
|
||||
|
||||
Default value: 10, 300, 300.
|
||||
|
||||
## handshake_timeout_ms {#handshake-timeout-ms}
|
||||
|
||||
Timeout in milliseconds for receiving Hello packet from replicas during handshake.
|
||||
|
||||
Default value: 300000.
|
||||
|
||||
## cancel_http_readonly_queries_on_client_close {#cancel-http-readonly-queries-on-client-close}
|
||||
|
||||
Cancels HTTP read-only queries (e.g. SELECT) when a client closes the connection without waiting for the response.
|
||||
|
@ -190,7 +190,7 @@ void Connection::connect(const ConnectionTimeouts & timeouts)
|
||||
connected = true;
|
||||
|
||||
sendHello();
|
||||
receiveHello();
|
||||
receiveHello(timeouts.handshake_timeout);
|
||||
if (server_revision >= DBMS_MIN_PROTOCOL_VERSION_WITH_ADDENDUM)
|
||||
sendAddendum();
|
||||
|
||||
@ -305,8 +305,10 @@ void Connection::sendAddendum()
|
||||
}
|
||||
|
||||
|
||||
void Connection::receiveHello()
|
||||
void Connection::receiveHello(const Poco::Timespan & handshake_timeout)
|
||||
{
|
||||
TimeoutSetter timeout_setter(*socket, socket->getSendTimeout(), handshake_timeout);
|
||||
|
||||
/// Receive hello packet.
|
||||
UInt64 packet_type = 0;
|
||||
|
||||
|
@ -256,7 +256,7 @@ private:
|
||||
void connect(const ConnectionTimeouts & timeouts);
|
||||
void sendHello();
|
||||
void sendAddendum();
|
||||
void receiveHello();
|
||||
void receiveHello(const Poco::Timespan & handshake_timeout);
|
||||
|
||||
#if USE_SSL
|
||||
void sendClusterNameAndSalt();
|
||||
|
@ -67,7 +67,8 @@ ConnectionParameters::ConnectionParameters(const Poco::Util::AbstractConfigurati
|
||||
Poco::Timespan(config.getInt("connect_timeout", DBMS_DEFAULT_CONNECT_TIMEOUT_SEC), 0),
|
||||
Poco::Timespan(config.getInt("send_timeout", DBMS_DEFAULT_SEND_TIMEOUT_SEC), 0),
|
||||
Poco::Timespan(config.getInt("receive_timeout", DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC), 0),
|
||||
Poco::Timespan(config.getInt("tcp_keep_alive_timeout", 0), 0));
|
||||
Poco::Timespan(config.getInt("tcp_keep_alive_timeout", 0), 0),
|
||||
Poco::Timespan(config.getInt("handshake_timeout_ms", DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC * 1000), 0));
|
||||
|
||||
timeouts.sync_request_timeout = Poco::Timespan(config.getInt("sync_request_timeout", DBMS_DEFAULT_SYNC_REQUEST_TIMEOUT_SEC), 0);
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ class IColumn;
|
||||
M(UInt64, max_query_size, DBMS_DEFAULT_MAX_QUERY_SIZE, "The maximum number of bytes of a query string parsed by the SQL parser. Data in the VALUES clause of INSERT queries is processed by a separate stream parser (that consumes O(1) RAM) and not affected by this restriction.", 0) \
|
||||
M(UInt64, interactive_delay, 100000, "The interval in microseconds to check if the request is cancelled, and to send progress info.", 0) \
|
||||
M(Seconds, connect_timeout, DBMS_DEFAULT_CONNECT_TIMEOUT_SEC, "Connection timeout if there are no replicas.", 0) \
|
||||
M(Milliseconds, handshake_timeout_ms, DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC * 1000, "Timeout for receiving HELLO packet from replicas.", 0) \
|
||||
M(Milliseconds, connect_timeout_with_failover_ms, 1000, "Connection timeout for selecting first healthy replica.", 0) \
|
||||
M(Milliseconds, connect_timeout_with_failover_secure_ms, 1000, "Connection timeout for selecting first healthy replica (for secure connections).", 0) \
|
||||
M(Seconds, receive_timeout, DBMS_DEFAULT_RECEIVE_TIMEOUT_SEC, "Timeout for receiving data from network, in seconds. If no bytes were received in this interval, exception is thrown. If you set this setting on client, the 'send_timeout' for the socket will be also set on the corresponding connection end on the server.", 0) \
|
||||
|
@ -17,22 +17,7 @@ ConnectionTimeouts::ConnectionTimeouts(
|
||||
, secure_connection_timeout(connection_timeout)
|
||||
, hedged_connection_timeout(receive_timeout_)
|
||||
, receive_data_timeout(receive_timeout_)
|
||||
{
|
||||
}
|
||||
|
||||
ConnectionTimeouts::ConnectionTimeouts(
|
||||
Poco::Timespan connection_timeout_,
|
||||
Poco::Timespan send_timeout_,
|
||||
Poco::Timespan receive_timeout_,
|
||||
Poco::Timespan tcp_keep_alive_timeout_)
|
||||
: connection_timeout(connection_timeout_)
|
||||
, send_timeout(send_timeout_)
|
||||
, receive_timeout(receive_timeout_)
|
||||
, tcp_keep_alive_timeout(tcp_keep_alive_timeout_)
|
||||
, http_keep_alive_timeout(0)
|
||||
, secure_connection_timeout(connection_timeout)
|
||||
, hedged_connection_timeout(receive_timeout_)
|
||||
, receive_data_timeout(receive_timeout_)
|
||||
, handshake_timeout(receive_timeout_)
|
||||
{
|
||||
}
|
||||
|
||||
@ -41,7 +26,26 @@ ConnectionTimeouts::ConnectionTimeouts(
|
||||
Poco::Timespan send_timeout_,
|
||||
Poco::Timespan receive_timeout_,
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan http_keep_alive_timeout_)
|
||||
Poco::Timespan handshake_timeout_)
|
||||
: connection_timeout(connection_timeout_)
|
||||
, send_timeout(send_timeout_)
|
||||
, receive_timeout(receive_timeout_)
|
||||
, tcp_keep_alive_timeout(tcp_keep_alive_timeout_)
|
||||
, http_keep_alive_timeout(0)
|
||||
, secure_connection_timeout(connection_timeout)
|
||||
, hedged_connection_timeout(receive_timeout_)
|
||||
, receive_data_timeout(receive_timeout_)
|
||||
, handshake_timeout(handshake_timeout_)
|
||||
{
|
||||
}
|
||||
|
||||
ConnectionTimeouts::ConnectionTimeouts(
|
||||
Poco::Timespan connection_timeout_,
|
||||
Poco::Timespan send_timeout_,
|
||||
Poco::Timespan receive_timeout_,
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan http_keep_alive_timeout_,
|
||||
Poco::Timespan handshake_timeout_)
|
||||
: connection_timeout(connection_timeout_)
|
||||
, send_timeout(send_timeout_)
|
||||
, receive_timeout(receive_timeout_)
|
||||
@ -50,6 +54,7 @@ ConnectionTimeouts::ConnectionTimeouts(
|
||||
, secure_connection_timeout(connection_timeout)
|
||||
, hedged_connection_timeout(receive_timeout_)
|
||||
, receive_data_timeout(receive_timeout_)
|
||||
, handshake_timeout(handshake_timeout_)
|
||||
{
|
||||
}
|
||||
|
||||
@ -60,16 +65,18 @@ ConnectionTimeouts::ConnectionTimeouts(
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan http_keep_alive_timeout_,
|
||||
Poco::Timespan secure_connection_timeout_,
|
||||
Poco::Timespan receive_hello_timeout_,
|
||||
Poco::Timespan receive_data_timeout_)
|
||||
Poco::Timespan hedged_connection_timeout_,
|
||||
Poco::Timespan receive_data_timeout_,
|
||||
Poco::Timespan handshake_timeout_)
|
||||
: connection_timeout(connection_timeout_)
|
||||
, send_timeout(send_timeout_)
|
||||
, receive_timeout(receive_timeout_)
|
||||
, tcp_keep_alive_timeout(tcp_keep_alive_timeout_)
|
||||
, http_keep_alive_timeout(http_keep_alive_timeout_)
|
||||
, secure_connection_timeout(secure_connection_timeout_)
|
||||
, hedged_connection_timeout(receive_hello_timeout_)
|
||||
, hedged_connection_timeout(hedged_connection_timeout_)
|
||||
, receive_data_timeout(receive_data_timeout_)
|
||||
, handshake_timeout(handshake_timeout_)
|
||||
{
|
||||
}
|
||||
|
||||
@ -90,13 +97,14 @@ ConnectionTimeouts ConnectionTimeouts::getSaturated(Poco::Timespan limit) const
|
||||
saturate(http_keep_alive_timeout, limit),
|
||||
saturate(secure_connection_timeout, limit),
|
||||
saturate(hedged_connection_timeout, limit),
|
||||
saturate(receive_data_timeout, limit));
|
||||
saturate(receive_data_timeout, limit),
|
||||
saturate(handshake_timeout, limit));
|
||||
}
|
||||
|
||||
/// Timeouts for the case when we have just single attempt to connect.
|
||||
ConnectionTimeouts ConnectionTimeouts::getTCPTimeoutsWithoutFailover(const Settings & settings)
|
||||
{
|
||||
return ConnectionTimeouts(settings.connect_timeout, settings.send_timeout, settings.receive_timeout, settings.tcp_keep_alive_timeout);
|
||||
return ConnectionTimeouts(settings.connect_timeout, settings.send_timeout, settings.receive_timeout, settings.tcp_keep_alive_timeout, settings.handshake_timeout_ms);
|
||||
}
|
||||
|
||||
/// Timeouts for the case when we will try many addresses in a loop.
|
||||
@ -110,7 +118,8 @@ ConnectionTimeouts ConnectionTimeouts::getTCPTimeoutsWithFailover(const Settings
|
||||
0,
|
||||
settings.connect_timeout_with_failover_secure_ms,
|
||||
settings.hedged_connection_timeout_ms,
|
||||
settings.receive_data_timeout_ms);
|
||||
settings.receive_data_timeout_ms,
|
||||
settings.handshake_timeout_ms);
|
||||
}
|
||||
|
||||
ConnectionTimeouts ConnectionTimeouts::getHTTPTimeouts(const Settings & settings, Poco::Timespan http_keep_alive_timeout)
|
||||
@ -120,7 +129,8 @@ ConnectionTimeouts ConnectionTimeouts::getHTTPTimeouts(const Settings & settings
|
||||
settings.http_send_timeout,
|
||||
settings.http_receive_timeout,
|
||||
settings.tcp_keep_alive_timeout,
|
||||
http_keep_alive_timeout);
|
||||
http_keep_alive_timeout,
|
||||
settings.http_receive_timeout);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,6 +23,9 @@ struct ConnectionTimeouts
|
||||
Poco::Timespan hedged_connection_timeout;
|
||||
Poco::Timespan receive_data_timeout;
|
||||
|
||||
/// Timeout for receiving HELLO packet
|
||||
Poco::Timespan handshake_timeout;
|
||||
|
||||
/// Timeout for synchronous request-result protocol call (like Ping or TablesStatus)
|
||||
Poco::Timespan sync_request_timeout = Poco::Timespan(DBMS_DEFAULT_SYNC_REQUEST_TIMEOUT_SEC, 0);
|
||||
|
||||
@ -35,13 +38,15 @@ struct ConnectionTimeouts
|
||||
ConnectionTimeouts(Poco::Timespan connection_timeout_,
|
||||
Poco::Timespan send_timeout_,
|
||||
Poco::Timespan receive_timeout_,
|
||||
Poco::Timespan tcp_keep_alive_timeout_);
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan handshake_timeout_);
|
||||
|
||||
ConnectionTimeouts(Poco::Timespan connection_timeout_,
|
||||
Poco::Timespan send_timeout_,
|
||||
Poco::Timespan receive_timeout_,
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan http_keep_alive_timeout_);
|
||||
Poco::Timespan http_keep_alive_timeout_,
|
||||
Poco::Timespan handshake_timeout_);
|
||||
|
||||
ConnectionTimeouts(Poco::Timespan connection_timeout_,
|
||||
Poco::Timespan send_timeout_,
|
||||
@ -49,8 +54,9 @@ struct ConnectionTimeouts
|
||||
Poco::Timespan tcp_keep_alive_timeout_,
|
||||
Poco::Timespan http_keep_alive_timeout_,
|
||||
Poco::Timespan secure_connection_timeout_,
|
||||
Poco::Timespan receive_hello_timeout_,
|
||||
Poco::Timespan receive_data_timeout_);
|
||||
Poco::Timespan hedged_connection_timeout_,
|
||||
Poco::Timespan receive_data_timeout_,
|
||||
Poco::Timespan handshake_timeout_);
|
||||
|
||||
static Poco::Timespan saturate(Poco::Timespan timespan, Poco::Timespan limit);
|
||||
ConnectionTimeouts getSaturated(Poco::Timespan limit) const;
|
||||
|
@ -1296,6 +1296,13 @@ void TCPHandler::receiveUnexpectedHello()
|
||||
|
||||
void TCPHandler::sendHello()
|
||||
{
|
||||
if (unlikely(sleep_in_send_tables_status.totalMilliseconds()))
|
||||
{
|
||||
out->next();
|
||||
std::chrono::milliseconds ms(sleep_in_send_tables_status.totalMilliseconds());
|
||||
std::this_thread::sleep_for(ms);
|
||||
}
|
||||
|
||||
writeVarUInt(Protocol::Server::Hello, *out);
|
||||
writeStringBinary(DBMS_NAME, *out);
|
||||
writeVarUInt(DBMS_VERSION_MAJOR, *out);
|
||||
|
Loading…
Reference in New Issue
Block a user