postfixのincomingが溜まりまくる

例によってXen絡みのkernel panicで早朝システムダウンをする。

「例によって」と書くくらいだから、もう対処も慣れっこになっているのだけど、今回は/varのイメージファイルがおかしくなったらしく、fsckが正常終了しない。reiserfsなので、–rebuild-treeを指定して、ようやく修復出来た。もちろんいろいろlost+foundに落ちたのだけど、全部メールのキューなので「まぁいいか」と無視することに。このサーバに来るメールは99%以上spamだし。

それは良いんだけど、なぜだかメールの処理がおかしくなる。症状としてはincomingまでメールは届くのだけど、ユーザには配送されない。

全く配送されないかと言えばそうでもなく、たまに配送されることもある。幸い、最も重要なメールは無事に届いてくれたので、私の運も捨てたもんじゃない… ってのは良いんだが、ほとんどのメールが配送されない。

類似の症状が世間にないかと思ってぐぐってみるのだがわからない。twitterでぼやいてみてもヒントもない。当然キュー制御のコマンド(postqueueとか)を入れても処理されない。incomingは増える一方だ。

あれこれ悩んでもしょうがないのだが、何かエラーらしきものが出ないかと、syslogをダラダラと表示することにした。

キューが処理されないので、多分qmgrあたりに何かメッセージは出ないかと思って見ていたら、

postfix/qmgr[20041]: fatal: 574193FEE89: envelope records out of order

といった類のメッセージが出ていることを発見する。おおかたキューファイルが壊れているのだろう。

ここでふと思いついたのは「このファイルのせいでqmgrは処理をやめているのではないか?」ということ。だったら、このファイルを消してしまえば、うまく動いてくれるかも知れない。

ということで、件のファイルを消してみると、syslogの流れがいきなり変わった。つまり、ユーザへの配送が開始されたのだ。ということは、メール処理は正常になったということ。

ここで「思いついた」のは、以前もやはりキューの中に壊れたファイルがあって、それが元で配送がおかしくなったことがあったから。どうもpostfixは壊れたファイルがあると、そこで処理を止めてしまって、それ以上何もしてくれなくなるようだ。壊れてることがわかってるんだから、修復を試みるとか、捨てるとか、避けておくとかしてくれても良いのだけど、「そこで終わって何もしない」ようになっている。ドキュメントに「そうなっているから覚えておいてね」的なことでも出ていれば、それなりに対処のしようもあるんだけど、そんなことはまるっきりない。さっさと処理をやめて知らんぷりだ。

ということで、/varを含んだパーティション(イメージ)がfsckで面倒なことになった後にpostfixのメール配送がおかしくなった場合は、

キューに壊れたファイルはないか

ということを調べてみると良い。かなりの高確率で復旧されるはずだ。

え? そんなに安易に消して良いかって? なーに、どうせ壊れてしまったファイルだし、たいていのメールのキューの中身って

99%以上spam

なのだ。普通spamフィルタって、配送される時に通すわけだからね。だから、余程運が悪くない限り、大事なメールが消えることはない。それよりはlost+foundに行ってしまったファイルを心配する方が大事だろう。