なんか、いつ頃からか。 ある 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 秒もかからず正常終了するようになりました、とさ。
マジかー、そういう終了シーケンスは初めて見た気がするな……いや、私の見識が狭いだけで、実は定石なん?