Tari: fixed a crash when node is not available

This commit is contained in:
SChernykh
2025-08-04 22:03:35 +02:00
parent 07259e029a
commit d6c249ca17
2 changed files with 21 additions and 5 deletions

View File

@@ -870,6 +870,10 @@ bool MergeMiningClientTari::TariServer::connect_upstream(TariClient* downstream)
upstream->m_pairedClient = downstream;
upstream->m_pairedClientSavedResetCounter = downstream->m_resetCounter;
upstream->m_connectionPending = true;
downstream->m_pairedClient = upstream;
downstream->m_pairedClientSavedResetCounter = upstream->m_resetCounter;
return true;
}
@@ -885,18 +889,29 @@ const char* MergeMiningClientTari::TariServer::get_log_category() const
MergeMiningClientTari::TariClient::TariClient()
: Client(m_buf, sizeof(m_buf))
, m_connectionPending(false)
, m_pairedClient(nullptr)
, m_pairedClientSavedResetCounter(std::numeric_limits<uint32_t>::max())
{
m_buf[0] = '\0';
}
void MergeMiningClientTari::TariClient::reset()
{
m_pendingData.clear();
m_connectionPending = false;
break_pairing();
}
void MergeMiningClientTari::TariClient::break_pairing()
{
if (is_paired()) {
m_pairedClient->m_pairedClient = nullptr;
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_pairedClientSavedResetCounter = std::numeric_limits<uint32_t>::max();
@@ -914,10 +929,10 @@ bool MergeMiningClientTari::TariClient::on_connect()
}
else {
// The outgoing connection is ready now
m_connectionPending = false;
// Check if the incoming connection (downstream) has already sent something that needs to be relayed
TariClient* downstream = m_pairedClient;
downstream->m_pairedClient = this;
downstream->m_pairedClientSavedResetCounter = m_resetCounter;
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;
}
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.");
m_pendingData.insert(m_pendingData.end(), data, data + size);
return true;

View File

@@ -113,7 +113,7 @@ private:
static Client* allocate() { return new 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_read(const char* data, uint32_t size) override;
void on_connect_failed(int /*err*/) override { break_pairing(); }
@@ -121,6 +121,7 @@ private:
alignas(8) char m_buf[BUF_SIZE];
std::vector<uint8_t> m_pendingData;
bool m_connectionPending;
bool is_paired() const { return m_pairedClient && (m_pairedClient->m_resetCounter == m_pairedClientSavedResetCounter); }