elements/src/util
merge-script 19f277711e
Merge bitcoin/bitcoin#26593: tracing: Only prepare tracepoint arguments when actually tracing
0de3e96e33 tracing: use bitcoind pid in bcc tracing examples (0xb10c)
411c6cfc6c tracing: only prepare tracepoint args if attached (0xb10c)
d524c1ec06 tracing: dedup TRACE macros & rename to TRACEPOINT (0xb10c)

Pull request description:

  Currently, if the tracepoints are compiled (e.g. in depends and release builds), we always prepare the tracepoint arguments regardless of the tracepoints being used or not. We made sure that the argument preparation is as cheap as possible, but we can almost completely eliminate any overhead for users not interested in the tracepoints (the vast majority), by gating the tracepoint argument preparation with an `if(something is attached to this tracepoint)`. To achieve this, we use the optional semaphore feature provided by SystemTap.

  The first commit simplifies and deduplicates our tracepoint macros from 13 TRACEx macros to a single TRACEPOINT macro. This makes them easier to use and also avoids more duplicate macro definitions in the second commit.

  The Linux tracing tools I'm aware of (bcc, bpftrace, libbpf, and systemtap) all support the semaphore gating feature. Thus, all existing tracepoints and their argument preparation is gated in the second commit. For details, please refer to the commit messages and the updated documentation in `doc/tracing.md`.

  Also adding unit tests that include all tracepoint macros to make sure there are no compiler problems with them (e.g. some varadiac extension not supported).

  Reviewers might want to check:
  - Do the tracepoints still work for you? Do the examples in `contrib/tracing/` run on your system (as bpftrace frequently breaks on every new version, please test master too if it should't work for you)? Do the CI interface tests still pass?
  - Is the new documentation clear?
  - The `TRACEPOINT_SEMAPHORE(event, context)` macros places global variables in our global namespace. Is this something we strictly want to avoid or maybe move to all `TRACEPOINT_SEMAPHORE`s to a separate .cpp file or even namespace? I like having the `TRACEPOINT_SEMAPHORE()` in same file as the `TRACEPOINT()`, but open for suggestion on alternative approaches.
  - Are newly added tracepoints in the unit tests visible when using `readelf -n build/src/test/test_bitcoin`? You can run the new unit tests with `./build/src/test/test_bitcoin --run_test=util_trace_tests* --log_level=all`.
  <details><summary>Two of the added unit tests demonstrate that we are only processing the tracepoint arguments when attached by having a test-failure condition in the tracepoint argument preparation. The following bpftrace script can be used to demonstrate that the tests do indeed fail when attached to the tracepoints.</summary>

  `fail_tests.bt`:

  ```c
  #!/usr/bin/env bpftrace

  usdt:./build/src/test/test_bitcoin:test:check_if_attached {
    printf("the 'check_if_attached' test should have failed\n");
  }

  usdt:./build/src/test/test_bitcoin:test:expensive_section {
    printf("the 'expensive_section' test should have failed\n");
  }
  ```

  Run the unit tests with `./build/src/test/test_bitcoin` and start `bpftrace fail_tests.bt -p $(pidof test_bitcoin)` in a separate terminal. The unit tests should fail with:

  ```
  Running 594 test cases...
  test/util_trace_tests.cpp(31): error: in "util_trace_tests/test_tracepoint_check_if_attached": check false has failed
  test/util_trace_tests.cpp(51): error: in "util_trace_tests/test_tracepoint_manual_tracepoint_active_check": check false has failed

  *** 2 failures are detected in the test module "Bitcoin Core Test Suite"
  ```

  </details>

  These links might provide more contextual information for reviewers:
  - [How SystemTap Userspace Probes Work by eklitzke](https://eklitzke.org/how-sytemtap-userspace-probes-work) (actually an example on Bitcoin Core; mentions that with semaphores "the overhead for an untraced process is effectively zero.")
  - [libbpf comment on USDT semaphore handling](1596a09b5d/src/usdt.c (L83-L92)) (can recommend the whole comment for background on how the tracepoints and tracing tools work together)
  - https://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation#Semaphore_Handling

ACKs for top commit:
  willcl-ark:
    utACK 0de3e96e33
  laanwj:
    re-ACK 0de3e96e33
  jb55:
    utACK 0de3e96e33
  vasild:
    ACK 0de3e96e33

Tree-SHA512: 0e5e0dc5e0353beaf5c446e4be03d447e64228b1be71ee9972fde1d6fac3fac71a9d73c6ce4fa68975f87db2b2bf6eee2009921a2a145e24d83a475d007a559b
2024-11-11 10:33:28 +00:00
..
any.h refactor: Split util::AnyPtr into its own file 2023-05-20 12:03:33 +02:00
asmap.cpp streams: cache file position within AutoFile 2024-09-13 07:35:41 -04:00
asmap.h refactor: Move fs.* to util/fs.* 2023-03-23 12:55:18 +01:00
batchpriority.cpp refactor: Move ScheduleBatchPriority to its own file 2023-05-20 12:03:30 +02:00
batchpriority.h refactor: Move ScheduleBatchPriority to its own file 2023-05-20 12:03:30 +02:00
bip32.cpp Merge bitcoin/bitcoin#26076: Switch hardened derivation marker to h 2023-05-08 13:31:28 -04:00
bip32.h Switch hardened derivation marker to h in descriptors 2023-04-04 18:33:08 +02:00
bitdeque.h refactor: Fix "error C2248: cannot access private member" on MSVC 2024-04-28 07:11:24 +01:00
bitset.h util: add BitSet 2024-06-10 07:54:48 -04:00
bytevectorhash.cpp random: get rid of GetRand by inlining 2024-07-01 12:39:53 -04:00
bytevectorhash.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
chaintype.cpp testnet: Introduce Testnet4 2024-08-06 01:38:10 +02:00
chaintype.h testnet: Introduce Testnet4 2024-08-06 01:38:10 +02:00
check.cpp Make G_FUZZING constexpr, require -DBUILD_FOR_FUZZING=ON to execute a fuzz target 2024-10-31 13:51:37 +01:00
check.h Make G_FUZZING constexpr, require -DBUILD_FOR_FUZZING=ON to execute a fuzz target 2024-10-31 13:51:37 +01:00
CMakeLists.txt common: move pcp.cpp and netif.cpp files from util to common library since they depend on netaddress.cpp 2024-10-01 09:28:31 -04:00
epochguard.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
exception.cpp refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
exception.h refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
fastrange.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
feefrac.cpp Avoid explicitly computing diagram; compare based on chunks 2024-04-22 09:36:36 -04:00
feefrac.h clusterlin: add DepGraph::RemoveTransactions and support for holes in DepGraph 2024-10-07 13:49:35 -04:00
fs.cpp Add tests for C++20 std::u8string 2023-12-11 17:42:05 +01:00
fs.h refactor: Rename fs::path::u8string() to fs::path::utf8string() 2023-12-14 16:22:40 +01:00
fs_helpers.cpp build: Replace MAC_OSX macro with existing __APPLE__ 2024-10-24 12:29:26 +02:00
fs_helpers.h util: add perm string helper functions 2024-06-27 14:55:10 +01:00
golombrice.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
hash_type.h move-only: Add util/hash_type 2021-05-11 10:38:18 +02:00
hasher.cpp random: get rid of GetRand by inlining 2024-07-01 12:39:53 -04:00
hasher.h Bump g++ minimum supported version to 10 2023-10-30 15:12:26 +01:00
insert.h refactor: Split util::insert into its own file 2023-05-20 12:03:31 +02:00
macros.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
moneystr.cpp util: Move util/string.h functions to util namespace 2024-05-16 10:16:08 -05:00
moneystr.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
overflow.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
overloaded.h doc: Clarify C++20 comments 2024-01-05 11:22:31 +01:00
rbf.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
rbf.h scripted-diff: Bump copyright headers 2021-12-30 19:36:57 +02:00
readwritefile.cpp refactor: Move fs.* to util/fs.* 2023-03-23 12:55:18 +01:00
readwritefile.h refactor: Move fs.* to util/fs.* 2023-03-23 12:55:18 +01:00
result.h refactor: Avoid copying util::Result values 2024-04-25 16:08:24 -04:00
serfloat.cpp Add platform-independent float encoder/decoder 2021-05-24 16:04:44 -07:00
serfloat.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
signalinterrupt.cpp util: Get rid of uncaught exceptions thrown by SignalInterrupt class 2023-12-04 15:39:15 -04:00
signalinterrupt.h util: Get rid of uncaught exceptions thrown by SignalInterrupt class 2023-12-04 15:39:15 -04:00
sock.cpp sock: change Sock::SendComplete() to take Span 2023-10-31 18:19:22 +01:00
sock.h sock: change Sock::SendComplete() to take Span 2023-10-31 18:19:22 +01:00
strencodings.cpp util: remove unused IsHexNumber 2024-08-23 13:53:40 +01:00
strencodings.h util: Add consteval ""_hex[_v][_u8] literals 2024-08-28 19:09:51 +02:00
string.cpp util: Move util/string.h functions to util namespace 2024-05-16 10:16:08 -05:00
string.h util: Use compile-time check for FatalErrorf 2024-09-12 15:01:20 +02:00
subprocess.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
syserror.cpp scripted-diff: drop config/ subdir for bitcoin-config.h, rename to bitcoin-build-config.h 2024-10-10 12:22:12 +02:00
syserror.h Show descriptive error messages when FileCommit fails 2023-06-30 09:48:21 -04:00
task_runner.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
thread.cpp refactor: Extract util/exception from util/system 2023-03-13 17:09:47 +01:00
thread.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
threadinterrupt.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
threadinterrupt.h util: Add SignalInterrupt class and use in shutdown.cpp 2023-06-28 09:49:28 +02:00
threadnames.cpp build: Replace MAC_OSX macro with existing __APPLE__ 2024-10-24 12:29:26 +02:00
threadnames.h util: avoid using thread_local variable that has a destructor 2024-05-16 18:16:46 +02:00
time.cpp refactor: Use chrono type for g_mock_time 2024-04-15 13:34:31 +02:00
time.h Revert "time: add runtime sanity check" 2024-03-18 16:01:08 +01:00
tokenpipe.cpp scripted-diff: drop config/ subdir for bitcoin-config.h, rename to bitcoin-build-config.h 2024-10-10 12:22:12 +02:00
tokenpipe.h util: Add RAII TokenPipe 2021-03-04 18:24:00 +01:00
trace.h tracing: only prepare tracepoint args if attached 2024-10-28 14:27:47 +01:00
transaction_identifier.h refactor: remove TxidFromString 2024-07-31 16:47:39 +01:00
translation.h util: Catch translation string errors at compile time 2024-07-10 09:40:47 +02:00
types.h doc: Clarify C++20 comments 2024-01-05 11:22:31 +01:00
ui_change_type.h wallet: Do not include server symbols 2020-06-27 11:39:09 -04:00
vecdeque.h utils: add missing include 2024-06-11 16:28:11 +00:00
vector.h chainparams: add blockhash to AssumeutxoData 2023-09-30 06:38:47 -04:00