Avoid errors from asynchronous (non-c++) clients#240
Avoid errors from asynchronous (non-c++) clients#240ryanofsky merged 3 commits intobitcoin-core:masterfrom
Conversation
|
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers. ReviewsSee the guideline for information on the review process.
If your review is incorrectly listed, please copy-paste ConflictsReviewers, this pull request conflicts with the following ones:
If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first. LLM Linter (✨ experimental)Possible typos and grammar issues:
2026-02-20 16:59:02 |
|
Updated ba865d9 -> 92a2c5f ( |
The change moves code responsible for posting work to the execution thread, and notifying the event loop thread after execution is finished out of type-context.h and into a new ProxyServer<Thread>::post() method. This commit does not change behavior other than changing log messages, but improvements are made in upcoming commits which extend the new method.
If multiple IPC requests happen at the same time specifying same Context.thread to run the requests on, queue the requests to execute in the order they are received instead of raising a "thread busy" exception. This change has no effect on C++ clients using libmultiprocess as a client library, since the libmultiprocess client only makes blocking calls and creates a server thread for every client thread, so it's not possible for there to be multiple calls on the same server thread. But this change may be useful for rust and python clients as discussed bitcoin/bitcoin#33923
…erface pointer This is a fix for bitcoin/bitcoin#34250 which reports that bitcoin node crashes if a rust stratrumv2 mining client calls BlockTemplate.waitNext() and disconnects without waiting for a response from the call, and if mempool fees increased so the call returns a non-null interface BlockTemplate pointer. The node would crash in this case while trying to call MakeProxyServer on the returned BlockTemplate pointer, which would fail because MakeProxyServer would try to use a reference to the Connection object that had been deleted as a result of the disconnect. The fix works by: - Adding a Connection::m_canceler member variable and using it to cancel any IPC response promises that are pending when the connection is destroyed. - Updating ProxyServer<Thread>::post to use promise.attach() as described https://capnproto.org/cxxrpc.html#cancellation to detect cancellation and set a ServerContext::request_canceled variable. - Updating ServerCall to check the ServerContext::request_canceled status after any C++ server method returns, and throw an exception if it is set. - Updating type-context.h PassField() function to deal with the exception by catching and logging it.
|
Concept ACK |
|
Updated 92a2c5f -> 1f307fb ( |
|
Have been debugging a TSAN race condition (https://github.com/bitcoin/bitcoin/actions/runs/21421194207/job/61680781122?pr=34422#step:11:4303) the functional test in bitcoin/bitcoin#34422 detects in the new code, that is not triggered here because this PR does not currently include a test that triggers IPC request cancellation. The race seems real and fixable, also probably unlikely to cause problems in practice. In the control flow when an IPC gets cancelled, TSAN sees the worker thread doing a I think this should be fixable by having the worker thread acquire a lock in the brief period when it reads request parameters, before executing the IPC call, and also acquire the lock after executing the call when it is writing request results. Then the cancellation callback, if triggered, can acquire the same lock and TSAN can be aware of the ordering between the two threads |
@ryanofsky is that something you want to add here? |
|
re: #240 (comment)
Yes thanks, added a new commit which does this and fixes the TSAN error locally for me. Will update bitcoin/bitcoin#34422 and confirm it fixes the failure there too. Rebased 1f307fb -> 1d7debf ( Updated 1d7debf -> 4f42fc4 ( |
1f307fb to
4f42fc4
Compare
|
@ryanofsky I'm having a bit of trouble understanding what's happening on which thread, but it seems like a mutex is not the most straightforward solution here? It's not immediately obvious to me what it's guarding, anyway. Perhaps a simple |
Thanks for looking at this! I assume you are asking about the last commit 4f42fc4 which is fixing the race condition detected by TSAN. The issue being fixed in that commit is a race between two threads both potentially accessing capnproto request parameters in an incoming request.
The point of the mutex is to prevent the event loop thread from deleting the request parameters while the worker thread is still reading them. The control flow is a little complicated because of the way parameters are unpacked recursively, but the idea of guarding access to the parameters with a mutex is pretty simple. The What is odd about this fix is that the event loop thread is releasing the mutex before it actually deletes the parameters. This is suspicious, because if the mutex is not locked while they are deleted it does nothing to solve the reverse race condition in the case where the cancellation happens before the parameters start being read. But this case is handled by a separate So the mutex should solve delete-while-reading race condition in a fairly straightforward way even if the control flow is complicated by a lot of recursion and callbacks, and even if it doesn't solve the related delete-before-reading race conditions. Tangent: One observation looking at the code is that while the delete-before-reading reverse case is being handled, it isn't being handled very well because the exception raised is thrown inside the sync block instead of outside of it, and it should probably be an |
|
@ryanofsky Thanks for the explanation, that was very helpful.
|
|
I created a branch and had an agent splinter 558ae11 refactor: Add ProxyServer::post() method into multiple tiny commits: sjors/2026/02/558ae11-split No need to use it here, but it might aid others in reviewing (with Also drew a little diagram to orient myself about where this function lives (IIUC):
Review placeholder: the first two commits, up to 92fed35, mostly make sense to me now. |
Nevermind, I see my mistake now. I was thinking it was the bare mutex that was being unlocked in |
| auto result = kj::newPromiseAndFulfiller<T>(); // Signaled when fn() is called, with its return value. | ||
| bool posted = m_thread_context.waiter->post([this, fn = std::forward<Fn>(fn), result_fulfiller = kj::mv(result.fulfiller)]() mutable { | ||
| bool posted = m_thread_context.waiter->post([this, fn = std::forward<Fn>(fn), ready_fulfiller = kj::mv(ready_fulfiller), result_fulfiller = kj::mv(result.fulfiller)]() mutable { | ||
| m_loop->sync([ready_fulfiller = kj::mv(ready_fulfiller)]() mutable { |
There was a problem hiding this comment.
In 92fed35 Allow simultaneous calls on same Context.thread: maybe add a comment that the goal is to add requested fn() calls to the promise chain as quickly as possible, so we call ready_fulfiller->fulfill(); before executing it.
There was a problem hiding this comment.
re: #240 (comment)
maybe add a comment that the goal is to add requested
fn()calls to the promise chain as quickly as possible, so we callready_fulfiller->fulfill();before executing it.
Thanks, added comment
Sjors
left a comment
There was a problem hiding this comment.
The third commit looks good to me as well.
| // https://github.com/bitcoin/bitcoin/issues/34250 and there would be a | ||
| // crash if execution continued. | ||
| // TODO: Note this detection is racy because cancellation could happen | ||
| // after this check. However, fixing this would require changing the |
There was a problem hiding this comment.
In 0a22425 Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer: for waitNext() the time spent in this race-vulnerable state is minuscule compared to the multi second wait?
In that case, let's not deal with it in this PR.
There was a problem hiding this comment.
re: #240 (comment)
for
waitNext()the time spent in this race-vulnerable state is minuscule compared to the multi second wait?In that case, let's not deal with it in this PR.
Yes this race, like the tsan race fixed in 4f42fc4 would be pretty difficult to trigger unintentionally (or even intentionally). But it turns out the lock added in 4f42fc4 can be used to fix this race as well so I extended it to cover both cases (both event loop deleting params on cancellation while they might be being read, and event loop deleting response on cancellation while it might be being written).
| // client object. | ||
| server.m_context.loop->sync([&] { | ||
| auto self_dispose{kj::mv(self)}; | ||
| if (erase_thread) { |
There was a problem hiding this comment.
In 0a22425 Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer: can you add a comment here to explain why it's important to call sync() without doing anything in particular (where !erase_thread)?
IIUC it's to ensure InterruptException gets thrown as needed, so we can catch it below.
No test breaks (for this commit) if I do:
diff --git a/include/mp/type-context.h b/include/mp/type-context.h
index 134542e..440a3ef 100644
--- a/include/mp/type-context.h
+++ b/include/mp/type-context.h
@@ -113,5 +113,5 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
// makes another IPC call), so avoid modifying the map.
const bool erase_thread{inserted};
- KJ_DEFER(
+ KJ_DEFER(if (erase_thread) {
// Erase the request_threads entry on the event loop
// thread with loop->sync(), so if the connection is
@@ -121,5 +121,4 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
server.m_context.loop->sync([&] {
auto self_dispose{kj::mv(self)};
- if (erase_thread) {
// Look up the thread again without using existing
// iterator since entry may no longer be there after
@@ -133,7 +132,6 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
removed = request_threads.extract(server.m_context.connection);
}
- }
});
- );
+ });
KJ_IF_MAYBE(exception, kj::runCatchingExceptions([&]{
try {(but I guess that makes sense because the commit doesn't touch tests in general)
There was a problem hiding this comment.
re: #240 (comment)
No test breaks (for this commit) if I do:
Interesting find, and I was surprised that diff works, but I think it only works because erase_thread is normally true. The only time when erase_thread should be false is when a client calls a server method, and the server method calls back into the client (for example through a std::function parameter`) and then the client makes another call back into the server on the same thread. This doesn't happen in any mining code but IIRC there are some gui interactions in bitcoin/bitcoin#10102 where it does.
The reason it's important call call loop->sync unconditionally here is run the auto self_dispose{kj::mv(self)}; line so the proxy server object is freed on the event loop thread, not the worker thread, which would not be safe, because the proxy server object is managed by capnproto. I added a comment about the self variable to clarify.
| kj::Promise<T> ProxyServer<Thread>::post(Fn&& fn) | ||
| { | ||
| { | ||
| auto ready = kj::newPromiseAndFulfiller<void>(); // Signaled when waiter is idle again. |
There was a problem hiding this comment.
In "Allow simultaneous calls on same Context.thread" 92fed35
Before this commit, ProxyServer<Thread>::post() threw immediately when the thread was busy:
After 92fed35, post() queues the call by chaining onto m_thread_ready instead of throwing, which enables pipelining but removes the only backpressure mechanism. There is now no bound on chain depth. Every call from a fast producer appends a new node to the chain, each holding a captured lambda with serialized arguments plus two kj::Promise objects; the chain grows without limit.
I'm curious whether it's something we should worry about in practice as a potential for OOM of the server, either by bug or deliberate?
I modified the existing test to simulate a slow server (10s sleep per request) with a large number of queued calls:
setup.server->m_impl->m_int_fn = [&](int n) {
+ std::this_thread::sleep_for(std::chrono::seconds{10});
assert(n == expected);
expected += 100;
return n;
};
-std::atomic<size_t> running{3};
+std::atomic<size_t> running{1000001};The mptest process consumed 17 GB RSS in under 30 seconds.
With while(true), the mptest was killed by OOM:
Out of memory: Killed process 2461509 (mptest)
total-vm:53,439,684kB anon-rss:53,617,500kB
Worth noting that in the mptest process the client and server share the same address space, so the 17 GB figure includes client-side memory (unsent/pending capnp requests) as well as server-side promise chain growth?
A potential naive solution, if this is deemed worth fixing, is a depth counter with a limit. increment before queuing, throw if the limit is exceeded, and decrement after the result is dispatched
+ uint64_t m_maximum_promise_depth{1000};
+ uint64_t m_pending_tasks{0};
template<typename T, typename Fn>
kj::Promise<T> ProxyServer<Thread>::post(Fn&& fn)
{
+ if (m_pending_tasks >= m_maximum_promise_depth) {
+ throw std::runtime_error("maximum promise depth reached");
+ }
+ m_pending_tasks += 1;
+
auto ready = kj::newPromiseAndFulfiller<void>();
auto ret = m_thread_ready.then([this, fn = std::forward<Fn>(fn),
ready_fulfiller = kj::mv(ready.fulfiller)]() mutable {
...
- m_loop->sync([&result_value, &exception, result_fulfiller = kj::mv(result_fulfiller)]() mutable {
+ m_loop->sync([this, &result_value, &exception, result_fulfiller = kj::mv(result_fulfiller)]() mutable {
KJ_IF_MAYBE(e, exception) {
result_fulfiller->reject(kj::mv(*e));
} else {
result_fulfiller->fulfill(kj::mv(*result_value));
result_value.reset();
}
+ m_pending_tasks--;
result_fulfiller = nullptr;
});
});With the fix applied, running mptest with a modified running=1001, a 10s server sleep holds RSS at a stable 17 MB and throws cleanly at depth 1000:
remote exception: std::exception: maximum promise depth reached
VmRSS: 17,484 kB
At running=1000001 with the fix, RSS reached ~9.5 GB from client memory alone.
This implies that in a real deployment where client and server are separate processes, the server would be protected by this fix, but the client could still exhaust its own memory independently. This fix addresses the server-side only.
Maybe there is even a more interesting approach with kj?
There was a problem hiding this comment.
re: #240 (comment)
removes the only backpressure mechanism
Thankfully, this shouldn't be the case. Cap'n Proto's API is nonblocking, so there is nothing the server can do to directly slow down the rate of client requests. The way flow control is implemented is by having the server send a response to each request after it is processed, and as long as the client waits for these responses, it can avoid sending requests faster than the server processes them, and can limit the number of requests that are queued up.
I'm curious whether it's something we should worry about in practice as a potential for OOM of the server, either by bug or deliberate?
I do think it's something we may want to worry about, and we may want to add counters and hard caps on things like number of objects, connections, threads, and pending requests in the future.
I think your m_pending_tasks idea is basically the right approach, although I probably we would want the counter to be more global, like one counter per UNIX socket path instead of one counter per thread object. This way badly behaved clients would not be able to circumvent the limit by creating many connections or many threads.
Initially in bitcoin/bitcoin#33923, I resisted the idea the clients should be able to send arbitrary numbers of requests and have them queued up on the server. But I changed my mind after realizing this is already how cap'n proto handles requests that run on the event loop thread, so this would just be making requests that run on worker threads behave consistently. Also this behavior is potentially useful if clients need multiple pieces of data from the server, so they can just send all the requests at once instead of staggering them.
There was a problem hiding this comment.
I do think it's something we may want to worry about, and we may want to add counters and hard caps on things like number of objects, connections, threads, and pending requests in the future.
I agree on capping them all, not just this.
There was a problem hiding this comment.
re: #240 (comment)
I agree on capping them all, not just this.
Yes would welcome a PR to add limits on numbers of threads, objects, queued tasks and things like that. In addition to dealing with misbehaving clients better, the counters could also be useful for debugging and monitoring. Probably it would make sense to cap more expensive things like threads and connections before smaller objects like these promises, though.
| ~ProxyServer(); | ||
| kj::Promise<void> getName(GetNameContext context) override; | ||
|
|
||
| //! Run a callback function returning T on this thread. |
There was a problem hiding this comment.
In "refactor: Add ProxyServer::post() method" 558ae11
nit: clarify that we return a T promise?
There was a problem hiding this comment.
re: #240 (comment)
nit: clarify that we return a T promise?
Thanks, expanded the comment to describe the behavior and what's returned.
|
|
||
| ProxyServer<Thread>::ProxyServer(ThreadContext& thread_context, std::thread&& thread) | ||
| : m_thread_context(thread_context), m_thread(std::move(thread)) | ||
| ProxyServer<Thread>::ProxyServer(Connection& connection, ThreadContext& thread_context, std::thread&& thread) |
There was a problem hiding this comment.
In "refactor: Add ProxyServer::post() method" 558ae11
Are we passing the whole connection here for future profing, i.e we need more things apart from m_loop later?
There was a problem hiding this comment.
re: #240 (comment)
Are we passing the whole connection here for future profing, i.e we need more things apart from m_loop later?
That's one reason, and the other reason is that ProxyServer<Thread> is a specialization of the generic ProxyServer struct which uses a connection pointer to be able to run cleanup code when the connection is destroyed, and I thought it would be good if different ProxyServer specializations were more similar. Choice is admittedly pretty arbitrary, though.
4f42fc4 to
c436ae4
Compare
ryanofsky
left a comment
There was a problem hiding this comment.
Thanks for the detailed reviews!
Updated 4f42fc4 -> c436ae4 (pr/promise.5 -> pr/promise.6, compare) making suggested changes, and merging 3rd and 4th commits and improving them. Instead of just handling the cancellation-while-reading params race case detected by TSAN, the code now handles the cancellation-while-writing-response race case which was previously a TODO, and better handles the cancellation-before-reading-params race case which was previously handled, but not very well, resulting in an uncaught exception. All of these cases would be very unlikely to happen since params and response structs are only accessed very briefly before and after method execution, so accesses by the event thread would be unlikely. But they are good to handle. Other than these change, the other changes were comment, logging, and naming improvements.
| auto result = kj::newPromiseAndFulfiller<T>(); // Signaled when fn() is called, with its return value. | ||
| bool posted = m_thread_context.waiter->post([this, fn = std::forward<Fn>(fn), result_fulfiller = kj::mv(result.fulfiller)]() mutable { | ||
| bool posted = m_thread_context.waiter->post([this, fn = std::forward<Fn>(fn), ready_fulfiller = kj::mv(ready_fulfiller), result_fulfiller = kj::mv(result.fulfiller)]() mutable { | ||
| m_loop->sync([ready_fulfiller = kj::mv(ready_fulfiller)]() mutable { |
There was a problem hiding this comment.
re: #240 (comment)
maybe add a comment that the goal is to add requested
fn()calls to the promise chain as quickly as possible, so we callready_fulfiller->fulfill();before executing it.
Thanks, added comment
| // https://github.com/bitcoin/bitcoin/issues/34250 and there would be a | ||
| // crash if execution continued. | ||
| // TODO: Note this detection is racy because cancellation could happen | ||
| // after this check. However, fixing this would require changing the |
There was a problem hiding this comment.
re: #240 (comment)
for
waitNext()the time spent in this race-vulnerable state is minuscule compared to the multi second wait?In that case, let's not deal with it in this PR.
Yes this race, like the tsan race fixed in 4f42fc4 would be pretty difficult to trigger unintentionally (or even intentionally). But it turns out the lock added in 4f42fc4 can be used to fix this race as well so I extended it to cover both cases (both event loop deleting params on cancellation while they might be being read, and event loop deleting response on cancellation while it might be being written).
| // client object. | ||
| server.m_context.loop->sync([&] { | ||
| auto self_dispose{kj::mv(self)}; | ||
| if (erase_thread) { |
There was a problem hiding this comment.
re: #240 (comment)
No test breaks (for this commit) if I do:
Interesting find, and I was surprised that diff works, but I think it only works because erase_thread is normally true. The only time when erase_thread should be false is when a client calls a server method, and the server method calls back into the client (for example through a std::function parameter`) and then the client makes another call back into the server on the same thread. This doesn't happen in any mining code but IIRC there are some gui interactions in bitcoin/bitcoin#10102 where it does.
The reason it's important call call loop->sync unconditionally here is run the auto self_dispose{kj::mv(self)}; line so the proxy server object is freed on the event loop thread, not the worker thread, which would not be safe, because the proxy server object is managed by capnproto. I added a comment about the self variable to clarify.
| kj::Promise<T> ProxyServer<Thread>::post(Fn&& fn) | ||
| { | ||
| { | ||
| auto ready = kj::newPromiseAndFulfiller<void>(); // Signaled when waiter is idle again. |
There was a problem hiding this comment.
re: #240 (comment)
removes the only backpressure mechanism
Thankfully, this shouldn't be the case. Cap'n Proto's API is nonblocking, so there is nothing the server can do to directly slow down the rate of client requests. The way flow control is implemented is by having the server send a response to each request after it is processed, and as long as the client waits for these responses, it can avoid sending requests faster than the server processes them, and can limit the number of requests that are queued up.
I'm curious whether it's something we should worry about in practice as a potential for OOM of the server, either by bug or deliberate?
I do think it's something we may want to worry about, and we may want to add counters and hard caps on things like number of objects, connections, threads, and pending requests in the future.
I think your m_pending_tasks idea is basically the right approach, although I probably we would want the counter to be more global, like one counter per UNIX socket path instead of one counter per thread object. This way badly behaved clients would not be able to circumvent the limit by creating many connections or many threads.
Initially in bitcoin/bitcoin#33923, I resisted the idea the clients should be able to send arbitrary numbers of requests and have them queued up on the server. But I changed my mind after realizing this is already how cap'n proto handles requests that run on the event loop thread, so this would just be making requests that run on worker threads behave consistently. Also this behavior is potentially useful if clients need multiple pieces of data from the server, so they can just send all the requests at once instead of staggering them.
| ~ProxyServer(); | ||
| kj::Promise<void> getName(GetNameContext context) override; | ||
|
|
||
| //! Run a callback function returning T on this thread. |
There was a problem hiding this comment.
re: #240 (comment)
nit: clarify that we return a T promise?
Thanks, expanded the comment to describe the behavior and what's returned.
|
|
||
| ProxyServer<Thread>::ProxyServer(ThreadContext& thread_context, std::thread&& thread) | ||
| : m_thread_context(thread_context), m_thread(std::move(thread)) | ||
| ProxyServer<Thread>::ProxyServer(Connection& connection, ThreadContext& thread_context, std::thread&& thread) |
There was a problem hiding this comment.
re: #240 (comment)
Are we passing the whole connection here for future profing, i.e we need more things apart from m_loop later?
That's one reason, and the other reason is that ProxyServer<Thread> is a specialization of the generic ProxyServer struct which uses a connection pointer to be able to run cleanup code when the connection is destroyed, and I thought it would be good if different ProxyServer specializations were more similar. Choice is admittedly pretty arbitrary, though.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
As pointed out by janb84 in bitcoin/bitcoin#34422 (comment) it makes sense for the on_cancel callback to lock cancel_mutex while it is assigning request_canceled = true. The lock and assigment were introduced in bitcoin-core#240 and in an earlier version of that PR, request_canceled was a std::atomic and the assignment happened before the lock was acquired instead of after, so it was ok for the lock to be unnamed and immediately released after being acquired. But in the final verion of bitcoin-core#240 request_canceled is an ordinary non-atomic bool, and it should be assigned true with the lock held to prevent a theoretical race condition where capn'proto event loop cancels the request before the execution thread runs, and the execution thread sees the old request_canceled = false value and then unsafely accesses deleted parameters. The request being canceled so quickly and parameters being accessed so slowly, and stale request_canceled value being read even after the execution thread has the cancel_mutex lock should be very unlikely to occur in practice, but could happen in theory and is good to fix.
…etical race ef96a5b doc: Comment cleanups after #240 (Ryan Ofsky) e0f1cd7 type-context.h: Extent cancel_mutex lock to prevent theoretical race (Ryan Ofsky) Pull request description: This is a followup to #240 that fixes a theoretical race condition in that PR pointed out by janb bitcoin/bitcoin#34422 (comment). Details are in the commit message. There is also an additional commit fixing up some documentation added in that PR ACKs for top commit: Sjors: ACK ef96a5b Tree-SHA512: 9d3c1585b7e1862a3b2bada48f72c389cf5d60cc72aa348c83fe87fb8f05287971216fc561a4334140df4a8d2bcc28f5256dd733ff3fb4ec08aa72e57d136963
…451f 1868a84451f Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race fd4a90d3103 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues 16dfc368640 ci: avoid bugprone-unused-return-value lint in test dacd5eda464 ci: suppress nontrivial-threadlocal lint in proxy.cpp ef96a5b2be2 doc: Comment cleanups after bitcoin#240 e0f1cd76219 type-context.h: Extent cancel_mutex lock to prevent theoretical race 290702c74ce Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients 3a69d4755af Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8 0174450ca2e Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer ddb5f74196f Allow simultaneous calls on same Context.thread c4762c7b513 refactor: Add ProxyServer<Thread>::post() method 0ade1b40ac5 doc: Bump version number git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 1868a84451fe1b6a00116375a5f717230bb2533e
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
…451f 1868a84451f Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race fd4a90d3103 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues 16dfc368640 ci: avoid bugprone-unused-return-value lint in test dacd5eda464 ci: suppress nontrivial-threadlocal lint in proxy.cpp ef96a5b2be2 doc: Comment cleanups after bitcoin#240 e0f1cd76219 type-context.h: Extent cancel_mutex lock to prevent theoretical race 290702c74ce Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients 3a69d4755af Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8 0174450ca2e Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer ddb5f74196f Allow simultaneous calls on same Context.thread c4762c7b513 refactor: Add ProxyServer<Thread>::post() method 0ade1b40ac5 doc: Bump version number git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 1868a84451fe1b6a00116375a5f717230bb2533e
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
…ust IPC client 8fe91f3 test: Updates needed after bitcoin-core/libmultiprocess#240 (Ryan Ofsky) b7ca3bf Squashed 'src/ipc/libmultiprocess/' changes from 1fc65008f7d..1868a84451f (Ryan Ofsky) 1fea3ba ipc, test: Add tests for unclean disconnect and thread busy behavior (Ryan Ofsky) Pull request description: Includes: - bitcoin-core/libmultiprocess#241 - bitcoin-core/libmultiprocess#240 - bitcoin-core/libmultiprocess#244 - bitcoin-core/libmultiprocess#245 The main change is bitcoin-core/libmultiprocess#240 which fixes issues with asynchronous requests (#33923) and unclean disconnects (#34250) that happen with the rust mining client. It also adds tests for these fixes which had some previous review in #34284 (that PR was closed to simplify dependencies between PRs). The changes can be verified by running `test/lint/git-subtree-check.sh src/ipc/libmultiprocess` as described in [developer notes](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#subtrees) and [lint instructions](https://github.com/bitcoin/bitcoin/tree/master/test/lint#git-subtree-checksh) Resolves #33923 and #34250 ACKs for top commit: Sjors: re-ACK 8fe91f3 janb84: reACK 8fe91f3 Eunovo: ACK 8fe91f3 Tree-SHA512: 7e8923610502ebd8603bbea703f82178ab9e956874d394da3451f5268afda2b964d0eeb399a74d49c4123e728a14c27c0296118577a6063ff03b2b8203a257ce
…451f 1868a84451f Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race fd4a90d3103 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues 16dfc368640 ci: avoid bugprone-unused-return-value lint in test dacd5eda464 ci: suppress nontrivial-threadlocal lint in proxy.cpp ef96a5b2be2 doc: Comment cleanups after bitcoin#240 e0f1cd76219 type-context.h: Extent cancel_mutex lock to prevent theoretical race 290702c74ce Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients 3a69d4755af Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8 0174450ca2e Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer ddb5f74196f Allow simultaneous calls on same Context.thread c4762c7b513 refactor: Add ProxyServer<Thread>::post() method 0ade1b40ac5 doc: Bump version number git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 1868a84451fe1b6a00116375a5f717230bb2533e
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
…451f 1868a84451f Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race fd4a90d3103 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues 16dfc368640 ci: avoid bugprone-unused-return-value lint in test dacd5eda464 ci: suppress nontrivial-threadlocal lint in proxy.cpp ef96a5b2be2 doc: Comment cleanups after bitcoin#240 e0f1cd76219 type-context.h: Extent cancel_mutex lock to prevent theoretical race 290702c74ce Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients 3a69d4755af Merge bitcoin-core/libmultiprocess#241: doc: Bump version number v7 -> v8 0174450ca2e Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer ddb5f74196f Allow simultaneous calls on same Context.thread c4762c7b513 refactor: Add ProxyServer<Thread>::post() method 0ade1b40ac5 doc: Bump version number git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 1868a84451fe1b6a00116375a5f717230bb2533e
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
| template <typename Fn, typename After> | ||
| decltype(auto) TryFinally(Fn&& fn, After&& after) |
There was a problem hiding this comment.
In "Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer" 0174450
| template <typename Fn, typename After> | |
| decltype(auto) TryFinally(Fn&& fn, After&& after) | |
| template <typename F> | |
| concept VoidCallable = std::invocable<F> && std::is_void_v<std::invoke_result_t<F>>; | |
| template <std::invocable Fn, VoidCallable After> | |
| decltype(auto) TryFinally(Fn&& fn, After&& after) | |
This will emit a better error message when a non-callable is passed.
There was a problem hiding this comment.
re: #240 (comment)
This will emit a better error message when a non-callable is passed.
Agree this could be a nice followup.
| //! https://github.com/bitcoin/bitcoin/issues/33575). | ||
| class CancelMonitor | ||
| { | ||
| public: |
There was a problem hiding this comment.
In "Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer" 0174450
Why are all the params public? Shouldn't it be private and then have CancelProve be a friend?
There was a problem hiding this comment.
re: #240 (comment)
Why are all the params public? Shouldn't it be private and then have CancelProve be a friend?
I wouldn't mind changing this but I tend to use public members to avoid boilerplate in low-level plumbing classes like these that are not abstracting anything. I think private members are useful for separating interfaces from implementations, and for encapsulating state and restricting state transitions, and I didn't see those types of benefits here.
ryanofsky
left a comment
There was a problem hiding this comment.
Thanks for the review!
| kj::Promise<T> ProxyServer<Thread>::post(Fn&& fn) | ||
| { | ||
| { | ||
| auto ready = kj::newPromiseAndFulfiller<void>(); // Signaled when waiter is idle again. |
There was a problem hiding this comment.
re: #240 (comment)
I agree on capping them all, not just this.
Yes would welcome a PR to add limits on numbers of threads, objects, queued tasks and things like that. In addition to dealing with misbehaving clients better, the counters could also be useful for debugging and monitoring. Probably it would make sense to cap more expensive things like threads and connections before smaller objects like these promises, though.
| template <typename Fn, typename After> | ||
| decltype(auto) TryFinally(Fn&& fn, After&& after) |
There was a problem hiding this comment.
re: #240 (comment)
This will emit a better error message when a non-callable is passed.
Agree this could be a nice followup.
| //! https://github.com/bitcoin/bitcoin/issues/33575). | ||
| class CancelMonitor | ||
| { | ||
| public: |
There was a problem hiding this comment.
re: #240 (comment)
Why are all the params public? Shouldn't it be private and then have CancelProve be a friend?
I wouldn't mind changing this but I tend to use public members to avoid boilerplate in low-level plumbing classes like these that are not abstracting anything. I think private members are useful for separating interfaces from implementations, and for encapsulating state and restricting state transitions, and I didn't see those types of benefits here.
Upstream PR bitcoin-core/libmultiprocess#240 fixed various issues which require updates to python IPC tests. Those changes are made in this commit.
3edbe8f6 Merge bitcoin-core/libmultiprocess#268: Use throwRecoverableException instead of raw throw for stored exceptions 23be44b0 Use throwRecoverableException instead of raw throw for stored exceptions 75c2a276 Merge bitcoin-core/libmultiprocess#266: test: increase spawn test child timeout to 30 seconds 8b5f8053 Merge bitcoin-core/libmultiprocess#267: doc: Bump version 9 > 10 cc0b23fc test: increase spawn test child timeout to 30 seconds 050f878d doc: Improve versions.md descriptions and formatting c6a288a8 doc: Bump version 9 > 10 70f632bd Merge bitcoin-core/libmultiprocess#265: ci: set LC_ALL in shell scripts 8e8e5642 Merge bitcoin-core/libmultiprocess#249: fixes for race conditions on disconnects 05d34cc2 ci: set LC_ALL in shell scripts e606fd84 Merge bitcoin-core/libmultiprocess#264: ci: reduce nproc multipliers ff0eed1b refactor: Use loop variable in type-context.h ff1d8ba1 refactor: Move type-context.h getParams() call closer to use 1dbc59a4 race fix: m_on_cancel called after request finishes 1643d05b test: m_on_cancel called after request finishes f5509a31 race fix: getParams() called after request cancel 4a60c39f test: getParams() called after request cancel f11ec29e race fix: worker thread destroyed before it is initialized a1d64334 test: worker thread destroyed before it is initialized 33602338 ci: reduce nproc multipliers b090beb9 Merge bitcoin-core/libmultiprocess#256: ci: cache gnu32 nix store be862281 ci: cache gnu32 nix store 975270b6 Merge bitcoin-core/libmultiprocess#263: ci: bump timeout factor to 40 09f10e5a ci: bump timeout factor to 40 db8f76ad Merge bitcoin-core/libmultiprocess#253: ci: run some Bitcoin Core CI jobs 55a9b557 ci: set Bitcoin Core CI test repetition fb0fc84d ci: add TSan job with instrumented libc++ 0f29c387 ci: add Bitcoin Core IPC tests (ASan + macOS) 3f643203 Merge bitcoin-core/libmultiprocess#262: ci: enable clang-tidy in macOS job, use nullptr cd9f8bdc Merge bitcoin-core/libmultiprocess#258: log: add socket connected info message and demote destroy logs to debug b5d6258a Merge bitcoin-core/libmultiprocess#255: fix: use unsigned char cast and sizeof in LogEscape escape sequence d94688e2 Merge bitcoin-core/libmultiprocess#251: Improved CustomBuildField for std::optional in IPC/libmultiprocess a9499fad mp: use nullptr with pthread_threadid_np f499e378 ci: enable clang-tidy in macOS job 98f13521 log: add socket connected info message and demote destroy logs to debug 554a481e fix: use unsigned char cast and sizeof in LogEscape escape sequence 1977b9f3 Use std::forward in CustomBuildField for std::optional to allow move semantics, resolves FIXME 22bec918 Merge bitcoin-core/libmultiprocess#247: type-map: Work around LLVM 22 "out of bounds index" error 8a5e3ae6 Merge bitcoin-core/libmultiprocess#242: proxy-types: add CustomHasField hook to map Cap'n Proto values to null C++ values e8d35246 Merge bitcoin-core/libmultiprocess#246: doc: Bump version 8 > 9 97d87705 proxy-types: add CustomHasField hook for nullable decode paths 8c2f1025 refactor: add missing includes to mp/type-data.h b1638ace doc: Bump version 8 > 9 f61af487 type-map: Work around LLVM 22 "out of bounds index" error 1868a844 Merge bitcoin-core/libmultiprocess#245: type-context.h: Extent cancel_mutex lock to prevent theoretical race fd4a90d3 Merge bitcoin-core/libmultiprocess#244: ci: suppress two tidy lint issues 16dfc368 ci: avoid bugprone-unused-return-value lint in test dacd5eda ci: suppress nontrivial-threadlocal lint in proxy.cpp ef96a5b2 doc: Comment cleanups after #240 e0f1cd76 type-context.h: Extent cancel_mutex lock to prevent theoretical race 290702c7 Merge bitcoin-core/libmultiprocess#240: Avoid errors from asynchronous (non-c++) clients 0174450c Prevent crash on unclean disconnect if abandoned IPC call returns interface pointer ddb5f741 Allow simultaneous calls on same Context.thread c4762c7b refactor: Add ProxyServer<Thread>::post() method git-subtree-dir: src/ipc/libmultiprocess git-subtree-split: 3edbe8f67c182dde91c0050065d79ae268722489
…be35bb2
0abbe35bb2 Merge bitcoin/bitcoin#35148: refactor: Remove confusing DataStream::in_avail() alias
6322c1697d Merge bitcoin/bitcoin#33920: Export embedded ASMap RPC
28a523fb94 Merge bitcoin/bitcoin#35097: util: Return uint64_t from _MiB and _GiB operators
fa43da21f1 refactor: Run ShouldWarnOversizedDbCache calculation in u64
fa5801762e util: Return uint64_t from _MiB and _GiB operators
fa204100e1 streams: Remove confusing DataStream::in_avail()
fa5ab0220e move-only: Extract ProcessPong() helper
2d5ab09f0d Merge bitcoin/bitcoin#35124: bench: fix benchmark fixtures and setup checks
1aef4d53ff Merge bitcoin/bitcoin#34885: kernel: expose btck_block_tree_entry_get_ancestor
e6430b2773 bench: make `setup()` use single-iteration epochs
ba0078e3bf bench: fix ephemeral spend inputs
b8b7f896e8 bench: drop duplicate balance benchmark
290e48fbf0 Merge bitcoin/bitcoin#35128: dbwrapper: avoid copying `CDBIterator` keys in `GetKey()`
f17cd18d02 Merge bitcoin/bitcoin#35116: net: cleanup SOCKS5 auth logging
fa9ddb01c9 test: Use MiB operator directly in cuckoocache_tests
8a843a1b7c Merge bitcoin/bitcoin#34865: logging: better use of log::Entry internally
cd7865b0ce Merge bitcoin/bitcoin#33671: wallet: Add separate balance info for non-mempool wallet txs
0cbd220294 Merge bitcoin/bitcoin#34440: refactor: Change CChain methods to use references, add tests
bb90899955 Merge bitcoin/bitcoin#34435: refactor: use `_MiB`/`_GiB` consistently for byte conversions
8a05adc5f8 Merge bitcoin/bitcoin#35138: doc: add missed advisory to 31.0 rel notes
c95968f780 doc: add missed advisory to 31.0 rel notes
3f09a4703f Merge bitcoin/bitcoin#35132: doc: update release process to mention security advisories pre-announcements
1a4371cc3d Merge bitcoin/bitcoin#34882: refactor: Use NodeClock::time_point in more places
4abc0c2e04 doc: update release process to mention security advisories pre-announcements
875faa29e1 Merge bitcoin/bitcoin#35087: tor: limit torcontrol line size that is processed to prevent OOM
2a90b6132a Add release notes for exportasmap
8cb2d926b4 rpc: Add exportasmap RPC
e32bc7f817 Merge bitcoin/bitcoin#35025: refactor: use `SpanReader` in deserialization benchmarks
13c8df4d5a refactor: replace `DataStream` with `SpanReader` in block deserialization tests
2529f25555 refactor: use `SpanReader` in `PrevectorDeserialize`
b8eb6c2081 refactor: use `SpanReader` in `TestBlockAndIndex`
61d678a6e3 refactor: use `DataStream::clear` in `::read` and `::ignore`
5de2f97a05 dbwrapper: use `SpanReader` for iterator keys
f0e498af5c test: cover failed `CDBIterator::GetKey()` deserialization
d3a40dd9de Merge bitcoin/bitcoin#35127: fuzz: remove redundant CScript method calls from script harness
c9d8582235 fuzz: remove redundant CScript method calls from script harness
89e7c4274c Merge bitcoin/bitcoin#31449: coins,refactor: Reduce `getblockstats` RPC UTXO overhead estimation
6b3dd6314f Merge bitcoin/bitcoin#34863: test: Clean shutdown in Socks5Server
64a88c8c1e Merge bitcoin/bitcoin#35096: kernel: align height parameters to int32_t in btck API
0c0f75eaaf Merge bitcoin/bitcoin#35091: doc: archive release notes for v31.0
5c50a03309 Merge bitcoin/bitcoin#35006: cli, rpc: add -rpcid option for custom request IDs
b6d1b65062 Merge bitcoin/bitcoin#34908: rpc, refactor: gettxoutsetinfo race condition fix follow-ups
af0ee28eb6 refactor: use _MiB consistently for Mebibyte conversions
b3edd30aa2 util: add _GiB for Gibibyte conversions
7c75244ade Change pindexMostWork parameter of ActivateBestChainStep() to reference
c5eb283bca Change CChain::FindFork() to take ref
20b58e281a Change CChain::Next() to take reference
fe2d6e25e0 Change CChain::Contains() to take reference
db56bcd692 test: Add CChain::FindFork() tests
8333abdd91 test: Add CChain basic tests
3bf3b6d59a net: log SOCKS5 auth before sending
b2debc9276 net: cleanup SOCKS5 auth logging
ad0545ba96 Merge bitcoin/bitcoin#35024: ci: Mitigate network issues in native Windows job
a51ec89e0c Merge bitcoin/bitcoin#35099: ci: drop `-lstdc++` from msan fuzz job
963ea38c0c Merge bitcoin/bitcoin#35038: bench: add script verification benchmark for P2TR script-path spends
0bdf21022c Merge bitcoin/bitcoin#35089: test: Allow to set height in create_block
ac9ce25b5f Merge bitcoin/bitcoin#34425: test: Fix all races after a socket is closed gracefully
2f9aa400d9 Merge bitcoin/bitcoin#33032: wallet, test: Replace MockableDatabase with in-memory SQLiteDatabase
378e17f703 Merge bitcoin/bitcoin#33477: Rollback for dumptxoutset without invalidating blocks
654556e631 Merge bitcoin/bitcoin#35086: test: interface_http follow-ups
9fe5896a44 tor: torcontrol disconnect on too many lines to avoid OOM
8b68287bf9 test: Make torcontrol max line length test stricter and test boundaries.
c5ec2d5313 logging: replace FormatLogStrInPlace with Format
3b92ec2036 logging: replace BufferedLog with log::Entry
07b9b13b45 doc: add integer type conventions in btck api remarks
f49a2afd94 test: interface_http follow-ups
ba6287a449 kernel: align height parameters to int32_t in btck API
df44afdc98 kernel: expose btck_block_tree_entry_get_ancestor
8115001cd4 logging: pass log::Entry through to logging functions
b414913c73 util: add timestamp and thread_name to log::Entry
8a55b17751 util: make SourceLocation constructor explicit
b02d6b0567 ci: drop -lstdc++ usage in msan fuzz job
655a39ee14 ci: use llvm 22.1.3
1fa34f90a2 Merge bitcoin/bitcoin#35095: doc: fix typos and minor formatting issues
bdc8e496da doc: fix typos and formatting in CONTRIBUTING, i2p, bitcoin-conf, files
ab5889796f refactor: torcontrol add connection checks to restart_with_mock
e7d647388c Merge bitcoin/bitcoin#34923: depends: remove workaround for Make older than 4.2.90
c4361e53cd Merge bitcoin/bitcoin#34757: guix: re-enable riscv exported symbol checking
fa16bc53d7 test: Require named arg for create_block ntime arg
fab352053d test: Remove unused create_coinbase imports
fad6deb3cb scripted-diff: Use new create_block height option
fa5eb74b96 test: Allow to set height in create_block
c54f37c1ba cli, rpc: add -rpcid option for custom request IDs
4d040b7d62 doc: archive release notes for v31.0
44ac0c32b9 Merge bitcoin/bitcoin#34401: kernel: add serialization method for btck_BlockHeader API
53f4743c21 Merge bitcoin/bitcoin#35080: test: Add missing self.options.timeout_factor scale in tool_bitcoin_chainstate.py
edcf84c73a Merge bitcoin/bitcoin#35077: kernel: build: remove unused serfloat dependency
fa02eb87df test: Add missing self.options.timeout_factor scale in tool_bitcoin_chainstate.py
49895b9cbd kernel: build: remove unused serfloat dependency
577a3e74c8 test: Add check for return type in `HasToBytes` concept
1ad551281a kernel: Add Block Header serialization method
86662623ec Add `SpanWriter` class for zero-allocation stream writing
fbffe8a64a bench: improve `VerifyNestedIfScript` benchmark precision (make stack clearing untimed)
616ee6fe74 bench: add script verification benchmark for P2TR script-path spends
7844a2f083 Merge bitcoin/bitcoin#34772: test: modernize interface_http and cover more libevent behavior
6ac49373aa test: Add clean shutdown to Socks5Server
976985eccd Merge bitcoin/bitcoin#34124: validation: make `CCoinsView` a pure virtual interface
09c0e37789 ci: Rename vcpkg binary cache entity to force rebuild
fa1015bbcb refactor: Use NodeClock::time_point for m_connected
7aa033d3d4 Merge bitcoin/bitcoin#34773: test: migrate functional test equality asserts to `assert_equal`
34c3279d25 Merge bitcoin/bitcoin#34623: Update secp256k1 subtree to latest master
7e3e22e1f7 Merge bitcoin/bitcoin#35047: doc: fix typo 'parlor' to 'parlance' in developer-notes
ea893cff07 doc: fix typo 'parlor' to 'parlance' in developer-notes
58dccd27e1 Merge bitcoin/bitcoin#34858: test: Use NodeClockContext in more tests
fe3d2be1d6 Merge bitcoin/bitcoin#32757: net: Fix Discover() not running when using -bind=0.0.0.0:port
7015f70920 Merge bitcoin/bitcoin#34886: test: Rework Single Random Draw coin selection tests
7c6f1ab654 Merge bitcoin/bitcoin#35032: net_processing: don't modify addrman for private broadcast connections
94f1d35145 Merge bitcoin/bitcoin#34922: test: Use BasicTestingSetup when sufficient
dc93091083 ci: Cache `vcpkg/downloads` folder in native Windows CI job
88bbf2ad33 ci, refactor: Reuse primary key in `actions/cache/save`
141fbe4d53 Merge bitcoin/bitcoin#34884: validation: remove unused code in FindMostWorkChain
1ed1a12402 net_processing: don't modify addrman for private broadcast connections
2b541eeb36 Merge bitcoin/bitcoin#34495: Replace boost signals with minimal compatible implementation
f8ab0b778c Merge bitcoin/bitcoin#34905: Update string and net utils for future HTTP operations
b7f9178976 Update secp256k1 subtree to latest master
dfd54c959e Squashed 'src/secp256k1/' changes from 57315a6985..7262adb4b4
ab304b0ef2 Merge bitcoin/bitcoin#35031: ci: Match `VCPKG_HOST_TRIPLET` to `VCPKG_TARGET_TRIPLET`
80572c7555 Merge bitcoin/bitcoin#34158: torcontrol: Remove libevent usage
8783cc8056 refactor: inline `CCoinsViewBacked` implementation
86296f276d coins: make `CCoinsView` methods pure virtual
b637566c8d coins: add explicit `CoinsViewEmpty` noop backend
90c635c01c fuzz: keep backend assertions aligned to active backend
a9f92e3497 refactor: normalize CCoinsView whitespace and signatures
38a99f3344 scripted-diff: normalize `CCoinsView` naming
06172ef0d5 refactor: rename `hashBlock` to `m_block_hash` to avoid shadowing
0e712b3812 Make DynSock accepted sockets queue optional, with precise lifetime
3de02abf3f util/test: Add string_view constructor to LineReader and remove StringToBuffer
b0ca400612 string: replace AsciiCaseInsensitiveKeyEqual with CaseInsensitiveEqual
8172099293 util: get number of bytes consumed from buffer by LineReader
ba01b00d45 refactor: use for loops in FindMostWorkChain
aa0eef735b test: add InvalidateBlock/ReconsiderBlock asymmetry test
1b0b3e2c2c validation: remove redundant marking in FindMostWorkChain
c74c6cfd84 ci: Match `VCPKG_HOST_TRIPLET` to `VCPKG_TARGET_TRIPLET`
d2844c6a4f Merge bitcoin/bitcoin#35014: test: remove macOS REDUCE_EXPORTS exception workaround
858a0a9c96 test: Add SRD maximum weight tests
fe9f53bf0b test: Add SRD success tests
2840f041c5 test: Rework SRD insufficient balance test
64ab97466f Test: Add new minimum to tested feerates
65900f8dc6 test: Init coin selection params with feerate
82235bbf2b Merge bitcoin/bitcoin#34988: rpc: fix initialization-order-fiasco by lazy-init of decodepsbt_inputs
b555a0b789 test: remove macOS REDUCE_EXPORTS exception workaround
1d7edee34c Merge bitcoin/bitcoin#34977: Update libmultiprocess subtree to fix test timeout
2af003ae37 test: Use BasicTestingSetup when TestingSetup is not necessary
9ee77701dd refactor(test): Only specify TestChain100Setup in test cases
d868667fdc Merge bitcoin/bitcoin#34985: fuzz: remove GetDescriptorChecksum from string harness
66b4e30ec8 Merge commit '7a6d210989af56a03d7efa79f1f3a90047bb88fe' into 2026/04/libmultiprocess-subtree
7a6d210989 Squashed 'src/ipc/libmultiprocess/' changes from 70f632bda8..3edbe8f67c
422ca211ec test: ensure HTTP server enforces limits on headers and body size
485ebad1ee Merge bitcoin/bitcoin#33385: contrib: Add bash completion for new bitcoin command
3fd68a95e6 scripted-diff: replace remaining Python test equality asserts
301b1d7b1f test: add missing `assert_equal` imports
06a4176c42 test: convert truthy asserts in `wallet_miniscript` and `rpc_psbt`
d9a3cf20a4 test: convert simple equality asserts in excluded files
23c06d4e6d test: convert equality asserts with comments or special chars
dcd90fbe54 test: prep manual equality assert conversions
4f4516e3f6 test: split equality asserts joined by `and`
76a5570b36 test: use `in` for two-value equality asserts
996e4f7edd Merge bitcoin/bitcoin#35001: validation: Remove stale `BlockManager` param from `ContextualCheckBlockHeader`
b730dc3301 Merge bitcoin/bitcoin#34208: bench: add fluent API for untimed `setup` steps in nanobench
0c1a07e890 test: ensure HTTP server timeout is not caused by a delayed response
f06de5c1ea test: clean up and modernize interface_http
74e7518088 Merge bitcoin/bitcoin#34989: doc: remove stale shortid collision TODO
8edb13dbdd Merge bitcoin/bitcoin#34967: doc: Discourage trailing doxygen comments, and fix the broken ones
19e99be011 guix: remove riscv exclusion from symbol check
47b7a9f666 guix: binutils 2.46.0
851152e42a validation: Remove stale BlockManager param in ContextualCheckBlockHeader
a7c30da1f6 Merge bitcoin/bitcoin#34873: net: fix premature stale flagging of unpicked private broadcast txs
1401011f71 test: Add test for exceeding max line length in torcontrol
84c1f32071 test: Add torcontrol coverage for PoW defense enablement
7dff9ec298 test: Add test for partial message handling in torcontrol
569383356e test: Add simple functional test for torcontrol
4117b92e67 fuzz: Improve torcontrol fuzz test
b1869e9a2d torcontrol: Move tor controller into node context
eae193e750 torcontrol: Remove libevent usage
242b0ebb5c btcsignals: use a single shared_ptr for liveness and callback
b12f43a0a8 signals: remove boost::signals2 from depends and vcpkg
a4b1607983 signals: remove boost::signals2 mentions in linters and docs
375397ebd9 signals: remove boost includes where possible
091736a153 signals: re-add forward-declares to interface headers
9958f4fe49 Revert "signals: Temporarily add boost headers to bitcoind and bitcoin-node builds"
34eabd77a2 signals: remove boost compatibility guards
e60a0b9a22 signals: Add a simplified boost-compatible implementation
63c68e2a3f signals: add signals tests
d517fa0a94 rpc: fix initialization-order-fiasco by lazy-init of decodepsbt_inputs
f1e14dfbe9 depends: remove workaround for Make older than 4.2.90
fa1f4feac4 Merge bitcoin/bitcoin#34965: cli: Return more helpful authentication errors
4b98962731 Merge bitcoin/bitcoin#34448: ci, iwyu: Fix warnings in `src/util` and treat them as errors
59199fa5ea Merge bitcoin/bitcoin#33908: kernel: add context‑free block validation API (`btck_check_block_context_free`) with POW/Merkle flags
fc736013a5 rpc: Add in_memory option to dumptxoutset with rollback
d0fd718948 test: Extend named pipe sqlite tool test to use rollback
ab9463efac test: Add dumptxoutset fork test
49d5e835a8 rpc: Don't invalidate blocks in dumptxoutset
fe58eb9850 blockstorage: Add DeletePruneLock
037ea2c714 walletdb: Remove m_mock from SQLiteDatabase
59484e2fdb wallet: Make Mockable{Database,Batch} subclasses of SQLite classes
b69f989dc5 wallet, bench: Use TestingSetup in CoinSelection benchmark
e7d67c9fd9 test: Make duplicating MockableDatabases use cursor and batch
964eafb71c bench, wallet: Make WalletMigration's setup WalletBatch scoped
facaeb9c76 doc: Discourage trailing doxygen comments, and fix the broken ones
8cc690ea9b Merge bitcoin/bitcoin#34379: wallet: fix `gethdkeys` RPC for descriptors with partial xprvs
194f57109d Merge bitcoin/bitcoin#34976: lint: Clarify rmtree/remove_all error message with preferred alternatives
fc9987dfc6 doc: remove stale shortid collision TODO
1189702d2f Merge bitcoin/bitcoin#34982: kernel: Remove NONNULL annotation from destroy method
52c3381fa8 Merge bitcoin/bitcoin#33506: test: sock: Enable all socket tests on Windows
24609389a4 Merge bitcoin/bitcoin#34986: docs: remove duplicate ///@} from bitcoinkernel.h
7abf6f6fb6 docs: remove duplicate ///@} from bitcoinkernel.h
91cd0e3aaa fuzz: remove GetDescriptorChecksum from string harness
75608547b4 kernel: Remove NONNULL annotation from destroy method
fa955af618 lint: Clarify rmtree/remove_all error message with preferred alternatives
8e789322c5 Merge bitcoin/bitcoin#34944: guix: Clean up module list in manifest
8b461c530e Merge bitcoin/bitcoin#34956: depends, qt: Fix build on aarch64 macOS 26.4
aeb667f6b7 Merge bitcoin/bitcoin#33343: help: enrich help text for `-loadblock`
0831173c01 Merge bitcoin/bitcoin#34640: wallet: rpc: Improve error message for low feerates.
d0ed369b3b Merge bitcoin/bitcoin#34049: rpc: Disallow captures in RPCMethodImpl
5deed3deab Merge bitcoin/bitcoin#34958: test: mining: add coverage for GBT's "coinbasevalue" result field
54fa356365 Merge bitcoin/bitcoin#34957: policy: remove incorrect `MANDATORY_SCRIPT_VERIFY_FLAGS` comment
4757b71aa7 Merge bitcoin/bitcoin#34938: refactor: Return std::optional over bool+mut&
257769a7ce qa: Improve error message
20a94c1524 cli: Clearer error messages on authentication failure
84c3f8d325 refactor(rpc): GenerateAuthCookieResult -> AuthCookieResult
fa244b984c refactor: Use NodeClock::time_point for m_last_send/recv and m_ping_start
fa2605b204 refactor: Use NodeClock::time_point for CNetMessage::m_time
c97ac44c34 Merge bitcoin/bitcoin#32297: bitcoin-cli: Add -ipcconnect option
a846a7c805 Merge bitcoin/bitcoin#34811: doc: update cjdns.md for current cjdns installation and peering
12c3c3f81d test: mining: add coverage for GBT's "coinbasevalue" result field
8b49e2dd4e ci, iwyu: Fix warnings in `src/util` and treat them as errors
6953363be8 refactor: Move license info into new module
eb750d277b iwyu: Remove workaround for issue that has been fixed upstream
5fa6898818 policy: remove incorrect MANDATORY_SCRIPT_VERIFY_FLAGS comment
3aeccb7d73 depends, qt: Fix build on aarch64 macOS 26.4
f6e6fad0d9 Merge bitcoin/bitcoin#34867: wallet: document importdescriptors error object fields
0e2122c62e Merge bitcoin/bitcoin#32875: index: handle case where pindex_prev equals chain tip in NextSyncBlock()
550f603025 Merge bitcoin/bitcoin#34382: test: wallet: Check fallbackfee default argument behavior.
b0f68f0a3a Merge bitcoin/bitcoin#34804: Update libmultiprocess subtree to fix race conditions on disconnects
325f743eed guix: Clean up module list in manifest
fabab69e9e refactor: Return std::optional from ParseDouble
fa0a09441d refactor: Return std::optional from GetWalletNameFromJSONRPCRequest
fafb0c4cbe refactor: Return std::optional from GetLogCategory
826819a510 Merge bitcoin/bitcoin#34939: fuzz: Use CAmount for storing best_waste
2b6af628b1 Merge bitcoin/bitcoin#34491: ci: add FreeBSD Clang cross job
e602ad62d0 Merge bitcoin/bitcoin#34919: test: script: boundary at exactly 65535 bytes must use OP_PUSHDATA2
954374d405 Merge bitcoin/bitcoin#34926: test: Replace DEBUG_LOG_OUT with -printtoconsole=1
890a09b1e4 fuzz: Use CAmount for storing best_waste
fae807ed25 test: Remove unused, confusing and brittle connect_nodes.wait_for_connect
fab2772647 test: Fix all races after a socket is closed gracefully
fa21edddb2 test: Stricter checks in rpc_setban.py
faa404e119 test: Add is_connected_to helper
613a548648 Merge commit '2478a15ef966cc93d47dd0f461a44be39bc51534' into pr/subtree-9
2478a15ef9 Squashed 'src/ipc/libmultiprocess/' changes from 1868a84451f..70f632bda8f
fa644e625b refactor: Use NodeClock::duration for m_last_ping_time/m_min_ping_time/m_ping_wait
333316f6be doc: Fix typo "eviction criterium" -> "eviction criterion"
fa54fb0129 refactor: gui: Accept up to nanoseconds in formatDurationStr, but clarify they are ignored
fab88884b7 refactor: Avoid manual chrono casts with * or /
facfce37f6 util: Add NodeClock::epoch alias
fa41e072b3 refactor: Use NodeClock alias over deprecated GetTime
4f8bd396f8 Merge bitcoin/bitcoin#34913: fuzz: Use time helpers in node_eviction
21da421b42 Merge bitcoin/bitcoin#34439: qa: Drop recursive deletes from test code, add lint checks.
8a8edc8d88 Merge bitcoin/bitcoin#34741: refactor: Return std::optional from GetNameProxy/GetProxy
a5609fc249 Merge bitcoin/bitcoin#34458: net: Don't log own ips during discover
261d229455 test: Replace DEBUG_LOG_OUT with -printtoconsole=1
3dcdb2b9ba test: wallet: Warning for excessive fallback fee.
6664e41e56 test: wallet: -fallbackfee default is 0
d28c989243 test: wallet: refactor: fallbackfee extract common send failure checks.
99f99c989e Merge bitcoin/bitcoin#34918: fuzz: [refactor] Remove unused g_setup pointers
fde37778ba Merge bitcoin/bitcoin#34915: doc: archive release notes for v28.4
6d54365c3e Merge bitcoin/bitcoin#34920: wallet: drop stale TODOs
fa1ebde1ad fuzz: Use time helpers in node_eviction
325afe664d net: delay stale evaluation and expose time_added in private broadcast
1438165b1f wallet: drop stale TODOs
fabbfec3b0 fuzz: Remove unused g_setup pointers
f899674639 test: script: boundary at exactly 65535 bytes must use OP_PUSHDATA2
5a81d73a81 scripted-diff: rpc: Don't pointlessly capture in RPCMethod lambdas
4e789299af scripted-diff: rpc: Rename RPCHelpMan to RPCMethod
3e089038aa doc: archive release notes for v28.4
2fe76ed832 Merge bitcoin/bitcoin#34896: ci: Upgrade IWYU to 0.26 compatible with Clang 22
c61c504f27 Merge bitcoin/bitcoin#34883: ci: vcpkg-specific cleanups
0d1301b47a test: functional: drop rmtree usage and add lint check
8bfb422de8 test: functional: drop unused --keepcache argument
a7e4a59d6d qa: Remove all instances of `remove_all` except test cleanup
38886a6710 Merge bitcoin/bitcoin#34786: validation: do not add the snapshot to candidates set of the background chainstate
6b99a3e4f0 doc: update cjdns.md for current upstream changes
0587c56091 kernel: Expose context-free block validation
bfc84eb2ea Merge bitcoin/bitcoin#33259: rpc, logging: add backgroundvalidation to getblockchaininfo
1ef7166029 Merge bitcoin/bitcoin#34891: doc: Note that generateblock does not collect transaction fees
4ecf473c36 Merge bitcoin/bitcoin#34727: test: Add IPC wake-up test and reuse mining context
3129d4a693 ci: Rename `TIDY_LLVM_V` to `IWYU_LLVM_V` in IWYU-specific code
71f827c3c2 kernel: Expose consensus parameters (`btck_ConsensusParams`)
999d18ab1c net: introduce TxSendStatus internal state container
667e081a2a Merge bitcoin/bitcoin#34598: bench: use larger payload in HexStrBench
25f69d970a release note
af629821cf test: add background validation test for getblockchaininfo
a3d6f32a39 rpc, log: add backgroundvalidation to getblockchaininfo
5b2e4c4a88 log: update progress calculations for background validation
3e5dc61035 rpc, refactor: gettxoutsetinfo race condition fix follow-ups
400aa68b4a Merge bitcoin/bitcoin#34809: threadsafety: Add STDLOCK() macro for StdMutex
fa73ed467c refactor: Fix redundant conversion to std::string and then to std::string_view [performance-string-view-conversions]
16613c9de9 Merge bitcoin/bitcoin#34857: test: Remove confusing assert_debug_log in wallet_reindex.py
65379bb8d0 ci: add FreeBSD cross CI job
f44191f163 depends: build qrencode for Freebsd
7f7018738e depends: FreeBSD cross with Clang
6464f14081 depends: disable inotify in Freebsd Qt build
fbabe86190 Merge bitcoin/bitcoin#34870: wallet: feebumper, fix crash when combined bump fee is unavailable
696b5457c5 Merge bitcoin/bitcoin#34667: test: ensure FastWalletRescanFilter is correctly updated during scanning
9a03ba1e3a Merge bitcoin/bitcoin#34888: wallet: fix amount computed as boolean in coin selection
8444efbd4a refactor: Get rid of unnecessary newlines in logs
6bcb60354e refactor: Modernize member variable names in torcontrol
a36591d194 refactor: Use constexpr in torcontrol where possible
1a1f584360 Merge bitcoin/bitcoin#29963: depends: Do not consider `CC` environment variable for detecting system
28b93af19d Merge bitcoin/bitcoin#33414: tor: enable PoW defenses for automatically created hidden services
8d2f06853a sync: Use StdMutex for thread safety annotations
cbc231ed8e scripted-diff: logging: Switch from StdLockGuard to STDLOCK
f808786f48 logging: Add missing thread safety annotations
e196cf26e0 util/stdmutex.h: Add STDLOCK() and improve annotation checking for StdMutex
a703c70bb8 Merge bitcoin/bitcoin#34589: ci: Temporarily use clang in valgrind tasks
cdaf2f20ae Merge bitcoin/bitcoin#34850: depends: Remove no longer necessary `dsymutil`
3d1b7d0f6a Merge bitcoin/bitcoin#34639: iwyu: Document or remove some `pragma: export` and other improvements
559df68240 Merge bitcoin/bitcoin#34878: depends: Fix cross-compiling on macOS for Windows
999c42484f Merge bitcoin-core/gui#815: Bugfix on TransactionsView - Disable if privacy mode is set during wallet selection
0b489886f8 ci: Upgrade IWYU to 0.26 compatible with Clang 22
0026b330c4 wallet: fix amount computed as boolean in coin selection
3136559923 doc: Note that generateblock does not collect transaction fees
483769c046 Merge bitcoin/bitcoin#26201: Remove Taproot BIP 9 deployment
2d5cedfe12 ci: Switch to VS-vendored vcpkg instance
ad75b147b5 test: scale IPC mining wait timeouts by timeout_factor
e7a918b69a test: verify IPC error handling for invalid coinbase
63684d6922 test: move make_mining_ctx to ipc_util.py
4ada575d6c test: verify createNewBlock wakes promptly when tip advances
0fe6fccec2 doc: Document rationale for using `IWYU pragma: export`
cfa3b10d50 iwyu, doc: Document `IWYU pragma: export` for `<logging/categories.h>`
015bea05e6 iwyu, doc: Document `IWYU pragma: export` for `<chrono>`
48bfcfedec iwyu, doc: Document `IWYU pragma: export` for `<threadsafety.h>`
179abb387f refactor: Move `StdMutex` to its own header
9aa5b3c3a3 ci: Switch to `x64-windows-release` triplet
65882fa68f ci: Remove upstreamed vcpkg workaround
19c9474742 Merge bitcoin/bitcoin#34791: test: Suppress another unsolicited `mock_process/*` output
7a9304f887 depends: Fix cross-compiling on macOS for Windows
faad08e59c test: Use NodeClockContext in more tests
fa8fe0941e fuzz: Use NodeClockContext
6e295d8ad5 Merge bitcoin/bitcoin#34059: refactor: Use NodeClock::time_point for m_addr_token_timestamp
fa9f434df8 test: Allow time_point in boost checks
faaea7895f refactor: Use current_time over redundant call to Now()
3333c5023f refactor: Use NodeClock::time_point for m_addr_token_timestamp
f80bf5128d Merge bitcoin/bitcoin#34869: tests: applied PYTHON_GIL to the env for every test
b425a81f07 Merge bitcoin/bitcoin#34868: scripted-diff: Rename `WAIT_TIMEOUT` to `TEST_WAIT_TIMEOUT`
d14293c3a9 Merge bitcoin/bitcoin#34859: ci: Retry on intermittent Windows generate download failures
d58e0ad0a4 Merge bitcoin/bitcoin#33215: Fix compatibility with `-debuglogfile` command-line option
93e8bcc077 Merge bitcoin/bitcoin#32442: doc: guix: Troubleshooting zdiff3 issue and uninstalling.
14053d8520 Merge bitcoin/bitcoin#34550: guix: update time-machine to c5eee3336cc1d10a3cc1c97fde2809c3451624d3
bc1c540920 Merge bitcoin/bitcoin#29060: Policy: Report debug message why inputs are non standard
3ca3e519b6 Merge bitcoin/bitcoin#34684: refactor: Enable -Wswitch in exhaustive switch'es, Enable -Wcovered-switch-default
b14f2c76a1 tests: applied PYTHON_GIL to the env for every test
6d2952c3c3 serialize: Add missing `<span>` header
6072a2a6a1 wallet: feebumper, fix crash when combined bump fee is unavailable
c53021b0ec Merge bitcoin/bitcoin#34499: miniscript: Use valid script in test, etc (#31713 follow-ups)
3c9e421942 Merge bitcoin/bitcoin#34846: kernel: Add API getter functions for timelock fields (`nLockTime`, `nSequence`)
658e68f95b scripted-diff: Rename `WAIT_TIMEOUT` to `TEST_WAIT_TIMEOUT`
445143bfc6 wallet: document structured importdescriptors errors
c0d3d493a9 Merge bitcoin/bitcoin#34704: validation: Explicitly move blocks to validation signals
7e18e2b16f Merge bitcoin/bitcoin#32624: fuzz: wallet: add target for `MigrateToDescriptor`
3a4a863d19 Merge bitcoin/bitcoin#34823: threading: never require logging from sync.h (take 2)
4169e72d9e Merge bitcoin/bitcoin#34451: rpc: fix race condition in gettxoutsetinfo
fa71c6e84c ci: Avoid intermittent Windows generate download failures
fa30951af5 test: Remove confusing assert_debug_log in wallet_reindex.py
a7514c1aa9 Merge bitcoin/bitcoin#34848: cmake: Migrate away from deprecated SQLite3 target
81bf3ebff7 Merge bitcoin/bitcoin#34852: test: Fix intermittent issue in feature_assumeutxo.py
d81b562fca Merge bitcoin/bitcoin#34799: rpc: Run type check on decodepsbt result
33eaf910bd Merge bitcoin/bitcoin#34820: test: Use asyncio.SelectorEventLoop() over deprecated asyncio.WindowsSelectorEventLoopPolicy(), move loop creation
faf71d6cb4 test: [refactor] Use verbosity=0 named arg
99996f6c06 test: Fix intermittent issue in feature_assumeutxo.py
5cf6ea24d3 Merge bitcoin/bitcoin#34479: fuzz: Add and use NodeClockContext
578525d31d depends: Remove no longer necessary `dsymutil`
ca85b8c22d Merge bitcoin/bitcoin#34742: fuzz: set whitelist permissions on connman target
d6f680b427 validation: Move block into BlockDisconnected signal
4d02d2b316 validation: Move block into BlockConnected signal
8b0fb64c02 validation: Move validation signal events to task runner
498b6eb6b5 cmake: Migrate away from deprecated SQLite3 target
fa70b9ebaa ci: Temporarily use clang in valgrind tasks
faf3ef4ee7 ci: Clarify why valgrind task has gui disabled
9f28120a5b kernel: Add API function for getting a tx input's nSequence
6b64b181d5 kernel: Add API function for getting a tx's nLockTime
04480c2558 Merge bitcoin/bitcoin#34830: fuzz: set fSuccessfullyConnected in connman harness
3293e9a61f guix: document when GCC SSA gen patch can be removed
978023fd9e guix: use latest glibc 2.31
ab9a98b1e4 guix: combine gcc-libgcc-patches with base-gcc
2276426bb1 guix: switch to upstream python-oscrypto package
feea2a850e ci: use LIEF 0.17.5 in lint job
a7524f57ba guix: switch to upstream python-lief package
2bf97e813d guix: switch to upstream osslsigncode package
dc0ddab389 guix: drop CMake workaround
31eb46f054 guix: update to c5eee3336cc1d10a3cc1c97fde2809c3451624d3
0f323e1075 guix: add --no-same-owner to TAR_OPTIONS
dc104cc333 Merge bitcoin/bitcoin#34832: lint: detect arch for mlc binary
db3c25cfae index: add explicit early exit in NextSyncBlock() when the input is the chain tip
551875360c ci: Use arch-appropriate binaries in lint install
52e8c1ce32 Merge bitcoin/bitcoin#34825: depends: capnp 1.4.0
8d55154655 Merge bitcoin/bitcoin#34602: test: addrman: successive failures in the last week for IsTerrible
bac8046fce Merge bitcoin/bitcoin#34831: lint: remove excluded files from whitespace check
79467e3ec7 threading: never require logging from sync.h
f55c891a65 lint: more reuse of SHARED_EXCLUDED_SUBTREES
8864917d8b lint: add missing ipc/test to grep_boost_fixture_test_suite
ecefc12927 lint: fix lint issue in lint script
ee8c22eb6a contrib: fix whitespace issues in scripts
fa55723b8f move-only: Extract ProcessAddrs() helper
92287ae753 test/wallet: ensure FastWalletRescanFilter is updated during scanning
04e2118372 lint: remove excluded .cpp/.h files from whitespace check
685a44c601 fuzz: set fSuccessfullyConnected in connman harness
fadf901fd4 rpc: Run type check on decodepsbt result
ff7cdf633e Merge bitcoin/bitcoin#34816: test: Remove vulture from ci, Remove some --min-confidence=60 unused code
bde35d61f9 depends: capnp 1.4.0
92a3d30f38 Merge bitcoin/bitcoin#34418: qa: Make wallet_multiwallet.py Windows crossbuild-compatible
abaadc3d5b Merge bitcoin/bitcoin#31774: crypto: Use secure_allocator for `AES256_ctx`
16a02bf5af Merge bitcoin/bitcoin#33451: doc: Add `INSTALL.md` to Linux release tarballs
fa050da980 test: Move event loop creation to network thread
a1f22a0a6b test: Suppress another unsolicited `mock_process/*` output
fa9168ffcd test: Use asyncio.SelectorEventLoop() over deprecated asyncio.WindowsSelectorEventLoopPolicy()
390e7d61bd Merge bitcoin/bitcoin#34787: build: fix native macOS deployment
5440280891 Merge bitcoin/bitcoin#34745: refactor: replace `ArgsManager::cs_args RecursiveMutex` with `Mutex`
fa4ec13b44 build: Enable -Wcovered-switch-default
fa2670bd4b refactor: Enable -Wswitch in exhaustive switch
5f75d90c38 Merge bitcoin/bitcoin#34813: threads: qa: Add lock order annotation for `TxMempool::cs`
f1e0245f89 Merge bitcoin/bitcoin#34818: doc: fix process name typo in multiprocess.md
c2732146d1 doc: fix process name typo in multiprocess.md
faea12ecd9 test: Fixup docs for NodeClockContext and SteadyClockContext
5608b8ce9e Merge bitcoin/bitcoin#34750: test: fix addr relay test silently passing and other improvements
fa90b21430 test: Remove unused feature_segwit.py functions
fa6b05c96f test: Remove unused CUSTOM_._COUNT
fa7bac94d8 test: Remove unused wait_for_addr, firstAddrnServices, on_addr
fa388a3585 test: Remove unused self.p2p_conn_index = 1
fa803710e2 test: Remove unused AddressType
e31ab8040f Merge bitcoin/bitcoin#34749: rpc: Refactor gettxspendingprevout to be easier to parse
fab5072ce1 ci: Remove vulture
56983a4d4d Merge bitcoin/bitcoin#34815: ci: bump cirruslabs actions versions
136132e075 Merge bitcoin/bitcoin#34776: guix: Make guix-clean more careful
d236415649 rpc: Refactor gettxspendingprevout to be easier to parse
e19df67332 Merge bitcoin/bitcoin#33144: build: Set AUTHOR_WARNING on warnings
ab64277375 Merge bitcoin/bitcoin#34708: validation: refactor: remove ConnectTrace
44ddc9c93f Merge bitcoin/bitcoin#31560: rpc: allow writing UTXO set to a named pipe
1a2f4e9750 Merge bitcoin/bitcoin#34814: lint: Temporarily revert to vulture==2.14
9a968ad35e ci: bump cirruslabs actions versions
51a4dc5515 Merge bitcoin/bitcoin#34796: rpc, net: remove `startingheight` field of `getpeerinfo` RPC and from node state
2efb8c44bb Merge bitcoin/bitcoin#34807: kernel: doc: explain return value for `btck_WriteBytes` callback
faae981d35 lint: Temporarily revert to vulture==2.14
9085dee476 qa: Add lock order annotation for TxMempool::cs
32325d1777 tests: Add test for mempool-invalid wallet tx
25e063d950 wallet: Add separate balance info for non-mempool wallet txs
ec4ec91d59 kernel: doc: explain return value for `btck_WriteBytes` callback
b19caeea09 doc: add release note for #31560 (named pipe support for `dumptxoutset` RPC)
e98d36715e Merge bitcoin/bitcoin#34802: ci: Bump GHA actions versions
61a5460d0d test: add test for utxo-to-sqlite conversion using named pipe
2e8072edbe rpc: support writing UTXO set dump (`dumptxoutset`) to a named pipe
745ad941de p2p: remove m_starting_height field from node state (only show once in debug log)
b267efcdaf rpc, net: completely remove `startingheight` field of `getpeerinfo` RPC
fadaa7db33 ci: Bump GHA actions versions
ce6f182091 Merge bitcoin/bitcoin#33902: doc: Document compiler configuration for native depends packages
e96d9e6492 Merge bitcoin/bitcoin#34389: net/log: standardize peer+addr log formatting via `LogPeer`
281c0cce73 Merge bitcoin/bitcoin#34301: wallet: remove outdated `RewriteDB` calls from SPKM & `DBErrors::NEED_REWRITE` enum value
524aa1e533 Merge bitcoin/bitcoin#34576: threadpool: add ranged Submit overload
4c07cf87e2 doc: document depends compiler configuration
f25843d8ad Merge bitcoin/bitcoin#34441: ci: Allow running iwyu CI in worktree
fa4d5891b9 refactor: Introduce TxDocOptions
b8c84ec5a6 Merge bitcoin/bitcoin#34788: fuzz: register PeerManager in process_message(s)
fa8250e961 refactor: Add and use RPCResultOptions
d03e3be246 ci: check macos bundle structure and codesigning
66d80d57b4 macdeploy: use plugins dir to find plugins
ab137cbfe2 macdeploy: subprocess out to zip rather than shutil.make_archive
b62abc7eec Merge bitcoin/bitcoin#34436: refactor: add overflow-safe `CeilDiv` helper and use it in unsigned callsites
7c21413616 Merge bitcoin/bitcoin#34755: depends: cleanup meta files
63f27721c2 Merge bitcoin/bitcoin#32985: wallet: Always rewrite tx records during migration
9df4f9d100 Merge bitcoin/bitcoin#34472: bench: add script verification benchmark for P2TR key path spends
3201abe3ea Merge bitcoin/bitcoin#34359: test: add test for rebroadcast of transaction received via p2p
410f2a0d20 Merge bitcoin/bitcoin#33772: prevector: simplify operator==
3dcba2eff0 Merge bitcoin/bitcoin#26988: cli: rework -addrinfo cli to use addresses which aren’t filtered for quality/recency
af0da2fce2 crypto: Use `secure_allocator` for `AES256CBC*::iv`
d53852be31 crypto: Use `secure_allocator` for `AES256_ctx`
8c6fedaa81 build: `lockedpool.cpp` kernel -> crypto
51ac1abf6f bench: Add wallet encryption benchmark
9a15872516 wallet: Make encryption derivation clock mockable
b97abdcdf1 Merge bitcoin/bitcoin#34766: Pre-31.x branching updates
ae5485fa0d refactor: Generalize derivation target calculation
eed3161893 Merge bitcoin/bitcoin#34792: clusterlin: update SFL comments for deterministic order
98fcd7af23 wallet: rpc: Improve error message for low feerates.
f3bf63ec4f kernel: acquire coinstats cursor and block info atomically
5e77072fa6 rpc: fix race condition in gettxoutsetinfo
730308386a Merge bitcoin/bitcoin#34696: Update embedded asmap to 1772726400 for v31
951863d022 Merge bitcoin/bitcoin#34769: doc: update http worker thread names
79571b9181 threadpool: add ranged Submit overload
fa270fdacf refactor: Return std::optional from GetProxy
faeac1a931 refactor: Return std::optional from GetNameProxy
d67c8ed788 clusterlin: update SFL comments for deterministic order
0690a5d0f2 Update embedded asmap to 1772726400
20fb7618b0 args: make most ArgsManager members private
22b40f34f3 args: replace cs_args RecursiveMutex with Mutex
3a16ec8582 test: scope cs_args locks to avoid recursive locking
70b51fef7a args: eliminate all recursive locking of cs_args
7d61e03c70 args: extract lock-requiring internal helpers
f82d076771 Merge bitcoin/bitcoin#34784: ci: use latest versions of lint deps
74f71c5054 Remove Taproot activation height
a9baf19172 Merge bitcoin/bitcoin#34789: doc: update build guides pre v31
48f26e2040 Merge bitcoin/bitcoin#34751: doc: Update asmap-data repository rule for file inclusion
6b20ad84e0 doc: update build guides pre v31
b503768819 fuzz: register PeerManager in process_message(s)
195306c359 Merge bitcoin/bitcoin#34785: ci: remove TODOs from retry
ddf2a064de Fix compatibility with `-debuglogfile` command-line option
c08f0c3c29 ci: remove TODOs from retry
9f3752c437 ci: use latest versions of lint deps
544c15ff4e Merge bitcoin/bitcoin#34759: walletdb: hash pubkey/privkey in one shot to avoid leaking secret data
9aea2905fe Merge bitcoin/bitcoin#34783: depends: link to upstream qt issue
fadb77169b test: Scale feature_dbcrash.py timeout with factor
3a83715c2a depends: link to upstream qt issue
8dcd79949f Merge bitcoin/bitcoin#34718: Release: 31.0 translations update
5f9068bdcd Merge bitcoin/bitcoin#34781: test: Remove fixed TODO in address_to_scriptpubkey
eeeeb2a0b9 fuzz: Use NodeClockContext
fa4fae6227 test: Add NodeClockContext
d21afb297c qt: 31.0 translations update
fa0587a306 test: Remove fixed TODO in address_to_scriptpubkey
46189fd526 doc: update http worker thread names
be6d24ec22 guix: Make guix-clean less destructive
d3056bc149 Merge bitcoin/bitcoin#34606: doc: clarify swapping impact on IBD performance
f201ccc800 Merge bitcoin/bitcoin#34673: contrib: Update fixed seeds pre-31.0
42f97c542d Merge bitcoin/bitcoin#34705: kernel: Use fs:: namespace and unicode path in kernel tests
7691e8a005 Merge bitcoin/bitcoin#34471: refactor: Use aliasing shared_ptr in Sock::Wait
49bd12bd89 Merge bitcoin/bitcoin#34693: doc: Use relative markdown links
aefa8e6d14 Merge bitcoin/bitcoin#34361: test: clean up tx resurrection (re-org) test in feature_block.py
3a222507fd Merge bitcoin/bitcoin#34037: wallet, doc: clarify the coin selection filters that enforce cluster count
69baddc910 validation: do not add the snapshot block to candidates of bg chainstate
501a3dd4ad walletdb: hash pubkey/privkey in one shot to avoid leaking secret data
d198635fa2 Merge bitcoin/bitcoin#34677: kernel: Chainparams and headerssync updates pre-31.0
9833ef5f86 Merge bitcoin/bitcoin#34702: doc: Fix fee field in getblock RPC result
f2f0a0ca4c Merge bitcoin/bitcoin#34700: script: Fix undefined behavior in Clone() -- std::transform writes past end of empty vector
8825051e08 refactor: improve benchmark setup and execution for various tests
83b8528ddb bench: add fluent API for untimed setup steps in `nanobench`
48b952cbb6 build: bump to 31.99
1b3d58f128 docs Remove 31.0 release notes fragments
b7cf2f87d0 docs: Update bips.md
c7a3ea2483 Merge bitcoin/bitcoin#34692: Bump dbcache to 1 GiB
8b70ed6996 Merge bitcoin/bitcoin#34521: validation: fix UB in `LoadChainTip`
0ebc6891e2 depends: delete Boost extra files
168997e9b5 depends: disable Qt sbom generation
f6d3201e14 Merge bitcoin/bitcoin#33929: test: Remove `system_tests/run_command` runtime dependencies
b5737b755d Merge bitcoin/bitcoin#34650: depends: Update Qt to version 6.8.3
c0802e20be Merge bitcoin/bitcoin#34734: test: Fix shutdown vptr race in BlockFilterIndexSync bench
2ac4f6e019 Merge bitcoin/bitcoin#34612: leveldb: remove unused files
d97df29d5d Merge bitcoin/bitcoin#34747: test: Sync mempools and wait for txospender index to be synced in rpc_gettxspendingprevout
c12be53f85 Merge bitcoin/bitcoin#34635: rpc, index: txospenderindex improve formatting, docs and test coverage
8bc62ce173 doc: Update asmap-data repository rule for file inclusion
57bfa864fe test: use static methods and clarify comment in addr_relay
7ee8c0abc6 test: protect outbound connection from eviction in getaddr_test
ecb5ce6e76 test: fix addr relay test silent pass and wrong peerinfo index
15c4889497 index: document TxoSpenderIndex::FindSpender
f8b9595aaa test: Add missing txospenderindex coverage in feature_init
9316d96240 test: sock: Enable socket pair tests on Windows
cbdb891de2 test: Wait for txospender index to be synced in rpc_gettxspendingprevout
2db5c049bb test: Sync mempools after tx creation in rpc_gettxspendingprevout
ca45461ddb Merge bitcoin/bitcoin#33986: doc: improvements to doc/descriptors.md
fc39a4f568 Merge bitcoin/bitcoin#34713: depends: Allow building Qt packages after interruption
39668f1eeb contrib: Add bash completion for new bitcoin command
32debfa1ed fuzz: set whitelist permissions on connman target
a1074d852a index, rpc, test: Misc formatting fixes
7e91060ec7 Merge bitcoin/bitcoin#34733: subprocess: replace __USING_WINDOWS__ with WIN32
69b2c813f0 Merge bitcoin/bitcoin#34591: cmake: Improve `install_name_tool` workaround
2e041b4905 help: enrich help text for `-loadblock`
f2f5619360 Merge bitcoin/bitcoin#34709: wallet, test: improve wallet functional tests
2f8f2e9001 validation: remove ConnectTrace wrapper class
083242aac8 Merge bitcoin/bitcoin#34725: fuzz: assert we accept any PSBT serialization we create
20ae9b98ea Extend functional test for setBlockIndexCandidates UB
4c40a923f0 Merge bitcoin/bitcoin#34728: test: Fix intermittent issue in wallet_assumeutxo.py
854a6d5a9a validation: fix UB in LoadChainTip
fa79098ce2 test: Fix shutdown vptr race in BlockFilterIndexSync bench
9249e6089e validation: remove LoadChainTip call from ActivateSnapshot
d76ec4de14 fuzz: make sure PSBT serialization roundtrips
faa68ed4bd test: Fix intermittent issue in wallet_assumeutxo.py
bff8a7a80d subprocess: replace __USING_WINDOWS__ with WIN32
e09b81638b Merge bitcoin/bitcoin#34219: psbt: validate pubkeys in MuSig2 pubnonce/partial sig deserialization
89386e700e kernel: Use fs:: namespace and unicode path in kernel tests
2678abe902 prevector: simplify `operator==`
01dcb2fcc5 Merge bitcoin/bitcoin#34715: test: avoid interface_ipc.py race and null pointer dereference
dc109e1b34 Merge bitcoin/bitcoin#34706: doc: Improve dependencies.md IPC documentation
0a6724aaae doc: Update Windows build notes
473e5f8efc qt: Add patch to fix SFINAE warnings in QAnyStringView with gcc16
3cb4d6066b qt: add patches to fix SFINAE errors/warnings with gcc16
d7e972a90d qt: add patch to fix build with gcc16
19693a8c91 depends: Update Qt to 6.8.3
c55584575a cmake: Fix `FindQt` module
2eaf701bc0 Merge bitcoin/bitcoin#34679: ci: Download script_assets_test.json for Windows CI
17a04039bc Merge bitcoin/bitcoin#34662: ci: use LLVM/Clang 22 in tidy job
5e35a9069d interpreter: remove clang-tidy suppression
4089682f5c ci: use Clang 22 in tidy task
7ea076f996 tidy: remove deprecated header
eb17f29aa5 tidy: clang-tidy is required
bf9ef4f043 Merge bitcoin/bitcoin#34422: Update libmultiprocess subtree to be more stable with rust IPC client
b83de7f28e validation: remove sentinel block from ConnectTrace
d8f4e7caf0 doc: add release notes
248c175e3d test: ensure `ValidateInputsStandardness` optionally returns debug string
d2716e9e5b policy: update `AreInputsStandard` to return error string
2702711c3a Merge bitcoin/bitcoin#34642: wallet: call SyncWithValidationInterfaceQueue after disconnecting chain notifications
1c1de334e9 test: avoid interface_ipc.py race and null pointer dereference
2a7a4f608a depends: Allow building Qt packages after interruption
6b0a980de9 Merge bitcoin/bitcoin#34410: test: let connections happen in any order in p2p_private_broadcast.py
a61907e5d9 doc: explain swapping in `reduce-memory.md`
5c005363a8 test: improve `wallet_backup` test
04d9515748 test: improve `wallet_assumeutxo` func test
b87a1c27c9 doc: Improve dependencies.md IPC documentation
f580cc7e9f doc: Fix `fee` field in `getblock` RPC result
4ae9a10ada doc: add release notes for dbcache bump
37d49f5de6 doc: mention Miniscript expressions inside reference
771f7642bc doc: fix typo in descriptors.md
708b84999b doc: reference descriptor BIPs in descriptors.md
8f2a869a19 doc: do not list descriptor RPCs or history
65a8b6c2ef doc: mention musig() in descriptors.md
c510d126ef doc: update dbcache default in reduce-memory.md
027cac8527 qt: show GetDefaultDBCache() in settings
5b34f25184 dbcache: bump default from 450MB -> 1024MB if enough memory
44feab23a7 script: Fix undefined behavior in Clone() -- std::transform writes past end of empty vector
4565cff72c bitcoin-gui: Implement missing Init::makeMining method
9cad97f6cd Merge bitcoin/bitcoin#34690: test: Add missing timeout_factor to zmq socket
fbea576c26 test: add interface_ipc_cli.py testing bitcoin-cli -ipcconnect
0448a19b1b ipc: Improve -ipcconnect error checking
8d614bfa47 bitcoin-cli: Add -ipcconnect option
6a54834895 ipc: Expose an RPC interface over the -ipcbind socket
df76891a3b refactor: Add ExecuteHTTPRPC function
3cd1cd3ad3 ipc: Add MakeBasicInit function
5a6dd7c693 Merge bitcoin/bitcoin#34661: ipc mining: Prevent ``Assertion `m_node.chainman' failed`` errors on early startup
779e7825db fuzz: wallet: add target for `MigrateToDescriptor`
98e8af4bb9 wallet: Drain validation interface queue after notifications disconnect
52992ebe1c interfaces: Add waitForNotifications() to call SyncWithValidationInterfaceQueue()
fa9d0623a3 doc: Use relative markdown links
ceff6771b8 Merge bitcoin/bitcoin#34583: ci: [refactor] Drop last use of pwsh
b0833b560a Merge bitcoin/bitcoin#34668: test: Add missing resolve() to valgrind.supp file for test shell
fa48f8c865 test: Add missing timeout_factor to zmq socket
3a8b4e89f6 Merge bitcoin/bitcoin#34687: ci: Set TEST_RUNNER_PORT_MIN in test-each after cirrus runner switch
286de1e7b3 Merge bitcoin/bitcoin#34093: netif: fix compilation warning in QueryDefaultGatewayImpl()
73e3853110 test: add test for rebroadcast of transaction received via p2p
fab51e470e test: Move valgrind.supp to the other sanitizer_suppressions files
fa9cf81d39 test: Add missing resolve() to valgrind.supp file
05cd3b00b9 Merge bitcoin/bitcoin#34597: util: Fix UB in SetStdinEcho when ENOTTY
3c7b0f97e0 Merge bitcoin/bitcoin#34656: doc: clarify confusing `git range-diff` add/delete output
701b8d7148 Merge bitcoin/bitcoin#34609: test: remove appveyor reference in comment
fa18be2f2b test: Fix typo
fac932698f ci: Set TEST_RUNNER_PORT_MIN in test-each after cirrus runner switch
c1361fc42d netif: fix compilation warning in QueryDefaultGatewayImpl()
b6b8f8ac55 Merge bitcoin/bitcoin#34562: ThreadPool follow-ups, proactive shutdown and HasReason dependency cleanup
8834e4e86c test: remove appveyor reference in comment
fa7612f253 ci: Download script_assets_test.json for Windows CI
bb3ac00cf8 Merge bitcoin/bitcoin#34001: test: fix test_limit_enforcement_package
107a204d24 Merge bitcoin/bitcoin#34682: ci: fix vcpkg tools cache key collision between windows matrix jobs
7777a13306 test: Move Fetching-print to download_from_url util
faf96286ce test: move-only download_from_url to stand-alone util file
17a079c2fb ci: fix vcpkg tools cache key collision between windows matrix jobs
408d5b12e8 test: include response body in non-JSON HTTP error msg
9dc653b3b4 test: threadpool, add coverage for all Submit() errors
ce2a984ee3 test: cleanup, use HasReason in threadpool_tests.cpp
d9c6769d03 test: refactor, decouple HasReason from test framework machinery
dbbb780af0 test: move and simplify BOOST_CHECK ostream helpers
3b7cbcafcb test: ensure Stop() thread helps drain the queue
ca101a2315 test: coverage for queued tasks completion after interrupt
bf2c607aaa threadpool: active-wait during shutdown
e88d274430 test: add threadpool Start-Stop race coverage
af99643454 Merge bitcoin/bitcoin#34054: net processing: Add ibd check before processing block for txdownloadman
fa0cc1c5a4 test: [doc] Remove outdated comment
44538f8ada kernel: Add recent assumeutxo snapshot info
58c2e23fca kernel: Update headerssync params
cf261b071f kernel: update chainTxData
8eaf1d26d4 kernel: update defaultAssumeValid and minimumChainWork
5ca0c55517 kernel: update assumed blockchain and chainstate sizes
fec58229fa contrib: Update fixed feeds
27fbdb009f makeseeds: Choose node info with most recent success when deduplicating
982883a1bc makeseeds: Update known user agents
707ad46696 Merge bitcoin/bitcoin#34671: doc: Update Guix install for Debian/Ubuntu
faa70ca764 doc: Update Guix install for Debian/Ubuntu
7c80301439 Merge bitcoin/bitcoin#33616: policy: don't CheckEphemeralSpends on reorg
b7ca3bf061 Squashed 'src/ipc/libmultiprocess/' changes from 1fc65008f7d..1868a84451f
8fe91f3719 test: Updates needed after bitcoin-core/libmultiprocess#240
cb15f5a317 Merge commit 'b7ca3bf061b51108d155283c1ad503c0af7eab0d' into pr/subtree-8
33fbaed310 policy: don't CheckEphemeralSpends on reorg
b9bf24cfe2 Merge bitcoin/bitcoin#34616: Cluster mempool: SFL cost model (take 2)
403523127b Merge bitcoin/bitcoin#34608: test: Fix broken --valgrind handling after bitcoin wrapper
a49f97ff4a net: Don't log own ips during discover
76eb04b16f Merge bitcoin/bitcoin#34655: fuzz: keep `coins_view` fuzzers within caller contracts
21cd1ba182 Merge bitcoin/bitcoin#34286: test: verify node state after restart in assumeutxo
f3887cf694 Merge bitcoin/bitcoin#34561: wallet: rpc: manpage: fix example missing `fee_rate` argument
8cd4a4363f threadpool: guard against Start-Stop race
9ff1e82e7d test: cleanup, block threads via semaphore instead of shared_future
f50d53c847 Merge bitcoin/bitcoin#34627: guix: use a temporary file over sponge, drop moreutils
c88c916e72 Merge bitcoin/bitcoin#34653: test: improve txospender index tests code
744d47fcee clusterlin: adopt trained cost model (feature)
4eefdfc5b7 clusterlin: rescale costs (preparation)
bbc8f1e0a7 ipc mining: Prevent ``Assertion `m_node.chainman' failed`` errors on early startup
a7cabf92e4 init refactor: Only initialize node.notifications one time
ecc9a84f85 clusterlin: use 'cost' terminology instead of 'iters' (refactor)
9e7129df29 clusterlin: introduce CostModel class (preparation)
e8f8b74a46 test: index, improve txospenderindex_initial_sync() test code
c8e332cb33 init refactor: Remove node.init accesss in AppInitInterfaces
5db78c84ad Merge bitcoin/bitcoin#34660: ci: use LLVM 22 in sanitizer tasks
fa5d478853 test: valgrind --trace-children=yes for bitcoin wrapper
fa29fb72cb test: Remove redundant warning about missing binaries
fa03fbf7e3 test: Fix broken --valgrind handling after bitcoin wrapper
bd9e0e65f5 Merge bitcoin/bitcoin#34184: mining: add cooldown to createNewBlock() immediately after IBD
a28eedb8c2 ci: use LLVM 22 in sanitizer tasks
ab8a7af742 Merge bitcoin/bitcoin#34646: Fix two issues in p2p_private_broadcast.py
9581a0a5b1 Merge bitcoin/bitcoin#34615: mempool: expose optimality of mempool to log / rpc
3281824ecf fuzz: prevent invalid `FRESH` entries and surface `BatchWrite` errors
780f460635 fuzz: avoid invalid `AddCoin` overwrites
d7e0d510f2 fuzz: make `AddCoins` query view for overwrites
b8fa6f0f70 util: introduce `TrySub` to prevent unsigned underflow
ac3bea07cd test: improve rpc_gettxspendingprevout.py code
da7f70a532 test: use port 0 for I2P addresses in p2p_private_broadcast.py
a8ebcfd34c test: let connections happen in any order in p2p_private_broadcast.py
45133c589a doc: clarify `git range-diff` add/delete output
e5f0613503 net processing: Check if we are in ibd before processing block for txdownloadman
ce8b692897 Add functional test exercising tx downloadman recently confirmed filter
c462e54f9d test: don't always assert NUM_PRIVATE_BROADCAST_PER_TX broadcasts
3710566305 test: move abortprivatebroadcast test at the end
38a7a67126 cmake: Provide `install_name_tool` stub instead of disabling it
fcaec2544b doc: release note for IPC cooldown and interrupt
1e82fa498c mining: add interrupt()
a11297a904 mining: add cooldown argument to createNewBlock()
a9e59f7d95 rpc: add optimal result to getmempoolinfo
a3fb3dd55c mempool: log if we detect a non-optimal mempool
3feabb203a leveldb: remove unused files
c86bce597a guix: use a temporary file over sponge
6202acd284 test: addrman: successive failures in the last week for IsTerrible
c68e3d2c57 doc: add release notes for Tor PoW defenses
4bae84c94a doc: add a hint to enable PoW defenses to manual hidden services
4c6798a3d3 tor: enable PoW defenses for automatically created hidden services
fb993f7604 tor, fuzz: reuse constants instead of duplicating
111864ac30 qa: Avoid duplicating output in case the diff is the same
c2e28d455a ci: Enable `wallet_multiwallet.py` in "Windows, test cross-built" job
850a80c199 qa: Disable parts of the test when running under Windows or root
fb803e3c79 qa: Test scanning errors individually
ed43ce57cc qa: Check for platform-independent part of error message
64a098a9b6 refactor(qa): Break apart ginormous run_test()
bb1aff7ed7 move-only(qa): Move wallet creation check down to others
d1a4ddb58e refactor(qa): Lift out functions to outer scopes
c811e47367 scripted-diff: self.nodes[0] => node
73cf858911 refactor(qa): Remove unused option
fa6af85634 refactor: Use static_cast<decltype(...)> to suppress integer sanitizer warning
fa692974ac util: Fix UB in SetStdinEcho when ENOTTY
97e7e79435 test: Enable `system_tests/run_command` "stdin" test on Windows
a4324ce095 test: Remove `system_tests/run_command` runtime dependencies
fa36adeb71 ci: [refactor] Drop last use of pwsh
fae31b1e2f ci: [refactor] Move github_import_vs_env to python script
fafdb8f635 ci: Allow running iwyu ci in worktree
fab73e213d ci: Reject unsafe execution of shell scripts
f611d3bdaf refactor: addrman: move consts to .h
353c660be5 bench: use deterministic `HexStr` payload
22335474d7 net: format peer+addr logs with `LogPeer`
e55ea534f7 test: add pre-`LogPeer` net log assertion
736b17c0f0 log: fix minor formatting in debug logs
9cf82bed32 log: show placeholders for missing peer fields
bb00fd2142 test: use dynamic ports and add coverage in feature_bind_port_discover
4f19508ae7 test: dont connect nodes in feature_bind_port_discover
b8827ce619 net: Fix Discover() not running when using -bind=0.0.0.0:port
80dc4359b8 cmake: Apply workaround for `install_name_tool` conditionally
a067ca3410 [doc] coin selection filters by max cluster count, not descendant
02d047fd5b refactor: add overflow-safe `CeilDiv` helper
50cf6838e6 wallet: rpc: manpage: fix example missing `fee_rate` argument
f7be5fb8fc [refactor] rename variable to clarify it is unused and cluster count
39e3295c71 test(miniscript): Check for depth rather than script size
5f36e0ff1e rpc: fix getblockstats UTXO overhead accounting
76190489e6 coins: pack `Coin` height/coinbase consistently
1f309d1aa2 coins: make `Coin::fCoinBase` a bool
d339884f1d bench: add script verification benchmark for P2TR key path spends
edc2978058 signals: use an alias for the boost::signals2 namespace
9ade3929aa signals: remove forward-declare for signals
037e58b57b signals: use forwarding header for boost signals
c6a6435ced wallet: remove `DBErrors::NEED_REWRITE` enum value
61039d72a5 wallet: remove unimplemented `RewriteDB` calls from SPKM
5af5e87646 test(miniscript): Make tested script valid
fd7c494c6b doc(miniscript): Explain why we operate on vectors
dd93362a1d bench: simplify script verification benchmark, generalize signing
faa016af54 refactor: Use aliasing shared_ptr in Sock::Wait
2150153f37 signals: Temporarily add boost headers to bitcoind and bitcoin-node builds
fd5e9d9904 signals: Use a lambda to avoid connecting a signal to another signal
da51b5e4d2 refactor(miniscript): Move keys to avoid copy
67696b207f net: extend log message to include attempted connection type
5cd57943b8 test: verify node state after restart in assumeutxo
43c528aba9 wallet, test: update `gethdkeys` functional test
6e3a0afc2f wallet: fix `gethdkeys` RPC for descriptors with partial xprvs
5b2c3960b9 test: clean up tx resurrection (re-org) test in feature_block.py
b149a28f6b depends: Do not consider `CC` environment variable when detecting system
1fea3bae5c ipc, test: Add tests for unclean disconnect and thread busy behavior
f51665bee7 psbt: validate pubkeys in MuSig2 pubnonce/partial sig deserialization
b3046cca71 doc: add release notes for #26988
e76e886581 guix: doc: zdiff3 doesn't work
ea1be38677 guix: doc: Suggest guix-install.sh --uninstall
0a8d303d66 test: fix test_limit_enforcement_package
81e763f1e5 wallet: Have GetBalance report used amount directly without two calls
675be93024 cli: modify -addrinfo to use getaddrmaninfo RPC endpoint
d62f46eed4 doc: Add `INSTALL.md` to Linux release tarballs
fa6497ba71 build: Set AUTHOR_WARNING on warnings
af041c4057 wallet: Always rewrite tx records during migration
0dc337f73d gui: Fix TransactionsView on setCurrentWallet
git-subtree-dir: libbitcoinkernel-sys/bitcoin
git-subtree-split: 0abbe35bb20cd7dae70b9a4d69e70472a9f6f680

The PR avoids errors from non-C++ rust & python clients when they make asynchronous requests (bitcoin/bitcoin#33923) and unclean disconnects (bitcoin/bitcoin#34250). Neither of these errors are easily possible to trigger from libmultiprocess clients because of its blocking interface and RAII semantics, but they are fairly easy to trigger from rust and python and there is a test triggering both of them in bitcoin/bitcoin#34284