From eed816af6c68c0c67f5fc05472a3927db62f8a18 Mon Sep 17 00:00:00 2001 From: Suhas Daftuar Date: Mon, 6 Mar 2017 11:16:06 -0500 Subject: [PATCH] Mining: return early when block is almost full --- src/miner.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index 67e7ff155..570053a53 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -358,6 +358,13 @@ void BlockAssembler::addPackageTxs() CTxMemPool::indexed_transaction_set::index::type::iterator mi = mempool.mapTx.get().begin(); CTxMemPool::txiter iter; + + // Limit the number of attempts to add transactions to the block when it is + // close to full; this is just a simple heuristic to finish quickly if the + // mempool has a lot of entries. + const int64_t MAX_CONSECUTIVE_FAILURES = 1000; + int64_t nConsecutiveFailed = 0; + while (mi != mempool.mapTx.get().end() || !mapModifiedTx.empty()) { // First try to find a new transaction in mapTx to evaluate. @@ -419,6 +426,14 @@ void BlockAssembler::addPackageTxs() mapModifiedTx.get().erase(modit); failedTx.insert(iter); } + + ++nConsecutiveFailed; + + if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight > + nBlockMaxWeight - 4000) { + // Give up if we're close to full and haven't succeeded in a while + break; + } continue; } @@ -439,6 +454,9 @@ void BlockAssembler::addPackageTxs() continue; } + // This transaction will make it in; reset the failed counter. + nConsecutiveFailed = 0; + // Package can be added. Sort the entries in a valid order. std::vector sortedEntries; SortForBlock(ancestors, iter, sortedEntries);