backport: Merge bitcoin#29404, 28144, 28118#7124
backport: Merge bitcoin#29404, 28144, 28118#7124vijaydasmp wants to merge 3 commits intodashpay:developfrom
Conversation
|
b7df9cf to
fb02f79
Compare
|
This pull request has conflicts, please rebase. |
fb02f79 to
4f53d04
Compare
|
This pull request has conflicts, please rebase. |
4f53d04 to
191caec
Compare
2779ae2 to
2cd9132
Compare
WalkthroughThe diff standardizes conditional inclusion of <config/bitcoin-config.h> (guarded by HAVE_CONFIG_H) across many source files while removing it from several headers. Most changes are compile-time include adjustments with no behavioral changes. Functional edits in src/rpc/node.cpp replace optional GetContext usage with EnsureAnyNodeContext(request.context) and update RPC handlers to call setMockTime on each chain_client and to call MockForward on the node scheduler followed by SyncWithValidationInterfaceQueue(). Tests and P2P utilities include small changes to peer selection and addr-message handling. Sequence Diagram(s)mermaid RPC_Client->>RPC_Handler: send "setmocktime" request mermaid RPC_Client->>RPC_Handler: send "mockscheduler" request Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
9d1dbbd scripted-diff: Fix bitcoin_config_h includes (TheCharlatan) Pull request description: As mentioned in bitcoin#26924 (comment) and bitcoin#29263 (comment), it is currently not safe to remove `bitcoin-config.h` includes from headers because some unrelated file might be depending on it. See also bitcoin#26972 for discussion. Solve this by including the file directly everywhere it's required, regardless of whether or not it's already included by another header. There should be no functional change here, but it will allow us to safely remove includes from headers in the future. ~I'm afraid it's a bit tedious to reproduce these commits, but it's reasonably straightforward:~ Edit: See note below ```bash # All commands executed from the src/ subdir. # Collect all tokens from bitcoin-config.h.in # Isolate the tokens and remove blank lines # Replace newlines with | and remove the last trailing one # Collect all files which use these tokens # Filter out subprojects (proper forwarding can be verified from Makefiles) # Filter out .rc files # Save to a text file git grep -E -l `grep undef config/bitcoin-config.h.in | cut -d" " -f2 | grep -v '^$' | tr '\n' '|' | sed 's/|$//'` | grep -v -e "^leveldb/" -e "^secp256k1/" -e "^crc32c/" -e "^minisketch/" -e "^Makefile" -e "\.rc$" > files-with-config-include.txt # Find all files from the above list which don't include bitcoin-config.h git grep -L -E "config/bitcoin-config.h" -- `cat files-with-config-include.txt` # Include them manually with the exception of some files in crypto: # crypto/sha256_arm_shani.cpp crypto/sha256_avx2.cpp crypto/sha256_sse41.cpp crypto/sha256_x86_shani.cpp # These are exceptions which don't use bitcoin-config.h, rather the Makefile.am adds these cppflags manually. # Commit changes. This should match the first commit of this PR. # Use the same search as above to find all files which DON'T use any config tokens git grep -E -L `grep undef config/bitcoin-config.h.in | cut -d" " -f2 | grep -v '^$' | tr '\n' '|' | sed 's/|$//'` | grep -v -e "^leveldb/" -e "^secp256k1/" -e "^crc32c/" -e "^minisketch/" -e "^Makefile" -e "\.rc$" > files-without-config-include.txt # Manually remove the includes and commit changes. This should match the second commit of this PR. ``` Edit: I'll keep this old description for posterity, but the manual approach has been replaced with a scripted diff from TheCharlatan ACKs for top commit: maflcko: ACK 9d1dbbd 🚪 TheCharlatan: ACK 9d1dbbd hebasto: ACK 9d1dbbd, I have reviewed the code and it looks OK. fanquake: ACK 9d1dbbd Tree-SHA512: f11ddc4ae6a887f96b954a6b77f310558ddb271088a3fda3edc833669c4251b7f392515224bbb8e5f67eb2c799b4ffed3b07d96454e82ec635c686d0df545872
…ching.py 8a20f76 test: drop duplicate getaddrs from p2p_getaddr_caching (Martin Zumsande) feb0096 test: fix intermittent failure in p2p_getaddr_caching (Martin Zumsande) Pull request description: Fixes bitcoin#28133 In the consistency check, it's not enough to check that our address/port is unique, only the combination of source and target must be unique. Otherwise, the OS may reuse ports for connections to different `-addrbind`, which was happening in the failed runs. While at it, the second commit cleans up duplicate `getaddr` messages in `p2p_getaddr_caching.py` that do nothing but generate `Ignoring repeated "getaddr"` log messages (and cleans up some whitespace the python linter complains about). ACKs for top commit: vasild: ACK 8a20f76 Tree-SHA512: eabe4727d7887f729074076f6333a918bba8cb34b8e3baaa83f167b441b0daa24f7c4824abcf03a9538a2ef14b2d826ff19aeffcb93a6c20735253a9678aac9c Fixing Linting error - 'time' module imported but not used
…ckscheduler RPC fabef12 refactor: Use EnsureAnyNodeContext (MarcoFalke) fa16406 test: Add SyncWithValidationInterfaceQueue to mockscheduler RPC (MarcoFalke) Pull request description: There should be no risk or downside in adding a call to `SyncWithValidationInterfaceQueue` here. In fact, it will make tests less brittle. For example, * If one sets the timeouts in `test/functional/feature_fee_estimation.py` to `0`, on `master` the test will fail and here it will pass. * It may avoid a rare (theoretic) intermittent issue in https://github.com/bitcoin/bitcoin/pull/28108/files#r1268966663 ACKs for top commit: TheCharlatan: ACK fabef12 furszy: Code review ACK fabef12. Convinced by checking all current tests usages. Tree-SHA512: c9e9a536a8721d1b3f267a66b40578b34948892301affdcad121ef8e02bf17037305d0dd53aa94b1b064753e66f9cfb31823b916b707a9d812627f502b818003
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/rpc/node.cpp (1)
7-11: Include order:config/bitcoin-config.hshould be included before other headers.The config header defines macros (e.g.,
HAVE_MALLOC_INFOused on line 43) that may affect how subsequent headers behave. Placing the config include after<addressindex.h>violates the standard pattern where config headers come first.Suggested fix
+#if defined(HAVE_CONFIG_H) +#include <config/bitcoin-config.h> +#endif + `#include` <addressindex.h> -#if defined(HAVE_CONFIG_H) -#include <config/bitcoin-config.h> -#endif - `#include` <chainparams.h>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/rpc/node.cpp` around lines 7 - 11, Move the config include so it appears before any other headers: place `#if` defined(HAVE_CONFIG_H) / `#include` <config/bitcoin-config.h> at the top of src/rpc/node.cpp (above `#include` <addressindex.h>) so macros like HAVE_MALLOC_INFO are defined before other headers are processed; update the include block around the existing preprocessor directives accordingly to ensure config is included first.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@test/functional/test_framework/test_node.py`:
- Line 723: The peer matching assumes addrbind is always present and can raise
KeyError; update the filter in test_node.py where getpeerinfo() is iterated (the
list comprehension that builds info) to safely handle missing addrbind by using
peer.get("addrbind") (or "in" check) when comparing to dst_addr_and_port, so
replace peer["addrbind"] == dst_addr_and_port with a safe check such as
peer.get("addrbind") == dst_addr_and_port to avoid KeyError for peers without
addrbind while still matching addr and addrbind correctly for our_addr_and_port
and dst_addr_and_port.
---
Nitpick comments:
In `@src/rpc/node.cpp`:
- Around line 7-11: Move the config include so it appears before any other
headers: place `#if` defined(HAVE_CONFIG_H) / `#include` <config/bitcoin-config.h>
at the top of src/rpc/node.cpp (above `#include` <addressindex.h>) so macros like
HAVE_MALLOC_INFO are defined before other headers are processed; update the
include block around the existing preprocessor directives accordingly to ensure
config is included first.
ℹ️ Review info
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (56)
src/addrdb.cppsrc/addrman.cppsrc/bench/verify_script.cppsrc/bench/wallet_create.cppsrc/bench/wallet_loading.cppsrc/clientversion.cppsrc/compat/compat.hsrc/crypto/chacha20poly1305.cppsrc/crypto/muhash.hsrc/crypto/sha256.cppsrc/netaddress.hsrc/netbase.hsrc/qt/addressbookpage.cppsrc/qt/askpassphrasedialog.cppsrc/qt/bitcoingui.cppsrc/qt/coincontroldialog.cppsrc/qt/guiutil.cppsrc/qt/modaloverlay.cppsrc/qt/notificator.cppsrc/qt/paymentserver.cppsrc/qt/paymentserver.hsrc/qt/sendcoinsentry.cppsrc/qt/sendcoinsrecipient.hsrc/qt/test/apptests.cppsrc/qt/test/optiontests.cppsrc/qt/transactiondesc.cppsrc/qt/walletmodel.cppsrc/qt/walletmodel.hsrc/qt/walletmodeltransaction.cppsrc/random.cppsrc/rest.cppsrc/rpc/external_signer.cppsrc/rpc/mining.cppsrc/rpc/node.cppsrc/rpc/register.hsrc/rpc/server.cppsrc/rpc/util.cppsrc/serialize.hsrc/support/lockedpool.cppsrc/sync.cppsrc/test/script_tests.cppsrc/test/system_tests.cppsrc/test/util/setup_common.cppsrc/validation.cppsrc/validation.hsrc/wallet/init.cppsrc/wallet/rpc/addresses.cppsrc/wallet/rpc/backup.cppsrc/wallet/rpc/wallet.cppsrc/wallet/sqlite.cppsrc/wallet/test/db_tests.cppsrc/wallet/test/util.hsrc/wallet/walletdb.cppsrc/warnings.cpptest/functional/p2p_getaddr_caching.pytest/functional/test_framework/test_node.py
💤 Files with no reviewable changes (19)
- src/netaddress.h
- src/qt/sendcoinsentry.cpp
- src/validation.h
- src/support/lockedpool.cpp
- src/qt/sendcoinsrecipient.h
- src/qt/addressbookpage.cpp
- src/qt/transactiondesc.cpp
- src/qt/paymentserver.cpp
- src/crypto/muhash.h
- src/netbase.h
- src/qt/walletmodel.h
- src/qt/askpassphrasedialog.cpp
- src/qt/test/apptests.cpp
- src/qt/walletmodeltransaction.cpp
- src/sync.cpp
- src/qt/walletmodel.cpp
- src/qt/paymentserver.h
- src/qt/coincontroldialog.cpp
- src/compat/compat.h
🚧 Files skipped from review as they are similar to previous changes (23)
- src/wallet/test/util.h
- src/random.cpp
- src/serialize.h
- src/wallet/rpc/addresses.cpp
- src/bench/wallet_loading.cpp
- src/wallet/rpc/wallet.cpp
- src/rpc/mining.cpp
- src/wallet/sqlite.cpp
- src/bench/verify_script.cpp
- src/wallet/init.cpp
- src/qt/modaloverlay.cpp
- src/rest.cpp
- src/test/system_tests.cpp
- src/test/script_tests.cpp
- src/qt/guiutil.cpp
- src/qt/notificator.cpp
- src/addrdb.cpp
- src/crypto/sha256.cpp
- src/wallet/rpc/backup.cpp
- src/rpc/server.cpp
- src/rpc/external_signer.cpp
- test/functional/p2p_getaddr_caching.py
- src/crypto/chacha20poly1305.cpp
| our_addr_and_port = f"{sockname[0]}:{sockname[1]}" | ||
| info = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port] | ||
| dst_addr_and_port = f"{p2p_conn.dstaddr}:{p2p_conn.dstport}" | ||
| info = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port and peer["addrbind"] == dst_addr_and_port] |
There was a problem hiding this comment.
Handle optional addrbind safely in peer matching.
Line 723 assumes peer["addrbind"] always exists, but getpeerinfo documents addrbind as optional (src/rpc/net.cpp Line 108-115, 207-211). This can throw KeyError and reintroduce intermittent test failures.
Proposed fix
- info = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port and peer["addrbind"] == dst_addr_and_port]
+ peers = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port]
+ info = [peer for peer in peers if peer.get("addrbind") == dst_addr_and_port]
+ if not info:
+ # Fallback for peers where addrbind is not reported by getpeerinfo.
+ info = peers📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| info = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port and peer["addrbind"] == dst_addr_and_port] | |
| peers = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port] | |
| info = [peer for peer in peers if peer.get("addrbind") == dst_addr_and_port] | |
| if not info: | |
| # Fallback for peers where addrbind is not reported by getpeerinfo. | |
| info = peers |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/functional/test_framework/test_node.py` at line 723, The peer matching
assumes addrbind is always present and can raise KeyError; update the filter in
test_node.py where getpeerinfo() is iterated (the list comprehension that builds
info) to safely handle missing addrbind by using peer.get("addrbind") (or "in"
check) when comparing to dst_addr_and_port, so replace peer["addrbind"] ==
dst_addr_and_port with a safe check such as peer.get("addrbind") ==
dst_addr_and_port to avoid KeyError for peers without addrbind while still
matching addr and addrbind correctly for our_addr_and_port and
dst_addr_and_port.
bitcoin backporting
🤕➡️🛌🩹➡️💪⚡💻🔙