Fix ComputeTimeSmart test failure with -DDEBUG_LOCKORDER

Failure looks like:

    Entering test case "ComputeTimeSmart"
    test_bitcoin: sync.cpp💯 void potential_deadlock_detected(const std::pair<void*, void*>&, const LockStack&, const LockStack&): Assertion `false' failed.
    unknown location(0): fatal error in "ComputeTimeSmart": signal: SIGABRT (application abort requested)
    wallet/test/wallet_tests.cpp(566): last checkpoint

Reproducible with:

    ./configure --enable-debug
    make -C src test/test_bitcoin && src/test/test_bitcoin --log_level=test_suite --run_test=wallet_tests/ComputeTimeSmart

Happens due to "92fabcd443 Add LookupBlockIndex function" which acquires
cs_main from inside CWallet::ComputeTimeSmart.
This commit is contained in:
Russell Yanofsky 2018-03-13 18:33:17 -04:00
parent d42a4fe5aa
commit 33eb9071b9
2 changed files with 5 additions and 7 deletions

View File

@ -553,7 +553,10 @@ static int64_t AddTx(CWallet& wallet, uint32_t lockTime, int64_t mockTime, int64
if (block) { if (block) {
wtx.SetMerkleBranch(block, 0); wtx.SetMerkleBranch(block, 0);
} }
wallet.AddToWallet(wtx); {
LOCK(cs_main);
wallet.AddToWallet(wtx);
}
LOCK(wallet.cs_wallet); LOCK(wallet.cs_wallet);
return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart; return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart;
} }

View File

@ -3813,12 +3813,7 @@ unsigned int CWallet::ComputeTimeSmart(const CWalletTx& wtx) const
{ {
unsigned int nTimeSmart = wtx.nTimeReceived; unsigned int nTimeSmart = wtx.nTimeReceived;
if (!wtx.hashUnset()) { if (!wtx.hashUnset()) {
const CBlockIndex* pindex = nullptr; if (const CBlockIndex* pindex = LookupBlockIndex(wtx.hashBlock)) {
{
LOCK(cs_main);
pindex = LookupBlockIndex(wtx.hashBlock);
}
if (pindex) {
int64_t latestNow = wtx.nTimeReceived; int64_t latestNow = wtx.nTimeReceived;
int64_t latestEntry = 0; int64_t latestEntry = 0;