Ensure KernelNotifications m_tip_block
is set even if no new block arrives.
Suggested in #31297 (comment)
Ensure KernelNotifications m_tip_block
is set even if no new block arrives.
Suggested in #31297 (comment)
The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.
For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/31346.
See the guideline for information on the review process. A summary of reviews will appear here.
Reviewers, 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.
4705@@ -4706,6 +4706,11 @@ bool Chainstate::LoadChainTip()
4706 m_chain.Height(),
4707 FormatISO8601DateTime(tip->GetBlockTime()),
4708 GuessVerificationProgress(m_chainman.GetParams().TxData(), tip));
4709+
4710+ // Ensure KernelNotifications m_tip_block is set even if no new block arrives.
4711+ // Ignoring return value for now.
4712+ (void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(/*init=*/true, m_chainman.m_blockman.m_blockfiles_indexed), *pindex);
[[nodiscard]]
from blockTip
instead
@maflcko which if-guard do you mean?
I think probably this one:
0 // Wait for genesis block to be processed
1 if (WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip() == nullptr)) {
Removing the if()
might help verify that m_tip_block
is set reliably
I dropped the if guard.
ensuring that any interfaces will only be spun up after that point in init
It could, but I’m not sure if it’s worth putting such a restriction on the interfaces.
Similarly we have startupnotify
which happens at the end of init. If we also ensure that the interfaces are ready to listen before this notification, then an application launched with systemd (or similiar) can wait for this signal before trying to connect.
If on the other hand an external application is started at the same time, it would just have to keep trying to connect until we listen. Such a race would exist even if we opened the interface a bit earlier in the init process, though it would be shorter.
It could, but I’m not sure if it’s worth putting such a restriction on the interfaces.
Tend to agree for now. Having waitTipChanged wait for a tip to be connected seems like a natural thing to implement and might avoid the need for clients to poll the node on startup. But I think this check could be dropped in BlockTemplate::waitNext in #31283 (maybe replaced with an assert there) since it should not be possible to get a blocktemplate reference before the tip is connected. After #31283 it might make sense to drop the waitTipChanged
method entirely too.
Several reindex related tests are broken, investigating…
After #31283 it might make sense to drop the
waitTipChanged
method entirely too.
I think it’s generically useful though. There are various types of applications that need to know when a new block is added to the chain (and have no need for a template).
🚧 At least one of the CI tasks failed. Debug: https://github.com/bitcoin/bitcoin/runs/33386413030
Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:
Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.
A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.
An intermittent issue.
Leave a comment here, if you need help tracking down a confusing failure.
Specifically -reindex-chainstate
is broken, easy to reproduce with e.g. testnet4.
It stops after the second block:
02024-11-22T16:44:14.338986Z Setting NODE_NETWORK on non-prune mode
12024-11-22T16:44:14.339014Z Wait for genesis block to be processed
22024-11-22T16:44:14.339023Z initload thread start
32024-11-22T16:44:14.341109Z UpdateTip: new best=00000000da84f2bafbbc53dee25a72ae507ff4914b867c565be350b0da8bf043 height=0 version=0x00000001 log2_work=32.000022 tx=1 date='2024-05-03T23:11:00Z' progress=0.000001 cache=0.3MiB(0txo)
42024-11-22T16:44:14.341179Z UpdateTip: new best=0000000012982b6d5f621229286b880e909984df669c2afabb102ce311b13f28 height=1 version=0x20000000 log2_work=33.000022 tx=2 date='2024-05-06T13:08:48Z' progress=0.000002 cache=0.3MiB(1txo)
Putting the if-guard back “fixes” it. When I put a log statement before WAIT_LOCK
and after the wait
function returns, I can see that this lines are called regardless of the if-guard.
Turns out the only critical thin is that the WAIT_LOCK
stuff lives in its own scope.
Ensure KernelNotifications m_tip_block is set even if no new block arrives.
Additionally, have node init always wait for this to happen.