モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Postfixのtarpitting(sleep)の効率を上げたい

Postfixtarpittingをするための設定、sleepの指定で60とか書くと、そのタイミングで60秒間待たせます。
sleepの指定をすると、相手が接続を切ったかどうかに関わらず、必ずその時間待ってしまいます。
例えばsleep 90としてある場合、接続してきた相手が10秒で切れようと60秒で切れようと、必ず90秒待ってから切れます。
sleepは大抵、tarpittingのために使うと思うので、相手の接続が切れたら、そこで待ってるsmtpdも終了してくれれば良いのですが、その間smtpdが生きているためメモリを消費してしまいます。


どんなコードになってるんだろう?と思って smtpd_check.c を見てみたら

                sleep(atoi(*++cpp));

ほんとに単にsleepしてるだけ orz


うーん、接続が切れたら即smtpdも死んでくれるコードにならんもんだろうか。
そういうパッチ書けるかなあ…


(追記)

smtpdのソース見て、単純に「lost connection」を判定してるところひっぱてきて試したんですがだめでした。
で、良く読んでみたら、接続してるストリームへの入出力時にタイムアウトで切断を検出してる?
となると、tarpittingの接続断の検出には使えないなあ… ということで他の手段を模索中。


(追記)

モーグルとカバとパウダーの日記 - Postfix 2.3 で sleep 中に相手が切ったらこっちもすぐsmtpdが切れるパッチ

パッチ出来ました。