Pekerjaan harian kita biasanya berputar di sekitar topik Linux dan keamanan, menyeluk ke dalam tumpukan perangkat lunak. Namun, lebih sering daripada yang Anda kira, kita akhirnya melakukan debug aplikasi yang berjalan jauh lebih tinggi dalam tumpukan. Kadang-kadang masalah seperti ini memiliki akar di kernel Linux, kadang-kadang di tempat lain.
Dalam pos blog ini kita menunjukkan bagaimana kami menemukan dan memperbaiki bug di dalam runtime Go. Baru-baru ini seorang pelanggan melaporkan bahwa aplikasi yang ditulis dalam Go mengalami crash dari waktu ke waktu pada salah satu sistem Linux tertanam mereka. Crash selalu menunjukkan error fatal yang sama dengan tanda tangan: runtime: netpoll: eventfd ready for 5.
Pada awalnya kita mengasumsikan bahwa aplikasi itu sendiri bug. Namun setelah kita memeriksa error lebih dekat, tampak lebih seperti asumsi internal dalam mekanisme netpoll Go yang tidak lagi berlaku. Pesan error berasal dari netpoll() di src/runtime/netpoll_epoll.go: jika ev.
Events != linux. EPOLLIN { throw("runtime: netpoll: eventfd ready for something unexpected") }. Pada jalur kode ini, kode netpoll mengharapkan EPOLLIN sebagai satu-satunya peristiwa yang memicu, tetapi ia menerima 5, yang merupakan EPOLLIN|EPOLLOUT.
Mengapa epoll tiba-tiba melaporkan lebih dari EPOLLIN jika kode hanya meminta EPOLLIN? Sebelum kita menggali lebih dalam, kami memasukkan pesan error ke dalam mesin pencari, berharap bahwa seseorang lain telah mengalami masalah yang sama sebelumnya. Ini membawa kita langsung ke laporan di pelacak masalah proyek Go: runtime: netpoll: eventfd ready for something unexpected. Masalah ini menjelaskan tepat error fatal yang kami amati.
Selain itu, hal ini juga terjadi pada sistem Linux tertanam ARM 32-bit! Pelapor juga mencatat bahwa crash terjadi dalam aplikasi yang berjalan lama. Ini juga cocok dengan deskripsi pelanggan kami. Bingo! Masalah ini terbuka dan belum terselesaikan sejak Maret 2025.
Pengelola Go juga menolak satu upaya untuk memperbaiki masalah. Dari komentar pada masalah ini kami belajar bahwa error fatal hanya pernah muncul pada sistem Linux 32-bit ARM dan i386, dengan semua versi kernel. Beberapa kernel cukup lama, lainnya baru.
Tidak ada pelapor yang pernah melihatnya pada sistem x86_64 atau arm64. Pada awalnya kami menduga bahwa epoll berperilaku berbeda pada ARM 32-bit atau i386. Kami dengan cepat mengabaikan ide ini karena epoll adalah kode inti generik di kernel.
Mengapa itu hanya mengembalikan kumpulan acara palsu hanya pada ARM.
Sumber: Hacker News · Diringkas oleh HeadlinesBriefing