Skip to content

Commit 31bdd86

Browse files
committed
Merge bitcoin#19353: Fix mistakenly swapped "previous" and "current" lock orders
0ecff9d Improve "detected inconsistent lock order" error message (Hennadii Stepanov) bbe9cf4 test: Improve "potential deadlock detected" exception message (Hennadii Stepanov) 3559934 Fix mistakenly swapped "previous" and "current" lock orders (Hennadii Stepanov) Pull request description: In master (8ef15e8) the "previous" and "current" lock orders are mistakenly swapped. This PR: - fixes printed lock orders - improves the `sync_tests` unit test - makes the "detected inconsistent lock order" error message pointing to the lock location rather `tfm::format()` location. Debugger output example with this PR (with modified code, of course): ``` 2020-06-22T15:46:56Z [msghand] POTENTIAL DEADLOCK DETECTED 2020-06-22T15:46:56Z [msghand] Previous lock order was: 2020-06-22T15:46:56Z [msghand] (2) 'cs_main' in net_processing.cpp:2545 (in thread 'msghand') 2020-06-22T15:46:56Z [msghand] (1) 'g_cs_orphans' in net_processing.cpp:1400 (in thread 'msghand') 2020-06-22T15:46:56Z [msghand] Current lock order is: 2020-06-22T15:46:56Z [msghand] (1) 'g_cs_orphans' in net_processing.cpp:2816 (in thread 'msghand') 2020-06-22T15:46:56Z [msghand] (2) 'cs_main' in net_processing.cpp:2816 (in thread 'msghand') Assertion failed: detected inconsistent lock order for 'cs_main' in net_processing.cpp:2816 (in thread 'msghand'), details in debug log. Process 131393 stopped * thread bitcoin#15, name = 'b-msghand', stop reason = signal SIGABRT frame #0: 0x00007ffff775c18b libc.so.6`__GI_raise(sig=2) at raise.c:51:1 (lldb) bt * thread bitcoin#15, name = 'b-msghand', stop reason = signal SIGABRT * frame #0: 0x00007ffff775c18b libc.so.6`__GI_raise(sig=2) at raise.c:51:1 frame #1: 0x00007ffff773b859 libc.so.6`__GI_abort at abort.c:79:7 frame #2: 0x0000555555e5b196 bitcoind`(anonymous namespace)::potential_deadlock_detected(mismatch=0x00007fff99ff6f30, s1=size=2, s2=size=2, lock_location=0x00007fff99ff7010) at sync.cpp:134:9 frame #3: 0x0000555555e5a1b1 bitcoind`(anonymous namespace)::push_lock(c=0x0000555556379220, locklocation=0x00007fff99ff7010) at sync.cpp:158:13 frame #4: 0x0000555555e59e8a bitcoind`EnterCritical(pszName="cs_main", pszFile="net_processing.cpp", nLine=2816, cs=0x0000555556379220, fTry=false) at sync.cpp:177:5 frame #5: 0x00005555555b0500 bitcoind`UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::Enter(this=0x00007fff99ff8c20, pszName="cs_main", pszFile="net_processing.cpp", nLine=2816) at sync.h:134:9 frame #6: 0x00005555555b017f bitcoind`UniqueLock<AnnotatedMixin<std::recursive_mutex>, std::unique_lock<std::recursive_mutex> >::UniqueLock(this=0x00007fff99ff8c20, mutexIn=0x0000555556379220, pszName="cs_main", pszFile="net_processing.cpp", nLine=2816, fTry=false) at sync.h:160:13 frame #7: 0x00005555556aa57e bitcoind`ProcessMessage(pfrom=0x00007fff90001180, msg_type=error: summary string parsing error, vRecv=0x00007fff9c005ac0, nTimeReceived=1592840815980751, chainparams=0x00005555564b7110, chainman=0x0000555556380880, mempool=0x0000555556380ae0, connman=0x000055555657aa20, banman=0x00005555565167b0, interruptMsgProc=0x00005555565cae90) at net_processing.cpp:2816:9 ``` ACKs for top commit: laanwj: ACK 0ecff9d vasild: ACK 0ecff9d Tree-SHA512: ff285de8dd3198b5b33c4bfbdadf9b1448189c96143b9696bc4f41c07e784c00851ec169cf3ed45cc325f3617ba6783620803234f57fcce28bf6bc3d6a7234fb
2 parents 804ca26 + 0ecff9d commit 31bdd86

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

src/sync.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct CLockLocation {
6060
std::string ToString() const
6161
{
6262
return strprintf(
63-
"%s %s:%s%s (in thread %s)",
63+
"'%s' in %s:%s%s (in thread '%s')",
6464
mutexName, sourceFile, sourceLine, (fTry ? " (TRY)" : ""), m_thread_name);
6565
}
6666

@@ -105,7 +105,7 @@ static void potential_deadlock_detected(const LockPair& mismatch, const LockStac
105105
{
106106
LogPrintf("POTENTIAL DEADLOCK DETECTED\n");
107107
LogPrintf("Previous lock order was:\n");
108-
for (const LockStackItem& i : s2) {
108+
for (const LockStackItem& i : s1) {
109109
if (i.first == mismatch.first) {
110110
LogPrintf(" (1)"); /* Continued */
111111
}
@@ -114,21 +114,25 @@ static void potential_deadlock_detected(const LockPair& mismatch, const LockStac
114114
}
115115
LogPrintf(" %s\n", i.second.ToString());
116116
}
117+
118+
std::string mutex_a, mutex_b;
117119
LogPrintf("Current lock order is:\n");
118-
for (const LockStackItem& i : s1) {
120+
for (const LockStackItem& i : s2) {
119121
if (i.first == mismatch.first) {
120122
LogPrintf(" (1)"); /* Continued */
123+
mutex_a = i.second.Name();
121124
}
122125
if (i.first == mismatch.second) {
123126
LogPrintf(" (2)"); /* Continued */
127+
mutex_b = i.second.Name();
124128
}
125129
LogPrintf(" %s\n", i.second.ToString());
126130
}
127131
if (g_debug_lockorder_abort) {
128-
tfm::format(std::cerr, "Assertion failed: detected inconsistent lock order at %s:%i, details in debug log.\n", __FILE__, __LINE__);
132+
tfm::format(std::cerr, "Assertion failed: detected inconsistent lock order for %s, details in debug log.\n", s2.back().second.ToString());
129133
abort();
130134
}
131-
throw std::logic_error("potential deadlock detected");
135+
throw std::logic_error(strprintf("potential deadlock detected: %s -> %s -> %s", mutex_b, mutex_a, mutex_b));
132136
}
133137

134138
static void push_lock(void* c, const CLockLocation& locklocation)

src/test/sync_tests.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void TestPotentialDeadLockDetected(MutexType& mutex1, MutexType& mutex2)
1818
try {
1919
LOCK2(mutex2, mutex1);
2020
} catch (const std::logic_error& e) {
21-
BOOST_CHECK_EQUAL(e.what(), "potential deadlock detected");
21+
BOOST_CHECK_EQUAL(e.what(), "potential deadlock detected: mutex1 -> mutex2 -> mutex1");
2222
error_thrown = true;
2323
}
2424
#ifdef DEBUG_LOCKORDER

0 commit comments

Comments
 (0)