From 5d6dfde04413dd08d3056a724ace0cb6c99d4117 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Jul 2017 23:33:57 +0200 Subject: fix #4955 in auditordb, clean up fix in exchangedb --- src/auditordb/plugin_auditordb_postgres.c | 23 +++++++++++++-- src/exchangedb/plugin_exchangedb_postgres.c | 46 +++++++++++------------------ 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c index 38894c8c8..4862cf204 100644 --- a/src/auditordb/plugin_auditordb_postgres.c +++ b/src/auditordb/plugin_auditordb_postgres.c @@ -821,8 +821,11 @@ static void db_conn_destroy (void *cls) { struct TALER_AUDITORDB_Session *session = cls; - PGconn *db_conn = session->conn; + PGconn *db_conn; + if (NULL == session) + return; + db_conn = session->conn; if (NULL != db_conn) PQfinish (db_conn); GNUNET_free (session); @@ -844,7 +847,23 @@ postgres_get_session (void *cls) struct TALER_AUDITORDB_Session *session; if (NULL != (session = pthread_getspecific (pc->db_conn_threadlocal))) - return session; + { + if (CONNECTION_BAD == PQstatus (session->conn)) + { + /** + * Reset the thread-local database-handle. Disconnects from the + * DB. Needed after the database server restarts as we need to + * properly reconnect. */ + GNUNET_assert (0 == pthread_setspecific (pc->db_conn_threadlocal, + NULL)); + PQfinish (session->conn); + GNUNET_free (session); + } + else + { + return session; + } + } db_conn = connect_to_postgres (pc); if (NULL == db_conn) return NULL; diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index de3c783ea..8b3fe7f03 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -1469,41 +1469,17 @@ static void db_conn_destroy (void *cls) { struct TALER_EXCHANGEDB_Session *session = cls; - PGconn *db_conn = session->conn; + PGconn *db_conn; + if (NULL == session) + return; + db_conn = session->conn; if (NULL != db_conn) PQfinish (db_conn); GNUNET_free (session); } -/** - * Reset the thread-local database-handle. Disconnects from the DB. - * Needed after the database server restarts as we need to properly - * reconnect. - * - * @param cls the `struct PostgresClosure` with the plugin-specific state - * @return the database connection, or NULL on error - */ -static void -postgres_reset_session (void *cls) -{ - struct PostgresClosure *pc = cls; - struct TALER_EXCHANGEDB_Session *session; - - if (NULL != (session = pthread_getspecific (pc->db_conn_threadlocal))) - return; - if (0 != pthread_setspecific (pc->db_conn_threadlocal, - NULL)) - { - GNUNET_break (0); - return; - } - PQfinish (session->conn); - GNUNET_free (session); -} - - /** * Get the thread-local database-handle. * Connect to the db if the connection does not exist yet. @@ -1521,9 +1497,21 @@ postgres_get_session (void *cls) if (NULL != (session = pthread_getspecific (pc->db_conn_threadlocal))) { if (CONNECTION_BAD == PQstatus (session->conn)) - postgres_reset_session (pc); + { + /** + * Reset the thread-local database-handle. Disconnects from the + * DB. Needed after the database server restarts as we need to + * properly reconnect. */ + GNUNET_assert (0 == + pthread_setspecific (pc->db_conn_threadlocal, + NULL)); + PQfinish (session->conn); + GNUNET_free (session); + } else + { return session; + } } db_conn = GNUNET_PQ_connect (pc->connection_cfg_str); if (NULL == db_conn) -- cgit v1.2.3