Block ActivateBestChain to empty validationinterface queue
This commit is contained in:
parent
5a933cefcc
commit
36137497f1
2 changed files with 16 additions and 3 deletions
|
@ -69,9 +69,9 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
|
||||||
fs::create_directories(pathTemp);
|
fs::create_directories(pathTemp);
|
||||||
gArgs.ForceSetArg("-datadir", pathTemp.string());
|
gArgs.ForceSetArg("-datadir", pathTemp.string());
|
||||||
|
|
||||||
// Note that because we don't bother running a scheduler thread here,
|
// We have to run a scheduler thread to prevent ActivateBestChain
|
||||||
// callbacks via CValidationInterface are unreliable, but that's OK,
|
// from blocking due to queue overrun.
|
||||||
// our unit tests aren't testing multiple parts of the code at once.
|
threadGroup.create_thread(boost::bind(&CScheduler::serviceQueue, &scheduler));
|
||||||
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
|
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
|
||||||
|
|
||||||
mempool.setSanityCheck(1.0);
|
mempool.setSanityCheck(1.0);
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include <validationinterface.h>
|
#include <validationinterface.h>
|
||||||
#include <warnings.h>
|
#include <warnings.h>
|
||||||
|
|
||||||
|
#include <future>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
|
@ -2566,6 +2567,18 @@ bool CChainState::ActivateBestChain(CValidationState &state, const CChainParams&
|
||||||
int nStopAtHeight = gArgs.GetArg("-stopatheight", DEFAULT_STOPATHEIGHT);
|
int nStopAtHeight = gArgs.GetArg("-stopatheight", DEFAULT_STOPATHEIGHT);
|
||||||
do {
|
do {
|
||||||
boost::this_thread::interruption_point();
|
boost::this_thread::interruption_point();
|
||||||
|
|
||||||
|
if (GetMainSignals().CallbacksPending() > 10) {
|
||||||
|
// Block until the validation queue drains. This should largely
|
||||||
|
// never happen in normal operation, however may happen during
|
||||||
|
// reindex, causing memory blowup if we run too far ahead.
|
||||||
|
std::promise<void> promise;
|
||||||
|
CallFunctionInValidationInterfaceQueue([&promise] {
|
||||||
|
promise.set_value();
|
||||||
|
});
|
||||||
|
promise.get_future().wait();
|
||||||
|
}
|
||||||
|
|
||||||
if (ShutdownRequested())
|
if (ShutdownRequested())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue