Proper init and cleanup for ConnectionState
authorMarko Kreen <markokr@gmail.com>
Fri, 13 Apr 2012 10:21:31 +0000 (13:21 +0300)
committerMarko Kreen <markokr@gmail.com>
Fri, 13 Apr 2012 10:21:31 +0000 (13:21 +0300)
Otherwise there can be garbage in struct

src/cluster.c
src/execute.c
src/plproxy.h

index caff10e281ddf20606f3184cc0ec7f4adaf76b89..c7fab56ba136617a7e02c26b2f965f011e4aaea6 100644 (file)
@@ -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)
index 6b546c29b4206c2dc8d52fbf77a9addc13df8f1a..926baa3be7afd4863a5327af4e171b9c9b3e243e 100644 (file)
@@ -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)
index b49cae1cb34a6f1fa4ec23914a99dd6c3efe2c57..ff06da8a843fc2d06283853bbf7dcd4a631a9750 100644 (file)
@@ -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);