Select orphan transaction uniformly for eviction
The previous code was biased towards evicting transactions whose txid has a larger gap (lexicographically) with the previous txid in the orphan pool.
This commit is contained in:
parent
9a43344430
commit
7257353b93
1 changed files with 19 additions and 6 deletions
|
@ -69,6 +69,7 @@ struct COrphanTx {
|
||||||
CTransactionRef tx;
|
CTransactionRef tx;
|
||||||
NodeId fromPeer;
|
NodeId fromPeer;
|
||||||
int64_t nTimeExpire;
|
int64_t nTimeExpire;
|
||||||
|
size_t list_pos;
|
||||||
};
|
};
|
||||||
CCriticalSection g_cs_orphans;
|
CCriticalSection g_cs_orphans;
|
||||||
std::map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(g_cs_orphans);
|
std::map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(g_cs_orphans);
|
||||||
|
@ -170,6 +171,8 @@ namespace {
|
||||||
};
|
};
|
||||||
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(g_cs_orphans);
|
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(g_cs_orphans);
|
||||||
|
|
||||||
|
std::vector<std::map<uint256, COrphanTx>::iterator> g_orphan_list GUARDED_BY(g_cs_orphans); //! For random eviction
|
||||||
|
|
||||||
static size_t vExtraTxnForCompactIt GUARDED_BY(g_cs_orphans) = 0;
|
static size_t vExtraTxnForCompactIt GUARDED_BY(g_cs_orphans) = 0;
|
||||||
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_cs_orphans);
|
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_cs_orphans);
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -706,8 +709,9 @@ bool AddOrphanTx(const CTransactionRef& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRE
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ret = mapOrphanTransactions.emplace(hash, COrphanTx{tx, peer, GetTime() + ORPHAN_TX_EXPIRE_TIME});
|
auto ret = mapOrphanTransactions.emplace(hash, COrphanTx{tx, peer, GetTime() + ORPHAN_TX_EXPIRE_TIME, g_orphan_list.size()});
|
||||||
assert(ret.second);
|
assert(ret.second);
|
||||||
|
g_orphan_list.push_back(ret.first);
|
||||||
for (const CTxIn& txin : tx->vin) {
|
for (const CTxIn& txin : tx->vin) {
|
||||||
mapOrphanTransactionsByPrev[txin.prevout].insert(ret.first);
|
mapOrphanTransactionsByPrev[txin.prevout].insert(ret.first);
|
||||||
}
|
}
|
||||||
|
@ -733,6 +737,18 @@ int static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans)
|
||||||
if (itPrev->second.empty())
|
if (itPrev->second.empty())
|
||||||
mapOrphanTransactionsByPrev.erase(itPrev);
|
mapOrphanTransactionsByPrev.erase(itPrev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t old_pos = it->second.list_pos;
|
||||||
|
assert(g_orphan_list[old_pos] == it);
|
||||||
|
if (old_pos + 1 != g_orphan_list.size()) {
|
||||||
|
// Unless we're deleting the last entry in g_orphan_list, move the last
|
||||||
|
// entry to the position we're deleting.
|
||||||
|
auto it_last = g_orphan_list.back();
|
||||||
|
g_orphan_list[old_pos] = it_last;
|
||||||
|
it_last->second.list_pos = old_pos;
|
||||||
|
}
|
||||||
|
g_orphan_list.pop_back();
|
||||||
|
|
||||||
mapOrphanTransactions.erase(it);
|
mapOrphanTransactions.erase(it);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -783,11 +799,8 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
|
||||||
while (mapOrphanTransactions.size() > nMaxOrphans)
|
while (mapOrphanTransactions.size() > nMaxOrphans)
|
||||||
{
|
{
|
||||||
// Evict a random orphan:
|
// Evict a random orphan:
|
||||||
uint256 randomhash = rng.rand256();
|
size_t randompos = rng.randrange(g_orphan_list.size());
|
||||||
std::map<uint256, COrphanTx>::iterator it = mapOrphanTransactions.lower_bound(randomhash);
|
EraseOrphanTx(g_orphan_list[randompos]->first);
|
||||||
if (it == mapOrphanTransactions.end())
|
|
||||||
it = mapOrphanTransactions.begin();
|
|
||||||
EraseOrphanTx(it->first);
|
|
||||||
++nEvicted;
|
++nEvicted;
|
||||||
}
|
}
|
||||||
return nEvicted;
|
return nEvicted;
|
||||||
|
|
Loading…
Reference in a new issue