|
|
|
@ -358,6 +358,13 @@ void BlockAssembler::addPackageTxs()
@@ -358,6 +358,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.
|
|
|
|
@ -419,6 +426,14 @@ void BlockAssembler::addPackageTxs()
@@ -419,6 +426,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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -439,6 +454,9 @@ void BlockAssembler::addPackageTxs()
@@ -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<CTxMemPool::txiter> sortedEntries; |
|
|
|
|
SortForBlock(ancestors, iter, sortedEntries); |
|
|
|
|