From 5678d15841a7ff0cc9434e57393a8084bdc26995 Mon Sep 17 00:00:00 2001 From: XMRig <support@xmrig.com> Date: Fri, 30 Aug 2019 10:04:12 +0700 Subject: [PATCH] #1138 Fixed reconnect. --- src/base/net/stratum/BaseClient.cpp | 3 ++- src/base/net/stratum/BaseClient.h | 3 ++- src/base/net/stratum/Client.cpp | 42 ++++++++++++++++++----------- src/base/net/stratum/Client.h | 23 ++++++++-------- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/base/net/stratum/BaseClient.cpp b/src/base/net/stratum/BaseClient.cpp index f44415d58..325fce1c8 100644 --- a/src/base/net/stratum/BaseClient.cpp +++ b/src/base/net/stratum/BaseClient.cpp @@ -42,7 +42,8 @@ xmrig::BaseClient::BaseClient(int id, IClientListener *listener) : m_retries(5), m_failures(0), m_state(UnconnectedState), - m_retryPause(5000) + m_retryPause(5000), + m_enabled(true) { } diff --git a/src/base/net/stratum/BaseClient.h b/src/base/net/stratum/BaseClient.h index 9e1c7ffbc..56bdc1263 100644 --- a/src/base/net/stratum/BaseClient.h +++ b/src/base/net/stratum/BaseClient.h @@ -64,7 +64,8 @@ protected: HostLookupState, ConnectingState, ConnectedState, - ClosingState + ClosingState, + ReconnectingState }; inline bool isQuiet() const { return m_quiet || m_failures >= m_retries; } diff --git a/src/base/net/stratum/Client.cpp b/src/base/net/stratum/Client.cpp index 1da416928..229147ba2 100644 --- a/src/base/net/stratum/Client.cpp +++ b/src/base/net/stratum/Client.cpp @@ -70,21 +70,15 @@ static const char *states[] = { "host-lookup", "connecting", "connected", - "closing" + "closing", + "reconnecting" }; #endif xmrig::Client::Client(int id, const char *agent, IClientListener *listener) : BaseClient(id, listener), - m_agent(agent), - m_tls(nullptr), - m_expire(0), - m_jobs(0), - m_keepAlive(0), - m_key(0), - m_stream(nullptr), - m_socket(nullptr) + m_agent(agent) { m_key = m_storage.add(this); m_dns = new Dns(this); @@ -238,8 +232,12 @@ void xmrig::Client::tick(uint64_t now) return; } - if (m_expire && now > m_expire && m_state == ConnectingState) { - connect(); + if (m_state == ReconnectingState && m_expire && now > m_expire) { + return connect(); + } + + if (m_state == ConnectingState && m_expire && now > m_expire) { + return reconnect(); } } @@ -449,7 +447,6 @@ int xmrig::Client::resolve(const String &host) { setState(HostLookupState); - m_expire = 0; m_recvBuf.reset(); if (m_failures == -1) { @@ -814,12 +811,10 @@ void xmrig::Client::reconnect() return m_listener->onClose(this, -1); } - setState(ConnectingState); + setState(ReconnectingState); m_failures++; m_listener->onClose(this, static_cast<int>(m_failures)); - - m_expire = Chrono::steadyMSecs() + m_retryPause; } @@ -831,6 +826,23 @@ void xmrig::Client::setState(SocketState state) return; } + switch (state) { + case HostLookupState: + m_expire = 0; + break; + + case ConnectingState: + m_expire = Chrono::steadyMSecs() + kConnectTimeout; + break; + + case ReconnectingState: + m_expire = Chrono::steadyMSecs() + m_retryPause; + break; + + default: + break; + } + m_state = state; } diff --git a/src/base/net/stratum/Client.h b/src/base/net/stratum/Client.h index 46030abaf..ff2bf7f6a 100644 --- a/src/base/net/stratum/Client.h +++ b/src/base/net/stratum/Client.h @@ -56,12 +56,13 @@ class JobResult; class Client : public BaseClient, public IDnsListener, public ILineListener { public: - constexpr static int kResponseTimeout = 20 * 1000; + constexpr static uint64_t kConnectTimeout = 20 * 1000; + constexpr static uint64_t kResponseTimeout = 20 * 1000; # ifdef XMRIG_FEATURE_TLS - constexpr static int kInputBufferSize = 1024 * 16; + constexpr static size_t kInputBufferSize = 1024 * 16; # else - constexpr static int kInputBufferSize = 1024 * 2; + constexpr static size_t kInputBufferSize = 1024 * 2; # endif Client(int id, const char *agent, IClientListener *listener); @@ -122,19 +123,19 @@ private: static inline Client *getClient(void *data) { return m_storage.get(data); } - char m_sendBuf[2048]; + char m_sendBuf[2048] = { 0 }; const char *m_agent; Dns *m_dns; RecvBuf<kInputBufferSize> m_recvBuf; std::bitset<EXT_MAX> m_extensions; String m_rpcId; - Tls *m_tls; - uint64_t m_expire; - uint64_t m_jobs; - uint64_t m_keepAlive; - uintptr_t m_key; - uv_stream_t *m_stream; - uv_tcp_t *m_socket; + Tls *m_tls = nullptr; + uint64_t m_expire = 0; + uint64_t m_jobs = 0; + uint64_t m_keepAlive = 0; + uintptr_t m_key = 0; + uv_stream_t *m_stream = nullptr; + uv_tcp_t *m_socket = nullptr; static Storage<Client> m_storage; };