2010年7月29日

[postfix-jp: 3815] Re:postfixadminとの組み合わせで謎の現象

さとうふみやす @ OSSTech です。

At Wed, 28 Jul 2010 15:28:13 +0900 (JST),
大塚 総司(OTSUKA soushi) wrote:
> テスト環境でclueanupに-vをつけてログを出してみました。
***snipped***
> 02:38:21 srvXX postfix/cleanup[32191]: rewrite_clnt: local: otsuka??@example.jp -> otsuka??@example.jp
> 02:38:21 srvXX postfix/cleanup[32191]: been_here_check: otsuka??@example.jp: 0

> 02:38:21 srvXX postfix/cleanup[32191]: dict_mysql_get_active: found active connection to host 127.0.0.1

ここで 127.0.0.1 の MySQL へのセッションを見つけているのに対し、

> 02:38:21 srvXX postfix/cleanup[32191]: warning: mysql query failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
> 02:38:21 srvXX postfix/cleanup[32191]: maps_find: virtual_alias_maps: otsuka??@example.jp: search aborted
> 02:38:21 srvXX postfix/cleanup[32191]: mail_addr_find: otsuka??@example.jp -> (try again)
> 02:38:21 srvXX postfix/cleanup[32191]: mail_addr_map: otsuka??@example.jp -> (try again)
***snipped***
> 02:38:21 srvXX postfix/cleanup[32191]: mail_addr_find: test4@xxxxx -> (try again)
> 02:38:21 srvXX postfix/cleanup[32191]: mail_addr_map: test4@xxxxx -> (try again)

こちらでは何も見つけていません。(有効な MySQL セッションが存在しない)

> 02:38:21 srvXX postfix/cleanup[32191]: warning: 786321A00DA: virtual_alias_maps map lookup problem for test4@xxxxx
> 02:38:21 srvXX postfix/cleanup[32191]: been_here: rfc822;test4@xxxxx?0?test4@xxxxx?test4@xxxxx: 0

src/global/dict_mysql.c をよく見たところ、「mysql query failed」した
後に plmysql_down_host(host) を実行しています。plmysql_down_host() が
何をしているかというと、次のようになっています:

/*
* plmysql_down_host - close a failed connection AND set a "stay away from
* this host" timer
*/
static void plmysql_down_host(HOST *host)
{
mysql_close(host->db);
host->db = 0;
host->ts = time((time_t *) 0) + RETRY_CONN_INTV;
host->stat = STATFAIL;
event_cancel_timer(dict_mysql_event, (char *) host);
}

つまり、RETRY_CONN_INTV 秒 (60 秒固定) の間は STATFAIL (異常) 扱いに
します。結果、60秒間はこの MySQL セッションは使えなくなります。

問題の回避方法ですが、src/global/dict_mysql.c の
「mlmysql_down_host(host);」を「mlmysql_close_host(host);」に
書き換えれば即座に有効になって再接続されますが、MySQL サーバーを
複数立てていて Postfix からそれらを参照しており、MySQL サーバーの
フェイルオーバーを期待したい場合にうまい具合に動作しなくなると
思われます。

MySQL に詳しくないのですが、plmysql_connect_single() 内の
mysql_real_connect() の成功後に「mysql_set_character_set(host->db, "binary");」
を追加すると回避できないでしょうか?

> また、SQLクエリログも一緒に付けています。
> クエリログでは一応、test4@xxxxxをselectしたクエリが残って
> います。

クエリは発生しないはずなんですが、何か見落しているのかなぁ。

--
-- Name: SATOH Fumiyasu (fumiyas @ osstech co jp)
-- Business Home: http://www.OSSTech.co.jp/
-- Personal Home: http://www.SFO.jp/blog/

_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list


投稿者 xml-rpc : 2010年7月29日 02:32
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/97323
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。