ipc mining: Prevent `Assertion m_node.chainman' failed`` errors on early startup

This fixes ``Assertion `m_node.chainman' failed`` errors first reported
https://github.com/bitcoin/bitcoin/issues/33994#issuecomment-3602551596 when
IPC mining methods are called before ChainstateManager is loaded.

The fix works by making the `Init.makeMining` method block until chainstate
data is loaded.
This commit is contained in:
Ryan Ofsky committed 2026-02-24 10:15:14 -05:00
1 parent a7cabf92e4
commit bbc8f1e0a7
6 files changed
+52 -5

No files matched your search

+29
View File
@@ -147,6 +147,34 @@ class IPCMiningTest(BitcoinTestFramework):
asyncio.run(capnp.run(async_routine()))
def run_early_startup_test(self):
"""Make sure mining.createNewBlock safely returns on early startup as
soon as mining interface is available """
self.log.info("Running Mining interface early startup test")
node = self.nodes[0]
self.stop_node(node.index)
node.start()
async def async_routine():
while True:
try:
ctx, mining = await self.make_mining_ctx()
break
except (ConnectionRefusedError, FileNotFoundError):
# Poll quickly to connect as soon as socket becomes
# available but without using a lot of CPU
await asyncio.sleep(0.005)
opts = self.capnp_modules['mining'].BlockCreateOptions()
await mining.createNewBlock(ctx, opts)
asyncio.run(capnp.run(async_routine()))
# Reconnect nodes so next tests are happy
node.wait_for_rpc_connection()
self.connect_nodes(1, 0)
def run_block_template_test(self):
"""Test BlockTemplate interface methods."""
self.log.info("Running BlockTemplate interface test")
@@ -374,6 +402,7 @@ class IPCMiningTest(BitcoinTestFramework):
self.miniwallet = MiniWallet(self.nodes[0])
self.default_block_create_options = self.capnp_modules['mining'].BlockCreateOptions()
self.run_mining_interface_test()
self.run_early_startup_test()
self.run_block_template_test()
self.run_coinbase_and_submission_test()
self.run_ipc_option_override_test()