Tari: fixed a crash when node is not available
This commit is contained in:
@@ -870,6 +870,10 @@ bool MergeMiningClientTari::TariServer::connect_upstream(TariClient* downstream)
|
|||||||
|
|
||||||
upstream->m_pairedClient = downstream;
|
upstream->m_pairedClient = downstream;
|
||||||
upstream->m_pairedClientSavedResetCounter = downstream->m_resetCounter;
|
upstream->m_pairedClientSavedResetCounter = downstream->m_resetCounter;
|
||||||
|
upstream->m_connectionPending = true;
|
||||||
|
|
||||||
|
downstream->m_pairedClient = upstream;
|
||||||
|
downstream->m_pairedClientSavedResetCounter = upstream->m_resetCounter;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -885,18 +889,29 @@ const char* MergeMiningClientTari::TariServer::get_log_category() const
|
|||||||
|
|
||||||
MergeMiningClientTari::TariClient::TariClient()
|
MergeMiningClientTari::TariClient::TariClient()
|
||||||
: Client(m_buf, sizeof(m_buf))
|
: Client(m_buf, sizeof(m_buf))
|
||||||
|
, m_connectionPending(false)
|
||||||
, m_pairedClient(nullptr)
|
, m_pairedClient(nullptr)
|
||||||
, m_pairedClientSavedResetCounter(std::numeric_limits<uint32_t>::max())
|
, m_pairedClientSavedResetCounter(std::numeric_limits<uint32_t>::max())
|
||||||
{
|
{
|
||||||
m_buf[0] = '\0';
|
m_buf[0] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MergeMiningClientTari::TariClient::reset()
|
||||||
|
{
|
||||||
|
m_pendingData.clear();
|
||||||
|
m_connectionPending = false;
|
||||||
|
|
||||||
|
break_pairing();
|
||||||
|
}
|
||||||
|
|
||||||
void MergeMiningClientTari::TariClient::break_pairing()
|
void MergeMiningClientTari::TariClient::break_pairing()
|
||||||
{
|
{
|
||||||
if (is_paired()) {
|
if (is_paired()) {
|
||||||
m_pairedClient->m_pairedClient = nullptr;
|
m_pairedClient->m_pairedClient = nullptr;
|
||||||
m_pairedClient->m_pairedClientSavedResetCounter = std::numeric_limits<uint32_t>::max();
|
m_pairedClient->m_pairedClientSavedResetCounter = std::numeric_limits<uint32_t>::max();
|
||||||
m_pairedClient->close();
|
if (!m_pairedClient->m_connectionPending) {
|
||||||
|
m_pairedClient->close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_pairedClient = nullptr;
|
m_pairedClient = nullptr;
|
||||||
m_pairedClientSavedResetCounter = std::numeric_limits<uint32_t>::max();
|
m_pairedClientSavedResetCounter = std::numeric_limits<uint32_t>::max();
|
||||||
@@ -914,10 +929,10 @@ bool MergeMiningClientTari::TariClient::on_connect()
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// The outgoing connection is ready now
|
// The outgoing connection is ready now
|
||||||
|
m_connectionPending = false;
|
||||||
|
|
||||||
// Check if the incoming connection (downstream) has already sent something that needs to be relayed
|
// Check if the incoming connection (downstream) has already sent something that needs to be relayed
|
||||||
TariClient* downstream = m_pairedClient;
|
TariClient* downstream = m_pairedClient;
|
||||||
downstream->m_pairedClient = this;
|
|
||||||
downstream->m_pairedClientSavedResetCounter = m_resetCounter;
|
|
||||||
|
|
||||||
const std::vector<uint8_t>& v = downstream->m_pendingData;
|
const std::vector<uint8_t>& v = downstream->m_pendingData;
|
||||||
|
|
||||||
@@ -948,7 +963,7 @@ bool MergeMiningClientTari::TariClient::on_read(const char* data, uint32_t size)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_paired()) {
|
if (!is_paired() || m_pairedClient->m_connectionPending) {
|
||||||
LOGWARN(5, "Read " << size << " bytes from " << static_cast<char*>(m_addrString) << " but it's not paired yet. Buffering it.");
|
LOGWARN(5, "Read " << size << " bytes from " << static_cast<char*>(m_addrString) << " but it's not paired yet. Buffering it.");
|
||||||
m_pendingData.insert(m_pendingData.end(), data, data + size);
|
m_pendingData.insert(m_pendingData.end(), data, data + size);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ private:
|
|||||||
static Client* allocate() { return new TariClient(); }
|
static Client* allocate() { return new TariClient(); }
|
||||||
virtual size_t size() const override { return sizeof(TariClient); }
|
virtual size_t size() const override { return sizeof(TariClient); }
|
||||||
|
|
||||||
void reset() override { break_pairing(); }
|
void reset() override;
|
||||||
[[nodiscard]] bool on_connect() override;
|
[[nodiscard]] bool on_connect() override;
|
||||||
[[nodiscard]] bool on_read(const char* data, uint32_t size) override;
|
[[nodiscard]] bool on_read(const char* data, uint32_t size) override;
|
||||||
void on_connect_failed(int /*err*/) override { break_pairing(); }
|
void on_connect_failed(int /*err*/) override { break_pairing(); }
|
||||||
@@ -121,6 +121,7 @@ private:
|
|||||||
|
|
||||||
alignas(8) char m_buf[BUF_SIZE];
|
alignas(8) char m_buf[BUF_SIZE];
|
||||||
std::vector<uint8_t> m_pendingData;
|
std::vector<uint8_t> m_pendingData;
|
||||||
|
bool m_connectionPending;
|
||||||
|
|
||||||
bool is_paired() const { return m_pairedClient && (m_pairedClient->m_resetCounter == m_pairedClientSavedResetCounter); }
|
bool is_paired() const { return m_pairedClient && (m_pairedClient->m_resetCounter == m_pairedClientSavedResetCounter); }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user