Apr 06
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.xiaojb.com/archives/mailtech/patch_for_vpopmail.shtml
网址:http://www.xiaojb.com/archives/mailtech/patch_for_vpopmail.shtml
上周邮件服务器出了故障,主要是vpopmail报告MySQL server has gone away,这样的错误,经过查找原因发现是这样的:courier-authlib启动了一个进程authdaemond做认证,sasl,imapd,maildrop都通过这个进程获取用户数据,当MySQL服务器的wait_timeout参数教小的时候,就容易出这种错误,vpopmail的这段代码有一个静态变量标记和MySQL服务器的连接是否已经打开,如果是真,则使用已经打开的连接,不再连接MySQL,当空闲时间超过wait_timeout后,MySQL服务器会关闭连接,这个时候再复用这个连接的时候,就会出现”MySQL server has gone away”的错误提示。加入了mysql_ping这个函数后它判断跟MySQL服务器的连接是否有效,无效的话就不返回了。
vpopmail offical site: http://www.inter7.com/vpopmail/
Maillist Archive: http://www.mail-archive.com/vchkpw@inter7.com/
Patch FIle:http://www.xiaojb.com/upload/2006/vmysql.patch
下载: vpopmail.diff
- diff -u vpopmail-5.4.13.org/vmysql.c vpopmail-5.4.13/vmysql.c
- --- vpopmail-5.4.13.org/vmysql.c 2004-12-16 23:57:34.000000000 +0800
- +++ vpopmail-5.4.13/vmysql.c 2006-03-31 09:42:45.000000000 +0800
- @@ -188,7 +188,7 @@
- {
- unsigned int timeout = 2;
- - if ( update_open != 0 ) return(0);
- + if ( update_open && (mysql_ping(&mysql_update)==0) ) return(0);
- update_open = 1;
- verrori = load_connection_info();
- @@ -238,7 +238,7 @@
- int vauth_open_read()
- {
- /* if we are already connected, just return */
- - if ( read_open != 0 ) return(0);
- + if ( read_open && (mysql_ping(&mysql_read)==0) ) return(0);
- read_open = 1;
- /* connect to mysql and set the database */
September 9th, 2007 at 14:44
好文, 谢谢,强烈支持一下