merge bitcoin#24770: Put lock logging behind DEBUG_LOCKCONTENTION preprocessor directive

This commit is contained in:
Kittywhiskers Van Gogh 2024-11-18 10:47:10 +00:00
parent d9cc2ea178
commit f331cbe8c8
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD
10 changed files with 35 additions and 6 deletions

View File

@ -17,6 +17,7 @@ Developer Notes
- [`debug.log`](#debuglog) - [`debug.log`](#debuglog)
- [Testnet and Regtest modes](#testnet-and-regtest-modes) - [Testnet and Regtest modes](#testnet-and-regtest-modes)
- [DEBUG_LOCKORDER](#debug_lockorder) - [DEBUG_LOCKORDER](#debug_lockorder)
- [DEBUG_LOCKCONTENTION](#debug_lockcontention)
- [Valgrind suppressions file](#valgrind-suppressions-file) - [Valgrind suppressions file](#valgrind-suppressions-file)
- [Compiling for test coverage](#compiling-for-test-coverage) - [Compiling for test coverage](#compiling-for-test-coverage)
- [Performance profiling with perf](#performance-profiling-with-perf) - [Performance profiling with perf](#performance-profiling-with-perf)
@ -412,6 +413,19 @@ configure option adds `-DDEBUG_LOCKORDER` to the compiler flags. This inserts
run-time checks to keep track of which locks are held and adds warnings to the run-time checks to keep track of which locks are held and adds warnings to the
`debug.log` file if inconsistencies are detected. `debug.log` file if inconsistencies are detected.
### DEBUG_LOCKCONTENTION
Defining `DEBUG_LOCKCONTENTION` adds a "lock" logging category to the logging
RPC that, when enabled, logs the location and duration of each lock contention
to the `debug.log` file.
To enable it, run configure with `-DDEBUG_LOCKCONTENTION` added to your
CPPFLAGS, e.g. `CPPFLAGS="-DDEBUG_LOCKCONTENTION"`, then build and run dashd.
You can then use the `-debug=lock` configuration option at dashd startup or
`dash-cli logging '["lock"]'` at runtime to turn on lock contention logging.
It can be toggled off again with `dash-cli logging [] '["lock"]'`.
### Assertions and Checks ### Assertions and Checks
The util file `src/util/check.h` offers helpers to protect against coding and The util file `src/util/check.h` offers helpers to protect against coding and

View File

@ -10,6 +10,7 @@
#include <serialize.h> #include <serialize.h>
#include <sync.h> #include <sync.h>
#include <threadsafety.h> #include <threadsafety.h>
#include <tinyformat.h>
#include <unordered_lru_cache.h> #include <unordered_lru_cache.h>
#include <util/ranges_set.h> #include <util/ranges_set.h>

View File

@ -15,6 +15,7 @@
#include <saltedhasher.h> #include <saltedhasher.h>
#include <threadinterrupt.h> #include <threadinterrupt.h>
#include <unordered_lru_cache.h> #include <unordered_lru_cache.h>
#include <util/time.h>
#include <atomic> #include <atomic>
#include <map> #include <map>

View File

@ -160,7 +160,9 @@ const CLogCategoryDesc LogCategories[] =
{BCLog::VALIDATION, "validation"}, {BCLog::VALIDATION, "validation"},
{BCLog::I2P, "i2p"}, {BCLog::I2P, "i2p"},
{BCLog::IPC, "ipc"}, {BCLog::IPC, "ipc"},
#ifdef DEBUG_LOCKCONTENTION
{BCLog::LOCK, "lock"}, {BCLog::LOCK, "lock"},
#endif
{BCLog::BLOCKSTORE, "blockstorage"}, {BCLog::BLOCKSTORE, "blockstorage"},
{BCLog::TXRECONCILIATION, "txreconciliation"}, {BCLog::TXRECONCILIATION, "txreconciliation"},
{BCLog::ALL, "1"}, {BCLog::ALL, "1"},

View File

@ -61,7 +61,9 @@ namespace BCLog {
VALIDATION = (1 << 21), VALIDATION = (1 << 21),
I2P = (1 << 22), I2P = (1 << 22),
IPC = (1 << 23), IPC = (1 << 23),
#ifdef DEBUG_LOCKCONTENTION
LOCK = (1 << 24), LOCK = (1 << 24),
#endif
BLOCKSTORE = (1 << 26), BLOCKSTORE = (1 << 26),
TXRECONCILIATION = (1 << 27), TXRECONCILIATION = (1 << 27),

View File

@ -16,6 +16,7 @@
#include <hash.h> #include <hash.h>
#include <i2p.h> #include <i2p.h>
#include <limitedmap.h> #include <limitedmap.h>
#include <logging.h>
#include <net_permissions.h> #include <net_permissions.h>
#include <netaddress.h> #include <netaddress.h>
#include <netbase.h> #include <netbase.h>
@ -42,6 +43,7 @@
#include <cstdint> #include <cstdint>
#include <deque> #include <deque>
#include <functional> #include <functional>
#include <list>
#include <map> #include <map>
#include <memory> #include <memory>
#include <optional> #include <optional>

View File

@ -5,6 +5,7 @@
#include <stats/rawsender.h> #include <stats/rawsender.h>
#include <logging.h>
#include <netaddress.h> #include <netaddress.h>
#include <netbase.h> #include <netbase.h>
#include <util/sock.h> #include <util/sock.h>

View File

@ -6,8 +6,11 @@
#ifndef BITCOIN_SYNC_H #ifndef BITCOIN_SYNC_H
#define BITCOIN_SYNC_H #define BITCOIN_SYNC_H
#ifdef DEBUG_LOCKCONTENTION
#include <logging.h> #include <logging.h>
#include <logging/timer.h> #include <logging/timer.h>
#endif
#include <threadsafety.h> #include <threadsafety.h>
#include <util/macros.h> #include <util/macros.h>
@ -161,8 +164,10 @@ private:
void Enter(const char* pszName, const char* pszFile, int nLine) void Enter(const char* pszName, const char* pszFile, int nLine)
{ {
EnterCritical(pszName, pszFile, nLine, Base::mutex()); EnterCritical(pszName, pszFile, nLine, Base::mutex());
#ifdef DEBUG_LOCKCONTENTION
if (Base::try_lock()) return; if (Base::try_lock()) return;
LOG_TIME_MICROS_WITH_CATEGORY(strprintf("lock contention %s, %s:%d", pszName, pszFile, nLine), BCLog::LOCK); LOG_TIME_MICROS_WITH_CATEGORY(strprintf("lock contention %s, %s:%d", pszName, pszFile, nLine), BCLog::LOCK);
#endif
Base::lock(); Base::lock();
} }

View File

@ -18,13 +18,17 @@
#include <vector> #include <vector>
/** /**
* Identical to TestingSetup but excludes lock contention logging, as some of * Identical to TestingSetup but excludes lock contention logging if
* these tests are designed to be heavily contested to trigger race conditions * `DEBUG_LOCKCONTENTION` is defined, as some of these tests are designed to be
* or other issues. * heavily contested to trigger race conditions or other issues.
*/ */
struct NoLockLoggingTestingSetup : public TestingSetup { struct NoLockLoggingTestingSetup : public TestingSetup {
NoLockLoggingTestingSetup() NoLockLoggingTestingSetup()
#ifdef DEBUG_LOCKCONTENTION
: TestingSetup{CBaseChainParams::MAIN, /*extra_args=*/{"-debugexclude=lock"}} {} : TestingSetup{CBaseChainParams::MAIN, /*extra_args=*/{"-debugexclude=lock"}} {}
#else
: TestingSetup{CBaseChainParams::MAIN} {}
#endif
}; };
BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, NoLockLoggingTestingSetup) BOOST_FIXTURE_TEST_SUITE(checkqueue_tests, NoLockLoggingTestingSetup)

View File

@ -56,9 +56,6 @@ class RpcMiscTest(BitcoinTestFramework):
self.log.info("test logging rpc and help") self.log.info("test logging rpc and help")
# Test logging RPC returns the expected number of logging categories.
assert_equal(len(node.logging()), 40)
# Test toggling a logging category on/off/on with the logging RPC. # Test toggling a logging category on/off/on with the logging RPC.
assert_equal(node.logging()['qt'], True) assert_equal(node.logging()['qt'], True)
node.logging(exclude=['qt']) node.logging(exclude=['qt'])