2018-03-28 14:07:28 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <Poco/Timespan.h>
|
|
|
|
#include <Poco/Net/StreamSocket.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
/// Temporarily overrides socket send/recieve timeouts and reset them back into destructor
|
|
|
|
/// Timeouts could be only decreased
|
|
|
|
struct TimeoutSetter
|
|
|
|
{
|
2018-04-04 12:11:38 +00:00
|
|
|
TimeoutSetter(Poco::Net::StreamSocket & socket_, const Poco::Timespan & send_timeout_, const Poco::Timespan & recieve_timeout_,
|
|
|
|
bool limit_max_timeout = false)
|
2018-03-28 14:07:28 +00:00
|
|
|
: socket(socket_), send_timeout(send_timeout_), recieve_timeout(recieve_timeout_)
|
|
|
|
{
|
|
|
|
old_send_timeout = socket.getSendTimeout();
|
|
|
|
old_receive_timeout = socket.getReceiveTimeout();
|
|
|
|
|
2018-04-04 12:11:38 +00:00
|
|
|
if (!limit_max_timeout || old_send_timeout > send_timeout)
|
2018-03-28 14:07:28 +00:00
|
|
|
socket.setSendTimeout(send_timeout);
|
|
|
|
|
2018-04-04 12:11:38 +00:00
|
|
|
if (!limit_max_timeout || old_receive_timeout > recieve_timeout)
|
2018-03-28 14:07:28 +00:00
|
|
|
socket.setReceiveTimeout(recieve_timeout);
|
|
|
|
}
|
|
|
|
|
2018-04-04 12:11:38 +00:00
|
|
|
TimeoutSetter(Poco::Net::StreamSocket & socket_, const Poco::Timespan & timeout_, bool limit_max_timeout = false)
|
|
|
|
: TimeoutSetter(socket_, timeout_, timeout_, limit_max_timeout) {}
|
2018-03-28 14:07:28 +00:00
|
|
|
|
|
|
|
~TimeoutSetter()
|
|
|
|
{
|
|
|
|
socket.setSendTimeout(old_send_timeout);
|
|
|
|
socket.setReceiveTimeout(old_receive_timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
Poco::Net::StreamSocket & socket;
|
|
|
|
|
|
|
|
Poco::Timespan send_timeout;
|
|
|
|
Poco::Timespan recieve_timeout;
|
|
|
|
|
|
|
|
Poco::Timespan old_send_timeout;
|
|
|
|
Poco::Timespan old_receive_timeout;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
}
|