2006-05-19 [長年日記]

[Q3] スパムフィルタでブロックする

複数のIMAP4でスパムフィルタを使っていてパラレルで同期すると、スパムフィルタのDBの排他制御やアカウントの排他制御が絡み合って、スパムフィルタがちゃんと動き出すまでUIがブロックしてしまうことがあります(POP3やNNTPでも程度の差はあっても同じようなことが起きます)。

スパムフィルタと振り分けが統合したときに、スパムフィルタは@Junk()の呼び出しにしました。マクロの評価中は対象のアカウントはロックしておかなくてはいけません。そこで@Junk()の評価に時間がかかると、そのアカウントがロックされっぱなしになってしまうわけです。

@Junk()の評価に時間がかかるのは、DBを開くのには結構時間がかかる*1のと、メッセージをサーバから取得するためにサーバに接続しにいくと時間がかかることがある*2ためです。

というわけでちょっと場当たり的ですが少し手を入れてみました。

  1. スパムフィルタは先に処理しておく

    一回学習したメッセージに対しては即結果を返せるので、前もってスパムフィルタの処理をしておいて*3、@Junk()は即結果を返せるようにしました。ただし、自動学習がOnになっている場合のみです。

  2. セッションを前もって用意しておく

    スパムフィルタや自動振り分けを使っていてサーバへのセッションが必要になりそうな場合には前もって用意しておくようにしました。無駄になる可能性もあるのですが、UIがブロックしてしまうよりは良いでしょう。

自分で使っている限りではだいぶ改善したのではないかと思います。

[Q3] NNTPで自動振り分けするとクラッシュするかも

上の修正をしていたら気づいたのですが、NNTPで自動振り分けやスパムフィルタが働いている最中に、別のフォルダのオンラインのメッセージを読むとセッションがおかしくなる可能性がありましたので、修正しました。

*1  これは起動後初めてのときだけ

*2  メッセージがキャッシュされているか、元々セッションを保持していれば使いまわすので発生しない

*3  この間ロックは開放できる

[]