Make KILLTCP structure a child of VNN so that it is freed at the same time
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 26 Feb 2012 20:18:19 +0000 (07:18 +1100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 26 Feb 2012 20:21:26 +0000 (07:21 +1100)
the referenced VNN structure is.

Also, remove the circular reference between the two objects KIPPCTP and VNN

(This used to be ctdb commit 02b62482164a3c69715949074feb7f191a29d534)

ctdb/server/ctdb_takeover.c

index 830b751b03625efd20ab5f0ca9f78515c440c62e..c91d2f7de523d2618a9af026cce5b69888608d77 100644 (file)
@@ -2934,9 +2934,25 @@ static void ctdb_tickle_sentenced_connections(struct event_context *ev, struct t
  */
 static int ctdb_killtcp_destructor(struct ctdb_kill_tcp *killtcp)
 {
-       if (killtcp->vnn) {
-               killtcp->vnn->killtcp = NULL;
+       struct ctdb_vnn *tmpvnn;
+
+       /* verify that this vnn is still active */
+       for (tmpvnn = killtcp->ctdb->vnn; tmpvnn; tmpvnn = tmpvnn->next) {
+               if (tmpvnn == killtcp->vnn) {
+                       break;
+               }
+       }
+
+       if (tmpvnn == NULL) {
+               return 0;
        }
+
+       if (killtcp->vnn->killtcp != killtcp) {
+               return 0;
+       }
+
+       killtcp->vnn->killtcp = NULL;
+
        return 0;
 }
 
@@ -2991,7 +3007,7 @@ static int ctdb_killtcp_add_connection(struct ctdb_context *ctdb,
           a new structure
         */
        if (killtcp == NULL) {
-               killtcp = talloc_zero(ctdb, struct ctdb_kill_tcp);
+               killtcp = talloc_zero(vnn, struct ctdb_kill_tcp);
                CTDB_NO_MEMORY(ctdb, killtcp);
 
                killtcp->vnn         = vnn;