mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
merge bitcoin#24770: Put lock logging behind DEBUG_LOCKCONTENTION preprocessor directive
This commit is contained in:
parent
d9cc2ea178
commit
f331cbe8c8
@ -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
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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"},
|
||||||
|
@ -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),
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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'])
|
||||||
|
Loading…
Reference in New Issue
Block a user