aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuhas Daftuar <sdaftuar@gmail.com>2017-03-06 11:16:06 -0500
committerSuhas Daftuar <sdaftuar@gmail.com>2017-03-30 15:05:33 -0400
commitb5c3440b053217afda5f03ee97b3835f02fd5290 (patch)
treee722f71ff6740e3262e812dfa027bda2a0813635
parentb768202695a090a48b77ce9873267d5ec29b8845 (diff)
downloadbitcoin-b5c3440b053217afda5f03ee97b3835f02fd5290.tar.xz
Mining: return early when block is almost full
Github-Pull: #9959 Rebased-From: eed816af6c68c0c67f5fc05472a3927db62f8a18
-rw-r--r--src/miner.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/miner.cpp b/src/miner.cpp
index 7b3d94d0e4..54d66dadd2 100644
--- a/src/miner.cpp
+++ b/src/miner.cpp
@@ -416,6 +416,13 @@ void BlockAssembler::addPackageTxs()
CTxMemPool::indexed_transaction_set::index<ancestor_score>::type::iterator mi = mempool.mapTx.get<ancestor_score>().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<ancestor_score>().end() || !mapModifiedTx.empty())
{
// First try to find a new transaction in mapTx to evaluate.
@@ -477,6 +484,14 @@ void BlockAssembler::addPackageTxs()
mapModifiedTx.get<ancestor_score>().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;
}
@@ -497,6 +512,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<CTxMemPool::txiter> sortedEntries;
SortForBlock(ancestors, iter, sortedEntries);