I just recently received this issue that shuts down the pubsub service when using an async topic validator:
2026-01-03 16:16:27,482 [ERROR] [async_service.Manager] <Manager[GossipSub] flags=SRcfe>: task heartbeat[daemon=True] exited with error: (b'\x00\x00\x00\x00iY\x86\xff', b'\x00$\x08\x01\x12 /X\x99\xbbp\xa2\xaa9\x93\xc2\xd6f\xa2\x99\x1e[vH"rac\x8e\x1e!\x8b\xff\x91\x0c)\xe7x')
Traceback (most recent call last):
File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/base.py", line 334, in _run_and_manage_task
await task.run()
File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 118, in run
await self._async_fn(*self._async_fn_args)
File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/pubsub/gossipsub.py", line 565, in heartbeat
self.mcache.shift()
File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/pubsub/mcache.py", line 102, in shift
self.msgs.pop(entry.mid)
KeyError: (b'\x00\x00\x00\x00iY\x86\xff', b'\x00$\x08\x01\x12 /X\x99\xbbp\xa2\xaa9\x93\xc2\xd6f\xa2\x99\x1e[vH"rac\x8e\x1e!\x8b\xff\x91\x0c)\xe7x')
2026-01-03 16:16:27,496 [ERROR] [__main__] Fatal error: Exceptions from Trio nursery (1 sub-exception)
+ Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/subnet/cli/run_node.py", line 408, in main
| trio.run(server.run)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 2549, in run
| raise runner.main_task_outcome.error
| File "/home/bob/py-libp2p-subnet-gossip/subnet/server/server.py", line 134, in run
| async with host.run(listen_addrs=listen_addrs), trio.open_nursery() as nursery:
| File "/usr/lib/python3.10/contextlib.py", line 217, in __aexit__
| await self.gen.athrow(typ, value, traceback)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/host/basic_host.py", line 357, in _run
| async with background_trio_service(network):
| File "/usr/lib/python3.10/contextlib.py", line 217, in __aexit__
| await self.gen.athrow(typ, value, traceback)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 456, in background_trio_service
| async with trio.open_nursery() as nursery:
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 1125, in __aexit__
| raise combined_error_from_nursery
| exceptiongroup.ExceptionGroup: Exceptions from Trio nursery (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 461, in background_trio_service
| yield manager
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/host/basic_host.py", line 374, in _run
| yield
| File "/home/bob/py-libp2p-subnet-gossip/subnet/server/server.py", line 134, in run
| async with host.run(listen_addrs=listen_addrs), trio.open_nursery() as nursery:
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 1125, in __aexit__
| raise combined_error_from_nursery
| exceptiongroup.ExceptionGroup: Exceptions from Trio nursery (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/subnet/server/server.py", line 161, in run
| async with background_trio_service(dht):
| File "/usr/lib/python3.10/contextlib.py", line 217, in __aexit__
| await self.gen.athrow(typ, value, traceback)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 456, in background_trio_service
| async with trio.open_nursery() as nursery:
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 1125, in __aexit__
| raise combined_error_from_nursery
| exceptiongroup.ExceptionGroup: Exceptions from Trio nursery (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 461, in background_trio_service
| yield manager
| File "/home/bob/py-libp2p-subnet-gossip/subnet/server/server.py", line 176, in run
| async with background_trio_service(pubsub):
| File "/usr/lib/python3.10/contextlib.py", line 217, in __aexit__
| await self.gen.athrow(typ, value, traceback)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 456, in background_trio_service
| async with trio.open_nursery() as nursery:
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 1125, in __aexit__
| raise combined_error_from_nursery
| exceptiongroup.ExceptionGroup: Exceptions from Trio nursery (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 461, in background_trio_service
| yield manager
| File "/home/bob/py-libp2p-subnet-gossip/subnet/server/server.py", line 177, in run
| async with background_trio_service(gossipsub):
| File "/usr/lib/python3.10/contextlib.py", line 217, in __aexit__
| await self.gen.athrow(typ, value, traceback)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 456, in background_trio_service
| async with trio.open_nursery() as nursery:
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/trio/_core/_run.py", line 1125, in __aexit__
| raise combined_error_from_nursery
| exceptiongroup.ExceptionGroup: Exceptions from Trio nursery (1 sub-exception)
+-+---------------- 1 ----------------
| Exception Group Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 248, in run
| raise ExceptionGroup(
| exceptiongroup.ExceptionGroup: Encountered multiple Exceptions: (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/base.py", line 334, in _run_and_manage_task
| await task.run()
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/tools/async_service/trio_service.py", line 118, in run
| await self._async_fn(*self._async_fn_args)
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/pubsub/gossipsub.py", line 565, in heartbeat
| self.mcache.shift()
| File "/home/bob/py-libp2p-subnet-gossip/.venv/lib/python3.10/site-packages/libp2p/pubsub/mcache.py", line 102, in shift
| self.msgs.pop(entry.mid)
| KeyError: (b'\x00\x00\x00\x00iY\x86\xff', b'\x00$\x08\x01\x12 /X\x99\xbbp\xa2\xaa9\x93\xc2\xd6f\xa2\x99\x1e[vH"rac\x8e\x1e!\x8b\xff\x91\x0c)\xe7x')
Summary
I just recently received this issue that shuts down the pubsub service when using an async topic validator:
When using a sync topic validator with the same logic, this issue doesn't occur
Expected behavior
MessageCache to successfully pop the topic history
Actual behavior
The key is attempting to be popped but it apparently doesn't exist
Relevant log output
Possible Solution
Unsure
Environment
Would you like to work on fixing this bug ?
Maybe