From f9950799fc21c6847d13f93aaec2cd6a555d546a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 4 Jul 2017 23:28:03 +0200 Subject: eliminate dead macros --- src/exchangedb/plugin_exchangedb_postgres.c | 34 ++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/exchangedb/plugin_exchangedb_postgres.c') diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index b6241c8f..de3c783e 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -1477,6 +1477,33 @@ db_conn_destroy (void *cls) } +/** + * 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. @@ -1492,7 +1519,12 @@ postgres_get_session (void *cls) struct TALER_EXCHANGEDB_Session *session; if (NULL != (session = pthread_getspecific (pc->db_conn_threadlocal))) - return session; + { + if (CONNECTION_BAD == PQstatus (session->conn)) + postgres_reset_session (pc); + else + return session; + } db_conn = GNUNET_PQ_connect (pc->connection_cfg_str); if (NULL == db_conn) return NULL; -- cgit v1.2.3