ctdb-tools: Use traverse api to re-implement ctdb catdb command
authorAmitay Isaacs <amitay@gmail.com>
Tue, 4 Apr 2017 08:30:01 +0000 (18:30 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 7 Jun 2017 14:05:26 +0000 (16:05 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/tools/ctdb.c

index a55812a077ef15c842a6b747046bd4f0b59f7d21..4a255be289d8e035ce1d13992c02adfdb55322fa 100644 (file)
@@ -2083,51 +2083,6 @@ static int dump_record(uint32_t reqid, struct ctdb_ltdb_header *header,
        return 0;
 }
 
-struct traverse_state {
-       TALLOC_CTX *mem_ctx;
-       bool done;
-       ctdb_rec_parser_func_t func;
-       struct dump_record_state sub_state;
-};
-
-static void traverse_handler(uint64_t srvid, TDB_DATA data, void *private_data)
-{
-       struct traverse_state *state = (struct traverse_state *)private_data;
-       struct ctdb_rec_data *rec;
-       struct ctdb_ltdb_header header;
-       int ret;
-
-       ret = ctdb_rec_data_pull(data.dptr, data.dsize, state->mem_ctx, &rec);
-       if (ret != 0) {
-               return;
-       }
-
-       if (rec->key.dsize == 0 && rec->data.dsize == 0) {
-               talloc_free(rec);
-               /* end of traverse */
-               state->done = true;
-               return;
-       }
-
-       ret = ctdb_ltdb_header_extract(&rec->data, &header);
-       if (ret != 0) {
-               talloc_free(rec);
-               return;
-       }
-
-       if (rec->data.dsize == 0) {
-               talloc_free(rec);
-               return;
-       }
-
-       ret = state->func(rec->reqid, &header, rec->key, rec->data,
-                         &state->sub_state);
-       talloc_free(rec);
-       if (ret != 0) {
-               state->done = true;
-       }
-}
-
 static int control_catdb(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                         int argc, const char **argv)
 {
@@ -2135,8 +2090,7 @@ static int control_catdb(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
        const char *db_name;
        uint32_t db_id;
        uint8_t db_flags;
-       struct ctdb_traverse_start_ext traverse;
-       struct traverse_state state;
+       struct dump_record_state state;
        int ret;
 
        if (argc != 1) {
@@ -2154,44 +2108,15 @@ static int control_catdb(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,
                return ret;
        }
 
-       /* Valgrind fix */
-       ZERO_STRUCT(traverse);
-
-       traverse.db_id = db_id;
-       traverse.reqid = 0;
-       traverse.srvid = next_srvid(ctdb);
-       traverse.withemptyrecords = false;
-
-       state.mem_ctx = mem_ctx;
-       state.done = false;
-       state.func = dump_record;
-       state.sub_state.count = 0;
-
-       ret = ctdb_client_set_message_handler(ctdb->ev, ctdb->client,
-                                             traverse.srvid,
-                                             traverse_handler, &state);
-       if (ret != 0) {
-               return ret;
-       }
-
-       ret = ctdb_ctrl_traverse_start_ext(mem_ctx, ctdb->ev, ctdb->client,
-                                          ctdb->cmd_pnn, TIMEOUT(),
-                                          &traverse);
-       if (ret != 0) {
-               return ret;
-       }
-
-       ctdb_client_wait(ctdb->ev, &state.done);
+       state.count = 0;
 
-       printf("Dumped %u records\n", state.sub_state.count);
+       ret = ctdb_db_traverse(mem_ctx, ctdb->ev, ctdb->client, db,
+                              ctdb->cmd_pnn, TIMEOUT(),
+                              dump_record, &state);
 
-       ret = ctdb_client_remove_message_handler(ctdb->ev, ctdb->client,
-                                                traverse.srvid, &state);
-       if (ret != 0) {
-               return ret;
-       }
+       printf("Dumped %u records\n", state.count);
 
-       return 0;
+       return ret;
 }
 
 static int control_cattdb(TALLOC_CTX *mem_ctx, struct ctdb_context *ctdb,