diff options
| author | Marko Kreen | 2012-04-13 10:21:31 +0000 |
|---|---|---|
| committer | Marko Kreen | 2012-04-13 10:21:31 +0000 |
| commit | cb9e54f9b223a4943a84940eee887a6e5862027d (patch) | |
| tree | d758548a7cba99491019d4fafd95a071af846baf | |
| parent | f4c888d72fc6562d56f30627d32199d7791b5c6d (diff) | |
Proper init and cleanup for ConnectionState
Otherwise there can be garbage in struct
| -rw-r--r-- | src/cluster.c | 18 | ||||
| -rw-r--r-- | src/execute.c | 19 | ||||
| -rw-r--r-- | src/plproxy.h | 1 |
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); |
