基本的には、MTAによる再送処理が行なわれるように fml8 が異常終了するか、 fml8 自身が頑張って配送処理を行なうか?の処理となります。 fml8 自身が頑張る場合、 ログファイルやサマリファイルには欠落が出る可能性があり得ますが、 投稿された記事の内容が失われることだけはないつもりです。
以下、記事の配送処理でファイルシステムのエラーで書き込みがうまくいかな い時、何が起こるかを説明します。
fml8 は STDIN から読みこんだメールを一度ディスクに書きます。 この書き込みが成功すれば、処理を進めます。失敗した場合、 MTA に再挑戦してもらうため、exit(EX_TEMPFAIL)でプロセスを異常終了させます。 くわしくは the Section called fml がメールを読みこむ際のキューイング in Chapter 35 を参照してください。
このとき、incoming queue には中途半端にメールが書き込まれたファイルが 残り得ます。 異常終了時にもこのファイルを消すようにしていますが、 万が一残ってしまっても あとでキュー管理システムにより削除されます。 正確には古くなったincoming queueのファイルを消す処理が定期的に 行なわれるため、その時に消去されます。
きちんと新しい記事番号(+1されたもの)がシークエンスファイル(seq)に 書き込めたか(ファイルに書いて、閉じて、再び開いて、再度読みこんでみる) を確認し、成功していれば、処理を進めます。 失敗していた場合、exit(EX_TEMPFAIL) で終了し、 MTA から fml8 を再呼び出ししてもらうようにします。
Caution |
記事番号は更新してしまったので、この処理以降、exit(EX_TEMPFAIL) で終了してはいけません。 つまり重複するので MTA に再配送を依頼してはいけません。 |
Caution |
この処理を開始する時、すでに記事番号は更新されています。 |
記事の書き込みはできませんが、オリジナルのメールは既にディスクに書き込 まれています。記事の方は、ヘッダ部分には色々と追加がありますが、本文は オリジナルメールのものと一緒です。そこで、incoming queue ディレクトリ から「spool/割り当てられた記事番号」ファイルへlink(2)することで、記事 の内容だけは保存するようにします。 [1]
配送するべき記事をディスクに保存することができませんでしたが、 メモリ上に配送するべき記事はあるので、記事の配送処理をこころみます。
ただ、このときは( outgoing )メールキューに書き込めないため、もし配送過 程でエラーが生じた場合、配送は中途半端に終了となります。
配送するべき内容を( outgoing )キューに書き、書き込み成功後に配送処理が 行なわれます。
キューに書き込めない場合、メモリ上のデータの配送を試みますが、 配送過程でエラーが生じた場合、配送は中途半端に終了となります。 [2]
outgoing キューについての詳細は、 the Section called fml からメールで返事を送り返す in Chapter 35 を参照してください。
[1] | さらに、記事ファイルにヘッダをつけてあげるコマンドが別途あるとよいでしょ うね。でも、未実装です。 |
[2] | トリッキーな拡張が必要ではありますが、ちゃんとキューイングをフェイクで きる仕組みが必要でしょう。たとえば、別の(のちに起動された)プロセスが、 この記事のメールキューを再生成して配送キューにいれる試みをするように拡 張するなどと、するべきなのでしょう。この部分は未実装です。 |
author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.
For questions about FML, e-mail <fml-bugs@fml.org>.