1
0
mirror of https://github.com/xmrig/xmrig.git synced 2025-12-11 09:22:48 -05:00

Backport unified client timer from proxy project.

This commit is contained in:
XMRig
2017-08-14 08:41:54 +03:00
parent 5ad1a48489
commit 9975b4e4cd
13 changed files with 105 additions and 22 deletions

View File

@@ -56,13 +56,14 @@ Client::Client(int id, const char *agent, IClientListener *listener) :
m_failures(0),
m_recvBufPos(0),
m_state(UnconnectedState),
m_expire(0),
m_stream(nullptr),
m_socket(nullptr)
{
memset(m_ip, 0, sizeof(m_ip));
memset(&m_hints, 0, sizeof(m_hints));
m_resolver.data = m_responseTimer.data = m_retriesTimer.data = m_keepAliveTimer.data = this;
m_resolver.data = this;
m_hints.ai_family = PF_INET;
m_hints.ai_socktype = SOCK_STREAM;
@@ -71,10 +72,10 @@ Client::Client(int id, const char *agent, IClientListener *listener) :
m_recvBuf.base = static_cast<char*>(malloc(kRecvBufSize));
m_recvBuf.len = kRecvBufSize;
auto loop = uv_default_loop();
uv_timer_init(loop, &m_retriesTimer);
uv_timer_init(loop, &m_responseTimer);
uv_timer_init(loop, &m_keepAliveTimer);
# ifndef XMRIG_PROXY_PROJECT
m_keepAliveTimer.data = this;
uv_timer_init(uv_default_loop(), &m_keepAliveTimer);
# endif
}
@@ -93,7 +94,7 @@ Client::~Client()
int64_t Client::send(char *data, size_t size)
{
LOG_DEBUG("[%s:%u] send (%d bytes): \"%s\"", m_url.host(), m_url.port(), size ? size : strlen(data), data);
if (state() != ConnectedState) {
if (state() != ConnectedState || !uv_is_writable(m_stream)) {
LOG_DEBUG_ERR("[%s:%u] send failed, invalid state: %d", m_url.host(), m_url.port(), m_state);
return -1;
}
@@ -108,8 +109,7 @@ int64_t Client::send(char *data, size_t size)
delete req;
});
uv_timer_start(&m_responseTimer, [](uv_timer_t *handle) { getClient(handle->data)->close(); }, kResponseTimeout, 0);
m_expire = uv_now(uv_default_loop()) + kResponseTimeout;
return m_sequence++;
}
@@ -134,9 +134,11 @@ void Client::connect(const Url *url)
void Client::disconnect()
{
# ifndef XMRIG_PROXY_PROJECT
uv_timer_stop(&m_keepAliveTimer);
uv_timer_stop(&m_responseTimer);
uv_timer_stop(&m_retriesTimer);
# endif
m_expire = 0;
m_failures = -1;
close();
@@ -153,6 +155,24 @@ void Client::setUrl(const Url *url)
}
void Client::tick(uint64_t now)
{
if (m_expire == 0 || now < m_expire) {
return;
}
if (m_state == ConnectedState) {
LOG_DEBUG_ERR("[%s:%u] timeout", m_url.host(), m_url.port());
close();
}
if (m_state == ConnectingState) {
connect();
}
}
int64_t Client::submit(const JobResult &result)
{
char *req = static_cast<char*>(malloc(345));
@@ -231,6 +251,7 @@ int Client::resolve(const char *host)
{
setState(HostLookupState);
m_expire = 0;
m_recvBufPos = 0;
if (m_failures == -1) {
@@ -432,10 +453,11 @@ void Client::reconnect()
{
setState(ConnectingState);
uv_timer_stop(&m_responseTimer);
# ifndef XMRIG_PROXY_PROJECT
if (m_url.isKeepAlive()) {
uv_timer_stop(&m_keepAliveTimer);
}
# endif
if (m_failures == -1) {
return m_listener->onClose(this, -1);
@@ -444,7 +466,7 @@ void Client::reconnect()
m_failures++;
m_listener->onClose(this, m_failures);
uv_timer_start(&m_retriesTimer, [](uv_timer_t *handle) { getClient(handle->data)->connect(); }, m_retryPause, 0);
m_expire = uv_now(uv_default_loop()) + m_retryPause;
}
@@ -462,12 +484,15 @@ void Client::setState(SocketState state)
void Client::startTimeout()
{
uv_timer_stop(&m_responseTimer);
m_expire = 0;
# ifndef XMRIG_PROXY_PROJECT
if (!m_url.isKeepAlive()) {
return;
}
uv_timer_start(&m_keepAliveTimer, [](uv_timer_t *handle) { getClient(handle->data)->ping(); }, kKeepAliveTimeout, 0);
# endif
}