#1138 Fixed reconnect.

This commit is contained in:
XMRig 2019-08-30 10:04:12 +07:00
parent df91a85128
commit 5678d15841
4 changed files with 43 additions and 28 deletions

View file

@ -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)
{
}

View file

@ -64,7 +64,8 @@ protected:
HostLookupState,
ConnectingState,
ConnectedState,
ClosingState
ClosingState,
ReconnectingState
};
inline bool isQuiet() const { return m_quiet || m_failures >= m_retries; }

View file

@ -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;
}

View file

@ -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;
};