You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix event-loop freeze: try_to_lock in IO-thread tracker accesses
Root cause of recurring SIGABRT cycle on contabo (2026-04-12, -16, -19,
-21, -25): three IO-thread paths used blocking std::shared_lock on
m_tracker_mutex when the architectural rule (node.hpp:67) requires
try_to_lock everywhere on the IO thread. When the compute thread held
the exclusive write lock for a long think+clean cycle on a wedged
chain (~30+s), the next incoming SHAREREQ would block here, the
ext_watchdog would fire after 30s of io_context unresponsive, and
systemd would restart.
Confirmed via core dump from contabo's 2026-04-25 20:31 crash:
Thread 6 (main IO) was caught in pthread_rwlock_rdlock_full64 inside
ltc::NodeImpl::handle_get_share at node.cpp:581. The compute thread
had already released by the time of SIGABRT but Thread 6 was still
stuck mid-block.
Three fixes — all the same shape (try_to_lock + log + return on busy):
- handle_get_share — empty reply OK, peer's downloader picks another
random peer next iteration (p2pool node.py:120)
- send_shares — defer to next broadcast cycle
- broadcast_share — defer; share is still in chain, next think /
SHAREREQ will pick it up
This addresses the freeze at the source: think+clean can take as long
as it likes on a wedged chain, the IO thread will keep flowing.
0 commit comments