Postfixでtarpittingをするための設定、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が切れるパッチ
パッチ出来ました。