振り分け先サーバ異常時にFINパケットが返却される
ip モジュールに--no-reschedule オプションを指定した場合のほかに、sslidモジュールでの--no-reschedule オプションを指定時にも同様の問題が発生する。
また、SorryServerが設定されていない、もしくはSorryServerに異常が発生している場合に、クライアントからの接続がSorryServerに振り分けられた場合も同様の問題が発生する。
■本事象の原因
ソケットをクローズする際に、socket.shutdown()を行い、その後にsocket.close()を行うが、
異常時にsocket.shutdownを行ってしまうと、強制的にソケットをクローズせず、穏やかにソケットをクローズしようとするため、RSTではなくFINが返却される。
現状、正常時、異常時にかかわらず、必ずshutdownを実行するようになっている。
■添付の修正patchについて
・upthread_status がUPTHREAD_LOCKになったままで、UPTHREAD_ACTIVEに変更されていなかったた点を修正。
クライアント側ソケットのクローズ処理は各モジュールにより
1.CLIENT_DISCONNECT(shutdown)
2.FINALIZE(close)
の順番で行われるようになっているが、異常時はFINELIZEのみ実行するよう修正
・sslの通信時にlowest_layer().shutdownは冗長であるため、併せて修正。
#ssl_socket.shutdown()を行うだけでよい。
v3.0.4-2で修正が取り込まれた。
振り分け先サーバ異常時に、クライアントがUM-L7に接続すると、RSTではなくFINパケットが返却される。
この場合、クライアントにはエラーが表示されず、空のデータが返却された場合と同じ動作をする。
振り分け先は異常な状態になっているため、クライアントにはエラーが表示されるほうが好ましい。
本事象はUltraMonkey-L7-v3.0.3で発生しており、v3.0.1では発生しない(RSTが返る)ためデグレと考えられる。
本事象の再現手順は以下のとおり。
1. ip モジュールに--no-reschedule オプションを指定し、VSを追加
2.クライアントから1で追加したVSに接続
3.2で接続した際に振り分けられたサーバを停止
4.再度、2と同じクライアントから接続