From 4c9c55e15f35474f53f11659e796c63b1c34e884 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 28 May 2010 11:47:42 +0100 Subject: [PATCH] lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak. --HG-- branch : HEAD --- src/lib-sql/driver-mysql.c | 1 + src/lib-sql/driver-pgsql.c | 3 +++ src/lib-sql/driver-sqlite.c | 1 + src/lib-sql/driver-sqlpool.c | 3 ++- src/lib-sql/sql-api-private.h | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lib-sql/driver-mysql.c b/src/lib-sql/driver-mysql.c index 849e890133..cfb00e93ff 100644 --- a/src/lib-sql/driver-mysql.c +++ b/src/lib-sql/driver-mysql.c @@ -203,6 +203,7 @@ static void driver_mysql_deinit_v(struct sql_db *_db) { struct mysql_db *db = (struct mysql_db *)_db; + _db->no_reconnect = TRUE; sql_db_set_state(&db->api, SQL_DB_STATE_DISCONNECTED); mysql_close(db->mysql); diff --git a/src/lib-sql/driver-pgsql.c b/src/lib-sql/driver-pgsql.c index bd8a090bd6..903d760e87 100644 --- a/src/lib-sql/driver-pgsql.c +++ b/src/lib-sql/driver-pgsql.c @@ -197,7 +197,9 @@ static void driver_pgsql_disconnect(struct sql_db *_db) { struct pgsql_db *db = (struct pgsql_db *)_db; + _db->no_reconnect = TRUE; driver_pgsql_close(db); + _db->no_reconnect = FALSE; } static struct sql_db *driver_pgsql_init_v(const char *connect_string) @@ -217,6 +219,7 @@ static void driver_pgsql_deinit_v(struct sql_db *_db) if (db->cur_result != NULL && db->cur_result->to != NULL) result_finish(db->cur_result); + _db->no_reconnect = TRUE; driver_pgsql_close(db); i_free(db->error); i_free(db->connect_string); diff --git a/src/lib-sql/driver-sqlite.c b/src/lib-sql/driver-sqlite.c index 99bb5c5c4f..09f2e7da5f 100644 --- a/src/lib-sql/driver-sqlite.c +++ b/src/lib-sql/driver-sqlite.c @@ -88,6 +88,7 @@ static void driver_sqlite_deinit_v(struct sql_db *_db) { struct sqlite_db *db = (struct sqlite_db *)_db; + _db->no_reconnect = TRUE; sql_db_set_state(&db->api, SQL_DB_STATE_DISCONNECTED); sqlite3_close(db->sqlite); diff --git a/src/lib-sql/driver-sqlpool.c b/src/lib-sql/driver-sqlpool.c index 32e8561323..192666e899 100644 --- a/src/lib-sql/driver-sqlpool.c +++ b/src/lib-sql/driver-sqlpool.c @@ -188,7 +188,8 @@ sqlpool_state_changed(struct sql_db *conndb, enum sql_db_state prev_state, } if (prev_state == SQL_DB_STATE_CONNECTING && - conndb->state == SQL_DB_STATE_DISCONNECTED) { + conndb->state == SQL_DB_STATE_DISCONNECTED && + !conndb->no_reconnect) { /* connect failed */ if (conndb->connect_failure_count > 0) { /* increase delay between reconnections to this diff --git a/src/lib-sql/sql-api-private.h b/src/lib-sql/sql-api-private.h index 59db2b3112..e965db5ff0 100644 --- a/src/lib-sql/sql-api-private.h +++ b/src/lib-sql/sql-api-private.h @@ -97,6 +97,8 @@ struct sql_db { unsigned int connect_delay; unsigned int connect_failure_count; struct timeout *to_reconnect; + + unsigned int no_reconnect:1; }; struct sql_result_vfuncs { -- 2.47.3