summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/auditordb/plugin_auditordb_postgres.c23
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c46
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,8 +1469,11 @@ 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);
@@ -1478,33 +1481,6 @@ 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.
*
@@ -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)