summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2012-04-13 10:21:31 +0000
committerMarko Kreen2012-04-13 10:21:31 +0000
commitcb9e54f9b223a4943a84940eee887a6e5862027d (patch)
treed758548a7cba99491019d4fafd95a071af846baf
parentf4c888d72fc6562d56f30627d32199d7791b5c6d (diff)
Proper init and cleanup for ConnectionState
Otherwise there can be garbage in struct
-rw-r--r--src/cluster.c18
-rw-r--r--src/execute.c19
-rw-r--r--src/plproxy.h1
3 files changed, 21 insertions, 17 deletions
diff --git a/src/cluster.c b/src/cluster.c
index caff10e..c7fab56 100644
--- a/src/cluster.c
+++ b/src/cluster.c
@@ -125,8 +125,8 @@ static int state_user_cmp(uintptr_t val, struct AANode *node)
static void state_free(struct AANode *node, void *arg)
{
ProxyConnectionState *state = container_of(node, ProxyConnectionState, node);
- if (state->db)
- PQfinish(state->db);
+
+ plproxy_disconnect(state);
memset(state, 0, sizeof(*state));
pfree(state);
}
@@ -901,11 +901,7 @@ static void inval_userinfo_state(struct AANode *node, void *arg)
ConnUserInfo *userinfo = arg;
if (cur->userinfo == userinfo && cur->db)
- {
- PQfinish(cur->db);
- cur->db = NULL;
- cur->state = C_NONE;
- }
+ plproxy_disconnect(cur);
}
static void inval_userinfo_conn(struct AANode *node, void *arg)
@@ -1205,7 +1201,7 @@ void plproxy_activate_connection(struct ProxyConnection *conn)
if (node) {
cur = container_of(node, ProxyConnectionState, node);
} else {
- cur = MemoryContextAlloc(cluster_mem, sizeof(*cur));
+ cur = MemoryContextAllocZero(cluster_mem, sizeof(*cur));
cur->userinfo = userinfo;
aatree_insert(&conn->userstate_tree, (uintptr_t)username, &cur->node);
}
@@ -1255,11 +1251,7 @@ static void clean_state(struct AANode *node, void *arg)
}
if (drop)
- {
- PQfinish(cur->db);
- cur->db = NULL;
- cur->state = C_NONE;
- }
+ plproxy_disconnect(cur);
}
static void clean_conn(struct AANode *node, void *arg)
diff --git a/src/execute.c b/src/execute.c
index 6b546c2..926baa3 100644
--- a/src/execute.c
+++ b/src/execute.c
@@ -416,10 +416,7 @@ prepare_conn(ProxyFunction *func, ProxyConnection *conn)
case C_QUERY_WRITE:
/* close rotten connection */
elog(NOTICE, "PL/Proxy: dropping stale conn");
- PQfinish(conn->cur->db);
- conn->cur->db = NULL;
- conn->cur->state = C_NONE;
- conn->cur->tuning = 0;
+ plproxy_disconnect(conn->cur);
case C_NONE:
break;
}
@@ -1157,6 +1154,20 @@ plproxy_clean_results(ProxyCluster *cluster)
/* conn state checks are done in prepare_conn */
}
+/* Drop one connection */
+void plproxy_disconnect(ProxyConnectionState *cur)
+{
+ if (cur->db)
+ PQfinish(cur->db);
+ cur->db = NULL;
+ cur->state = C_NONE;
+ cur->tuning = 0;
+ cur->connect_time = 0;
+ cur->query_time = 0;
+ cur->same_ver = 0;
+ cur->tuning = 0;
+}
+
/* Select partitions and execute query on them */
void
plproxy_exec(ProxyFunction *func, FunctionCallInfo fcinfo)
diff --git a/src/plproxy.h b/src/plproxy.h
index b49cae1..ff06da8 100644
--- a/src/plproxy.h
+++ b/src/plproxy.h
@@ -403,6 +403,7 @@ ProxyFunction *plproxy_compile(FunctionCallInfo fcinfo, bool validate);
/* execute.c */
void plproxy_exec(ProxyFunction *func, FunctionCallInfo fcinfo);
void plproxy_clean_results(ProxyCluster *cluster);
+void plproxy_disconnect(ProxyConnectionState *cur);
/* scanner.c */
int plproxy_yyget_lineno(void);