aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Towns <aj@erisian.com.au>2022-12-23 00:21:10 +1000
committerAnthony Towns <aj@erisian.com.au>2023-01-25 18:15:26 +1000
commitc58c249a5b694c88122589fedbef4e2f13f08bb4 (patch)
treea25ac7c1abc43b5c49f3f50a16920a7dff174483
parentecb0a3e4259b81d6bb74d59a58eb65552c17d8d8 (diff)
downloadbitcoin-c58c249a5b694c88122589fedbef4e2f13f08bb4.tar.xz
net_processing: indicate more work to do when orphans are ready to reconsider
When PR#15644 made orphan processing interruptible, it also introduced a potential 100ms delay between processing of the first and second newly reconsiderable orphan, because it didn't check if the orphan work set was non-empty after invoking ProcessMessage(). This adds that check, so that ProcessMessages() will return true if there are orphans to process, usually avoiding the 100ms delay in CConnman::ThreadMessageHandler().
-rw-r--r--src/net_processing.cpp6
-rw-r--r--src/txorphanage.cpp12
-rw-r--r--src/txorphanage.h3
3 files changed, 21 insertions, 0 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 13c412842d..368e81944d 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -4902,6 +4902,12 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
LOCK(peer->m_getdata_requests_mutex);
if (!peer->m_getdata_requests.empty()) fMoreWork = true;
}
+ // Does this peer has an orphan ready to reconsider?
+ // (Note: we may have provided a parent for an orphan provided
+ // by another peer that was already processed; in that case,
+ // the extra work may not be noticed, possibly resulting in an
+ // unnecessary 100ms delay)
+ if (m_orphanage.HaveTxToReconsider(peer->m_id)) fMoreWork = true;
} catch (const std::exception& e) {
LogPrint(BCLog::NET, "%s(%s, %u bytes): Exception '%s' (%s) caught\n", __func__, SanitizeString(msg.m_type), msg.m_message_size, e.what(), typeid(e).name());
} catch (...) {
diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp
index f82cd886f9..eb74d3451e 100644
--- a/src/txorphanage.cpp
+++ b/src/txorphanage.cpp
@@ -194,6 +194,18 @@ CTransactionRef TxOrphanage::GetTxToReconsider(NodeId peer)
return nullptr;
}
+bool TxOrphanage::HaveTxToReconsider(NodeId peer)
+{
+ LOCK(m_mutex);
+
+ auto work_set_it = m_peer_work_set.find(peer);
+ if (work_set_it != m_peer_work_set.end()) {
+ auto& work_set = work_set_it->second;
+ return !work_set.empty();
+ }
+ return false;
+}
+
void TxOrphanage::EraseForBlock(const CBlock& block)
{
LOCK(m_mutex);
diff --git a/src/txorphanage.h b/src/txorphanage.h
index f886e07b12..08cfd4e79c 100644
--- a/src/txorphanage.h
+++ b/src/txorphanage.h
@@ -48,6 +48,9 @@ public:
/** Add any orphans that list a particular tx as a parent into the from peer's work set */
void AddChildrenToWorkSet(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);;
+ /** Does this peer have any work to do? */
+ bool HaveTxToReconsider(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex);;
+
/** Return how many entries exist in the orphange */
size_t Size() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
{