mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-23 14:10:15 +01:00
[refactor] move peer (dis)connection logic to TxDownload
The information stored in TxDownloadConnectionInfo isn't used until the next commit.
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
#ifndef BITCOIN_NODE_TXDOWNLOADMAN_H
|
||||
#define BITCOIN_NODE_TXDOWNLOADMAN_H
|
||||
|
||||
#include <net.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
|
||||
@@ -21,6 +23,14 @@ struct TxDownloadOptions {
|
||||
/** Read-only reference to mempool. */
|
||||
const CTxMemPool& m_mempool;
|
||||
};
|
||||
struct TxDownloadConnectionInfo {
|
||||
/** Whether this peer is preferred for transaction download. */
|
||||
const bool m_preferred;
|
||||
/** Whether this peer has Relay permissions. */
|
||||
const bool m_relay_permissions;
|
||||
/** Whether this peer supports wtxid relay. */
|
||||
const bool m_wtxid_relay;
|
||||
};
|
||||
|
||||
/**
|
||||
* Class responsible for deciding what transactions to request and, once
|
||||
@@ -68,6 +78,12 @@ public:
|
||||
* - m_recent_confirmed_transactions
|
||||
* */
|
||||
bool AlreadyHaveTx(const GenTxid& gtxid, bool include_reconsiderable);
|
||||
|
||||
/** Creates a new PeerInfo. Saves the connection info to calculate tx announcement delays later. */
|
||||
void ConnectedPeer(NodeId nodeid, const TxDownloadConnectionInfo& info);
|
||||
|
||||
/** Deletes all txrequest announcements and orphans for a given peer. */
|
||||
void DisconnectedPeer(NodeId nodeid);
|
||||
};
|
||||
} // namespace node
|
||||
#endif // BITCOIN_NODE_TXDOWNLOADMAN_H
|
||||
|
||||
@@ -50,6 +50,14 @@ bool TxDownloadManager::AlreadyHaveTx(const GenTxid& gtxid, bool include_reconsi
|
||||
{
|
||||
return m_impl->AlreadyHaveTx(gtxid, include_reconsiderable);
|
||||
}
|
||||
void TxDownloadManager::ConnectedPeer(NodeId nodeid, const TxDownloadConnectionInfo& info)
|
||||
{
|
||||
m_impl->ConnectedPeer(nodeid, info);
|
||||
}
|
||||
void TxDownloadManager::DisconnectedPeer(NodeId nodeid)
|
||||
{
|
||||
m_impl->DisconnectedPeer(nodeid);
|
||||
}
|
||||
|
||||
// TxDownloadManagerImpl
|
||||
void TxDownloadManagerImpl::ActiveTipChange()
|
||||
@@ -113,4 +121,25 @@ bool TxDownloadManagerImpl::AlreadyHaveTx(const GenTxid& gtxid, bool include_rec
|
||||
|
||||
return RecentRejectsFilter().contains(hash) || m_opts.m_mempool.exists(gtxid);
|
||||
}
|
||||
|
||||
void TxDownloadManagerImpl::ConnectedPeer(NodeId nodeid, const TxDownloadConnectionInfo& info)
|
||||
{
|
||||
// If already connected (shouldn't happen in practice), exit early.
|
||||
if (m_peer_info.contains(nodeid)) return;
|
||||
|
||||
m_peer_info.try_emplace(nodeid, info);
|
||||
if (info.m_wtxid_relay) m_num_wtxid_peers += 1;
|
||||
}
|
||||
|
||||
void TxDownloadManagerImpl::DisconnectedPeer(NodeId nodeid)
|
||||
{
|
||||
m_orphanage.EraseForPeer(nodeid);
|
||||
m_txrequest.DisconnectedPeer(nodeid);
|
||||
|
||||
if (auto it = m_peer_info.find(nodeid); it != m_peer_info.end()) {
|
||||
if (it->second.m_connection_info.m_wtxid_relay) m_num_wtxid_peers -= 1;
|
||||
m_peer_info.erase(it);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace node
|
||||
|
||||
@@ -128,11 +128,28 @@ public:
|
||||
|
||||
TxDownloadManagerImpl(const TxDownloadOptions& options) : m_opts{options} {}
|
||||
|
||||
struct PeerInfo {
|
||||
/** Information relevant to scheduling tx requests. */
|
||||
const TxDownloadConnectionInfo m_connection_info;
|
||||
|
||||
PeerInfo(const TxDownloadConnectionInfo& info) : m_connection_info{info} {}
|
||||
};
|
||||
|
||||
/** Information for all of the peers we may download transactions from. This is not necessarily
|
||||
* all peers we are connected to (no block-relay-only and temporary connections). */
|
||||
std::map<NodeId, PeerInfo> m_peer_info;
|
||||
|
||||
/** Number of wtxid relay peers we have in m_peer_info. */
|
||||
uint32_t m_num_wtxid_peers{0};
|
||||
|
||||
void ActiveTipChange();
|
||||
void BlockConnected(const std::shared_ptr<const CBlock>& pblock);
|
||||
void BlockDisconnected();
|
||||
|
||||
bool AlreadyHaveTx(const GenTxid& gtxid, bool include_reconsiderable);
|
||||
|
||||
void ConnectedPeer(NodeId nodeid, const TxDownloadConnectionInfo& info);
|
||||
void DisconnectedPeer(NodeId nodeid);
|
||||
};
|
||||
} // namespace node
|
||||
#endif // BITCOIN_NODE_TXDOWNLOADMAN_IMPL_H
|
||||
|
||||
Reference in New Issue
Block a user