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