mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 23:07:59 +01:00
[txorphanage] add per-peer weight accounting
This commit is contained in:
parent
672c69c688
commit
e5ea7daee0
2 changed files with 27 additions and 0 deletions
|
@ -43,6 +43,8 @@ bool TxOrphanage::AddTx(const CTransactionRef& tx, NodeId peer)
|
||||||
m_outpoint_to_orphan_it[txin.prevout].insert(ret.first);
|
m_outpoint_to_orphan_it[txin.prevout].insert(ret.first);
|
||||||
}
|
}
|
||||||
m_total_orphan_usage += sz;
|
m_total_orphan_usage += sz;
|
||||||
|
auto& peer_info = m_peer_orphanage_info.try_emplace(peer).first->second;
|
||||||
|
peer_info.m_total_usage += sz;
|
||||||
|
|
||||||
LogDebug(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
|
LogDebug(BCLog::TXPACKAGES, "stored orphan tx %s (wtxid=%s), weight: %u (mapsz %u outsz %u)\n", hash.ToString(), wtxid.ToString(), sz,
|
||||||
m_orphans.size(), m_outpoint_to_orphan_it.size());
|
m_orphans.size(), m_outpoint_to_orphan_it.size());
|
||||||
|
@ -56,6 +58,8 @@ bool TxOrphanage::AddAnnouncer(const Wtxid& wtxid, NodeId peer)
|
||||||
Assume(!it->second.announcers.empty());
|
Assume(!it->second.announcers.empty());
|
||||||
const auto ret = it->second.announcers.insert(peer);
|
const auto ret = it->second.announcers.insert(peer);
|
||||||
if (ret.second) {
|
if (ret.second) {
|
||||||
|
auto& peer_info = m_peer_orphanage_info.try_emplace(peer).first->second;
|
||||||
|
peer_info.m_total_usage += it->second.GetUsage();
|
||||||
LogDebug(BCLog::TXPACKAGES, "added peer=%d as announcer of orphan tx %s\n", peer, wtxid.ToString());
|
LogDebug(BCLog::TXPACKAGES, "added peer=%d as announcer of orphan tx %s\n", peer, wtxid.ToString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -80,6 +84,13 @@ int TxOrphanage::EraseTx(const Wtxid& wtxid)
|
||||||
|
|
||||||
const auto tx_size{it->second.GetUsage()};
|
const auto tx_size{it->second.GetUsage()};
|
||||||
m_total_orphan_usage -= tx_size;
|
m_total_orphan_usage -= tx_size;
|
||||||
|
// Decrement each announcer's m_total_usage
|
||||||
|
for (const auto& peer : it->second.announcers) {
|
||||||
|
auto peer_it = m_peer_orphanage_info.find(peer);
|
||||||
|
if (Assume(peer_it != m_peer_orphanage_info.end())) {
|
||||||
|
peer_it->second.m_total_usage -= tx_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t old_pos = it->second.list_pos;
|
size_t old_pos = it->second.list_pos;
|
||||||
assert(m_orphan_list[old_pos] == it);
|
assert(m_orphan_list[old_pos] == it);
|
||||||
|
@ -103,6 +114,7 @@ int TxOrphanage::EraseTx(const Wtxid& wtxid)
|
||||||
|
|
||||||
void TxOrphanage::EraseForPeer(NodeId peer)
|
void TxOrphanage::EraseForPeer(NodeId peer)
|
||||||
{
|
{
|
||||||
|
// Zeroes out this peer's m_total_usage.
|
||||||
m_peer_orphanage_info.erase(peer);
|
m_peer_orphanage_info.erase(peer);
|
||||||
|
|
||||||
int nErased = 0;
|
int nErased = 0;
|
||||||
|
|
|
@ -97,6 +97,14 @@ public:
|
||||||
* only counted once within this total. */
|
* only counted once within this total. */
|
||||||
unsigned int TotalOrphanUsage() const { return m_total_orphan_usage; }
|
unsigned int TotalOrphanUsage() const { return m_total_orphan_usage; }
|
||||||
|
|
||||||
|
/** Total usage (weight) of orphans for which this peer is an announcer. If an orphan has multiple
|
||||||
|
* announcers, its weight will be accounted for in each PeerOrphanInfo, so the total of all
|
||||||
|
* peers' UsageByPeer() may be larger than TotalOrphanBytes(). */
|
||||||
|
unsigned int UsageByPeer(NodeId peer) const {
|
||||||
|
auto peer_it = m_peer_orphanage_info.find(peer);
|
||||||
|
return peer_it == m_peer_orphanage_info.end() ? 0 : peer_it->second.m_total_usage;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct OrphanTx : public OrphanTxBase {
|
struct OrphanTx : public OrphanTxBase {
|
||||||
size_t list_pos;
|
size_t list_pos;
|
||||||
|
@ -115,6 +123,13 @@ protected:
|
||||||
* transactions that are no longer present in orphanage; these are lazily removed in
|
* transactions that are no longer present in orphanage; these are lazily removed in
|
||||||
* GetTxToReconsider. */
|
* GetTxToReconsider. */
|
||||||
std::set<Wtxid> m_work_set;
|
std::set<Wtxid> m_work_set;
|
||||||
|
|
||||||
|
/** Total weight of orphans for which this peer is an announcer.
|
||||||
|
* If orphans are provided by different peers, its weight will be accounted for in each
|
||||||
|
* PeerOrphanInfo, so the total of all peers' m_total_usage may be larger than
|
||||||
|
* m_total_orphan_size. If a peer is removed as an announcer, even if the orphan still
|
||||||
|
* remains in the orphanage, this number will be decremented. */
|
||||||
|
unsigned int m_total_usage{0};
|
||||||
};
|
};
|
||||||
std::map<NodeId, PeerOrphanInfo> m_peer_orphanage_info;
|
std::map<NodeId, PeerOrphanInfo> m_peer_orphanage_info;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue