ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

ezjail の終了に 10 秒かかる問題を直した

なんか、いつ頃からか。 ある ezjail の仮想マシンを終了するときに 10 秒待たされることに気づいたのでした。

そう、前回の記事と同時に発症してたのです。まぁ、終了時にしか stop しなければ……と思ってましたが、やっぱり不便なのです。 そこでいろいろ調べた記録の片割れです。

その仮想マシンの中では tomcat さんが動いていたので、試しに起動自体をしないようにしてみると、問題なし。 一方、手動で tomcat さんを終了すると 10 秒待つことになる。なるほど、こいつが原因だ。

という訳で、ログを眺めてみると

WARNING [main] org.apache.tomcat.util.net.Acceptor.stop The acceptor thread [ajp-nio-127.0.0.1-8009-Acceptor] did not stop cleanly
INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-127.0.0.1-8009"]

うーん、こいつっぽい。

この Acceptor とやらの実装を眺めてみると、どうやら 10 秒でタイムアウトさせているようだ。 こいつっぽいな。

ていうか非同期のソケットとかにはして……なさそうだな?と思って終了に関する実装を眺めてみると、 どうやら unlockAccept() メソッドを呼ぶことで「自分自身のソケットに connect を行うことで accept から戻らせる」 ということをやっている様子。ま、マジすか……

という訳で、ファイアウォールAJP のポートを開ける際に、自分自身からの接続も許可してみると、 無事に 1 秒もかからず正常終了するようになりました、とさ。

マジかー、そういう終了シーケンスは初めて見た気がするな……いや、私の見識が狭いだけで、実は定石なん?