dovecot-2.1: mysql: If query fails with "MySQL server gone away"...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jan 20 18:44:57 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/a817cfc3979d
changeset: 13971:a817cfc3979d
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jan 20 18:44:49 2012 +0200
description:
mysql: If query fails with "MySQL server gone away", log also how long it idled.

diffstat:

 src/lib-sql/driver-mysql.c |  25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)

diffs (64 lines):

diff -r 58556a90259f -r a817cfc3979d src/lib-sql/driver-mysql.c
--- a/src/lib-sql/driver-mysql.c	Fri Jan 20 18:28:40 2012 +0200
+++ b/src/lib-sql/driver-mysql.c	Fri Jan 20 18:44:49 2012 +0200
@@ -21,6 +21,7 @@
 	const char *ssl_cert, *ssl_key, *ssl_ca, *ssl_ca_path, *ssl_cipher;
 	const char *option_file, *option_group;
 	unsigned int port, client_flags;
+	time_t last_success;
 
 	MYSQL *mysql;
 	unsigned int next_query_connection;
@@ -128,6 +129,7 @@
 		i_info("%s: Connected to database %s%s", mysql_prefix(db),
 		       db->dbname, db->ssl_set ? " using SSL" : "");
 
+		db->last_success = ioloop_time;
 		sql_db_set_state(&db->api, SQL_DB_STATE_IDLE);
 		return 1;
 	}
@@ -354,6 +356,7 @@
 {
 	struct mysql_result *result = (struct mysql_result *)_result;
 	struct mysql_db *db = (struct mysql_db *)_result->db;
+	int ret;
 
 	if (result->result == NULL) {
 		/* no results */
@@ -362,9 +365,14 @@
 
 	result->row = mysql_fetch_row(result->result);
 	if (result->row != NULL)
-		return 1;
-
-	return mysql_errno(db->mysql) != 0 ? -1 : 0;
+		ret = 1;
+	else {
+		if (mysql_errno(db->mysql) != 0)
+			return -1;
+		ret = 0;
+	}
+	db->last_success = ioloop_time;
+	return ret;
 }
 
 static void driver_mysql_result_fetch_fields(struct mysql_result *result)
@@ -454,8 +462,17 @@
 static const char *driver_mysql_result_get_error(struct sql_result *_result)
 {
 	struct mysql_db *db = (struct mysql_db *)_result->db;
+	const char *errstr;
+	unsigned int idle_time;
 
-	return mysql_error(db->mysql);
+	errstr = mysql_error(db->mysql);
+	if (mysql_errno(db->mysql) == CR_SERVER_GONE_ERROR &&
+	    db->last_success != 0) {
+		idle_time = ioloop_time - db->last_success;
+		errstr = t_strdup_printf("%s (idled for %u secs)",
+					 errstr, idle_time);
+	}
+	return errstr;
 }
 
 static struct sql_transaction_context *


More information about the dovecot-cvs mailing list