diff options
author | Suhas Daftuar <sdaftuar@gmail.com> | 2017-03-06 11:16:06 -0500 |
---|---|---|
committer | Suhas Daftuar <sdaftuar@gmail.com> | 2017-03-30 15:05:33 -0400 |
commit | b5c3440b053217afda5f03ee97b3835f02fd5290 (patch) | |
tree | e722f71ff6740e3262e812dfa027bda2a0813635 /src | |
parent | b768202695a090a48b77ce9873267d5ec29b8845 (diff) |
Mining: return early when block is almost full
Github-Pull: #9959
Rebased-From: eed816af6c68c0c67f5fc05472a3927db62f8a18
Diffstat (limited to 'src')
-rw-r--r-- | src/miner.cpp | 18 |
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); |