Study further more

進捗出します

【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リーディングはこれでおしまい。