diff options
| author | Suhas Daftuar <[email protected]> | 2017-03-06 11:16:06 -0500 |
|---|---|---|
| committer | Suhas Daftuar <[email protected]> | 2017-03-30 15:05:33 -0400 |
| commit | b5c3440b053217afda5f03ee97b3835f02fd5290 (patch) | |
| tree | e722f71ff6740e3262e812dfa027bda2a0813635 /src/miner.cpp | |
| parent | Merge #10101: [0.14] backports (diff) | |
| download | discoin-b5c3440b053217afda5f03ee97b3835f02fd5290.tar.xz discoin-b5c3440b053217afda5f03ee97b3835f02fd5290.zip | |
Mining: return early when block is almost full
Github-Pull: #9959
Rebased-From: eed816af6c68c0c67f5fc05472a3927db62f8a18
Diffstat (limited to 'src/miner.cpp')
| -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 7b3d94d0e..54d66dadd 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); |