【Puma Code Reading 2回目】Add Client#io_ok?, check before Reactor#register
ここ最近はpumaで採用されている、nio4rというgemについてちょくちょく調べてた。
どうやら、rubyのスタンダードライブラリではサポートされていない、epollやkqueueなどの非同期I/Oのシステムコールをサポートするライブラリのようだ。
rubyはネイティブの機能としてselectはサポートしているが、epollは採用していない。
またselectは計算量がo(n)であり、計算量がO(1)のepollを使った方が当然良いので、pumaではnio4rを利用している。
(最近ではnio4rを剥がす動きもあるっぽいのだが)
今日は、このnio4rに関係するこのPRを読んだ。
https://github.com/puma/puma/pull/2432
実装としては、Minitorにソケットを追加する前にソケットが閉じている場合にエラーが出てしまうので、無効かどうかを確認する`is_ok(socket)`というメソッドを追加し、Minitorに追加する前に`is_ok`を呼んで分岐をしているだけである。
ちなみに、CI上でテストを動かすときにしか再現できないバグらしいが、念の為このような実装を取り入れたそうだ。
pumaはversion3台から現在で、テストの量がかなり増えたので、それに応じてテストが通らないようなバグが発見されたのだろう。
今日のpumaリーディングはこれでおしまい。