Skip to content

Commit

Permalink
Create new mutex for orphans, no cs_main in PLV::BlockConnected
Browse files Browse the repository at this point in the history
This should (marginally) speed up validationinterface queue
draining by avoiding a cs_main lock in one client.
  • Loading branch information
TheBlueMatt authored and codablock committed Mar 12, 2019
1 parent 6085de3 commit 7f54372
Showing 1 changed file with 28 additions and 13 deletions.
41 changes: 28 additions & 13 deletions src/net_processing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ struct COrphanTx {
NodeId fromPeer;
int64_t nTimeExpire;
};
std::map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(cs_main);
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(cs_main);
void EraseOrphansFor(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
static CCriticalSection g_cs_orphans;
std::map<uint256, COrphanTx> mapOrphanTransactions GUARDED_BY(g_cs_orphans);
std::map<COutPoint, std::set<std::map<uint256, COrphanTx>::iterator, IteratorComparator>> mapOrphanTransactionsByPrev GUARDED_BY(g_cs_orphans);
void EraseOrphansFor(NodeId peer);

static size_t vExtraTxnForCompactIt = 0;
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(cs_main);
static size_t vExtraTxnForCompactIt GUARDED_BY(g_cs_orphans) = 0;
static std::vector<std::pair<uint256, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_cs_orphans);

static const uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL; // SHA256("main address relay")[0:8]

Expand Down Expand Up @@ -149,6 +150,13 @@ namespace {
/** Number of peers from which we're downloading blocks. */
int nPeersWithValidatedDownloads = 0;

/* This comment is here to force a merge conflict when bitcoin#11560 is backported
* It introduces this member as int64_t while bitcoin#11824 changes it to atomic<int64_t>.
* bitcoin#11824 is partially backported already, which means you'll have to take the atomic
* version when you encounter this merge conflict!
std::atomic<int64_t> g_last_tip_update(0);
*/

/** Relay map, protected by cs_main. */
typedef std::map<uint256, CTransactionRef> MapRelay;
MapRelay mapRelay;
Expand Down Expand Up @@ -613,7 +621,7 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals)
// mapOrphanTransactions
//

void AddToCompactExtraTransactions(const CTransactionRef& tx)
void AddToCompactExtraTransactions(const CTransactionRef& tx) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans)
{
size_t max_extra_txn = GetArg("-blockreconstructionextratxn", DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN);
if (max_extra_txn <= 0)
Expand All @@ -624,7 +632,7 @@ void AddToCompactExtraTransactions(const CTransactionRef& tx)
vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % max_extra_txn;
}

bool AddOrphanTx(const CTransactionRef& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool AddOrphanTx(const CTransactionRef& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans)
{
const uint256& hash = tx->GetHash();
if (mapOrphanTransactions.count(hash))
Expand Down Expand Up @@ -657,7 +665,7 @@ bool AddOrphanTx(const CTransactionRef& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRE
return true;
}

int static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
int static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans)
{
std::map<uint256, COrphanTx>::iterator it = mapOrphanTransactions.find(hash);
if (it == mapOrphanTransactions.end())
Expand All @@ -677,6 +685,7 @@ int static EraseOrphanTx(uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)

void EraseOrphansFor(NodeId peer)
{
LOCK(g_cs_orphans);
int nErased = 0;
std::map<uint256, COrphanTx>::iterator iter = mapOrphanTransactions.begin();
while (iter != mapOrphanTransactions.end())
Expand All @@ -691,8 +700,10 @@ void EraseOrphansFor(NodeId peer)
}


unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
{
LOCK(g_cs_orphans);

unsigned int nEvicted = 0;
static int64_t nNextSweep;
int64_t nNow = GetTime();
Expand Down Expand Up @@ -791,7 +802,7 @@ void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIn
if (nPosInBlock == CMainSignals::SYNC_TRANSACTION_NOT_IN_BLOCK)
return;

LOCK(cs_main);
LOCK(g_cs_orphans);

std::vector<uint256> vOrphanErase;
// Which orphan pool entries must we evict?
Expand Down Expand Up @@ -947,9 +958,13 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
recentRejects->reset();
}

{
LOCK(g_cs_orphans);
if (mapOrphanTransactions.count(inv.hash)) return true;
}

return recentRejects->contains(inv.hash) ||
mempool.exists(inv.hash) ||
mapOrphanTransactions.count(inv.hash) ||
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 0)) || // Best effort: only try output 0 and 1
pcoinsTip->HaveCoinInCache(COutPoint(inv.hash, 1));
}
Expand Down Expand Up @@ -2111,7 +2126,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
mmetaman.DisallowMixing(dmn->proTxHash);
}

LOCK(cs_main);
LOCK2(cs_main, g_cs_orphans);

bool fMissingInputs = false;
CValidationState state;
Expand Down Expand Up @@ -2338,7 +2353,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
bool fBlockReconstructed = false;

{
LOCK(cs_main);
LOCK2(cs_main, g_cs_orphans);
// If AcceptBlockHeader returned true, it set pindex
assert(pindex);
UpdateBlockAvailability(pfrom->GetId(), pindex->GetBlockHash());
Expand Down

0 comments on commit 7f54372

Please sign in to comment.