------------------------------------------------------------
revno: 335
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: tridge
timestamp: Wed 2007-05-23 20:06:37 +1000
message:
  fixed some memory leaks on the traverse code
modified:
  common/ctdb.c                  ctdb.c-20061127094323-t50f58d65iaao5of-2
  common/ctdb_traverse.c         
ctdb_traverse.c-20070503021550-ztfs5rwx8jfm8qqx-1
  tools/ctdb_control.c           
ctdb_control.c-20070426122705-9ehj1l5lu2gn9kuj-1
=== modified file 'common/ctdb.c'
--- a/common/ctdb.c     2007-05-23 04:50:41 +0000
+++ b/common/ctdb.c     2007-05-23 10:06:37 +0000
@@ -437,6 +437,7 @@
 {
        struct queue_next *q = talloc_get_type(private_data, struct queue_next);
        ctdb_input_pkt(q->ctdb, q->hdr);
+       talloc_free(q);
 }      
 
 /*

=== modified file 'common/ctdb_traverse.c'
--- a/common/ctdb_traverse.c    2007-05-17 13:23:41 +0000
+++ b/common/ctdb_traverse.c    2007-05-23 10:06:37 +0000
@@ -277,6 +277,7 @@
        struct traverse_all_state *state = talloc_get_type(p, struct 
traverse_all_state);
        int ret;
        struct ctdb_rec_data *d;
+       TDB_DATA cdata;
 
        d = ctdb_marshall_record(state, state->reqid, key, data);
        if (d == NULL) {
@@ -285,14 +286,19 @@
                return;
        }
 
-       data.dptr = (uint8_t *)d;
-       data.dsize = d->length;
+       cdata.dptr = (uint8_t *)d;
+       cdata.dsize = d->length;
 
        ret = ctdb_daemon_send_control(state->ctdb, state->srcnode, 0, 
CTDB_CONTROL_TRAVERSE_DATA,
-                                      0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, 
NULL);
+                                      0, CTDB_CTRL_FLAG_NOREPLY, cdata, NULL, 
NULL);
        if (ret != 0) {
                DEBUG(0,("Failed to send traverse data\n"));
        }
+
+       if (key.dsize == 0 && data.dsize == 0) {
+               /* we're done */
+               talloc_free(state);
+       }
 }
 
 /*
@@ -397,6 +403,7 @@
 {
        struct traverse_start_state *state;
        struct ctdb_rec_data *d;
+       TDB_DATA cdata;
 
        state = talloc_get_type(p, struct traverse_start_state);
 
@@ -405,10 +412,10 @@
                return;
        }
 
-       data.dptr = (uint8_t *)d;
-       data.dsize = d->length;
+       cdata.dptr = (uint8_t *)d;
+       cdata.dsize = d->length;
 
-       ctdb_dispatch_message(state->ctdb, state->srvid, data);
+       ctdb_dispatch_message(state->ctdb, state->srvid, cdata);
        if (key.dsize == 0 && data.dsize == 0) {
                /* end of traverse */
                talloc_free(state);

=== modified file 'tools/ctdb_control.c'
--- a/tools/ctdb_control.c      2007-05-20 23:24:34 +0000
+++ b/tools/ctdb_control.c      2007-05-23 10:06:37 +0000
@@ -59,6 +59,7 @@
                "  setmonmode <vnn> <mode>            set monitoring mode\n"
                "  attach <dbname>                    attach a database\n"
                "  getpid <vnn>                       get the pid of a ctdb 
daemon\n"
+               "  dumpmemory <vnn|all>               dump memory map to log\n"
                "  shutdown <vnn>                     shutdown a remote ctdb\n"
                "  freeze <vnn|all>                   freeze a node\n"
                "  thaw <vnn|all>                     thaw a node\n"

Reply via email to