HyperQueue의 귀여운 버그: SIGTERM과 10초의 미스터리
2025-02-24
Rust 기반 분산 작업 스케줄러인 HyperQueue에서 이상한 버그가 발생했습니다. 특히 10초 이상 sleep하는 작업이 수수께끼처럼 종료되었습니다. 디버깅 결과, 보기에 무해한 변경 사항, 즉 프로세스 생성 작업을 `tokio::task::spawn_blocking`으로 오프로드한 것이 원인임을 알게 되었습니다. 이는 `PR_SET_PDEATHSIG`(부모 프로세스가 종료될 때 SIGTERM을 전송)와 결합하여 문제를 일으켰습니다. `spawn_blocking`에 의해 생성된 worker thread는 유휴 상태가 지속되면 Tokio에 의해 수거되고 SIGTERM 신호가 전송되었습니다. 이 버그는 최적화를 되돌림으로써 수정되었으며, 동시성, 시스템 호출, 스레드 관리 간의 미묘한 상호 작용이 드러났습니다.
개발