From: Marko Kreen Date: Fri, 13 Apr 2012 10:21:31 +0000 (+0300) Subject: Proper init and cleanup for ConnectionState X-Git-Tag: plproxy_2_4~3 X-Git-Url: http://git.postgresql.org/gitweb/edit?a=commitdiff_plain;h=cb9e54f9b223a4943a84940eee887a6e5862027d;p=plproxy.git Proper init and cleanup for ConnectionState Otherwise there can be garbage in struct --- 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);