add support in catdb to dump the content of a specific nodes tdb instead
authorRonnie Sahlberg <sahlberg@ronnie>
Sat, 5 May 2007 19:53:15 +0000 (05:53 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Sat, 5 May 2007 19:53:15 +0000 (05:53 +1000)
of traversing the full cluster.
this makes it easier to debug recovery

update the test script for recovery to reflect the newish signatures to
ctdb_control

the catdb control does still segfault however when there are missing
nodes in the cluster   as there are toward the end of the recovery test

tests/recover.sh
tools/ctdb_control.c

index 3267699ffde3f3a6ace6a74cc997ae7d3008454c..09d35114c012bc6178ca13105390fd464b5c5c13 100755 (executable)
@@ -26,14 +26,13 @@ echo
 echo
 echo "Printing all databases on all nodes. they should all be empty"
 echo "============================================================="
-bin/ctdb_control --socket=/tmp/ctdb.socket getdbmap 0 | egrep "^dbid:" | sed -e "s/^dbid://" -e "s/ .*$//" | while read DB; do
+bin/ctdb_control --socket=/tmp/ctdb.socket getdbmap 0 | egrep "^dbid:" | sed -e "s/^.*name://" -e "s/ .*$//" | while read DBNAME; do
        seq 0 3 | while read NODE; do
-               echo "Content of DB:$DB NODE:$NODE :"
-               bin/ctdb_control --socket=/tmp/ctdb.socket catdb $NODE $DB
+               echo "Content of DBNAME:$DBNAME NODE:$NODE :"
+               bin/ctdb_control --socket=/tmp/ctdb.socket catdb $DBNAME $NODE
        done
 done
 
-
 echo
 echo
 echo "Populating the databases"
@@ -60,10 +59,10 @@ echo
 echo
 echo "Printing all databases on all nodes. there should be a record there"
 echo "============================================================="
-bin/ctdb_control --socket=/tmp/ctdb.socket getdbmap 0 | egrep "^dbid:" | sed -e "s/^dbid://" -e "s/ .*$//" | while read DB; do
+bin/ctdb_control --socket=/tmp/ctdb.socket getdbmap 0 | egrep "^dbid:" | sed -e "s/^.*name://" -e "s/ .*$//" | while read DBNAME; do
        seq 0 3 | while read NODE; do
-               echo "Content of DB:$DB NODE:$NODE :"
-               bin/ctdb_control --socket=/tmp/ctdb.socket catdb $NODE $DB
+               echo "Content of DBNAME:$DBNAME NODE:$NODE :"
+               bin/ctdb_control --socket=/tmp/ctdb.socket catdb $DBNAME $NODE
        done
 done
 
@@ -88,14 +87,18 @@ echo "The databases should be the same now on all nodes"
 echo "and the record will have been migrated to node 0"
 echo "================================================="
 echo "Node 1:"
-bin/ctdb_control --socket=/tmp/ctdb.socket catdb 1 0x220c2a7b
+bin/ctdb_control --socket=/tmp/ctdb.socket catdb test4.tdb 1
 echo "Node 2:"
-bin/ctdb_control --socket=/tmp/ctdb.socket catdb 2 0x220c2a7b
+bin/ctdb_control --socket=/tmp/ctdb.socket catdb test4.tdb 2
 echo "Node 3:"
-bin/ctdb_control --socket=/tmp/ctdb.socket catdb 3 0x220c2a7b
+bin/ctdb_control --socket=/tmp/ctdb.socket catdb test4.tdb 3
 echo "nodemap:"
 bin/ctdb_control --socket=/tmp/ctdb.socket getnodemap 3
 
+echo
+echo
+echo "Traverse the cluster and dump the database"
+bin/ctdb_control --socket=/tmp/ctdb.socket catdb test4.tdb
 
 
 #leave the ctdb daemons running   so one can look at the box in more detail
index d35645aef2f03cbd0fe600022f360508f48ab0f4..a6d8181ffbc6c3033cc9e76b506b1edf5b6dae34 100644 (file)
@@ -46,7 +46,7 @@ static void usage(void)
                "  getdbmap <vnn>                     lists databases on a node\n"
                "  getnodemap <vnn>                   lists nodes known to a ctdb daemon\n"
                "  createdb <vnn> <dbname>            create a database\n"
-               "  catdb <dbname>                     lists all keys/data in a db\n"
+               "  catdb <dbname> [vnn]               lists all keys/data in a db\n"
                "  cpdb <fromvnn> <tovnn> <dbid>      lists all keys in a remote tdb\n"
                "  setdmaster <vnn> <dbid> <dmaster>  sets new dmaster for all records in the database\n"
                "  cleardb <vnn> <dbid>               deletes all records in a db\n"
@@ -347,9 +347,11 @@ static int control_recover(struct ctdb_context *ctdb, int argc, const char **arg
        }
        for (i=0;i<dbmap->num;i++) {
                const char *path;
+               const char *name;
 
                ctdb_ctrl_getdbpath(ctdb, timeval_current_ofs(1, 0), CTDB_CURRENT_NODE, dbmap->dbids[i], ctdb, &path);
-               printf("dbid:0x%08x path:%s\n", dbmap->dbids[i], path);
+               ctdb_ctrl_getdbname(ctdb, timeval_current_ofs(1, 0), CTDB_CURRENT_NODE, dbmap->dbids[i], ctdb, &name);
+               printf("dbid:0x%08x name:%s path:%s\n", dbmap->dbids[i], name, path);
        }
 
        /* 5: pull all records from all other nodes across to this node
@@ -586,6 +588,7 @@ static int control_catdb(struct ctdb_context *ctdb, int argc, const char **argv)
 {
        const char *db_name;
        struct ctdb_db_context *ctdb_db;
+       uint32_t vnn;
        int ret;
 
        if (argc < 1) {
@@ -599,12 +602,35 @@ static int control_catdb(struct ctdb_context *ctdb, int argc, const char **argv)
                return -1;
        }
 
-       ret = ctdb_dump_db(ctdb_db, stdout);
-       if (ret == -1) {
-               printf("Unable to dump database\n");
-               return -1;
-       }
+       if (argc==1) {
+               /* traverse and dump the cluster tdb */
+               ret = ctdb_dump_db(ctdb_db, stdout);
+               if (ret == -1) {
+                       printf("Unable to dump database\n");
+                       return -1;
+               }
+       } else {
+               struct ctdb_key_list keys;
+               int i;
 
+               /* dump only the local tdb of a specific node */
+               vnn     = strtoul(argv[1], NULL, 0);
+               ret = ctdb_ctrl_pulldb(ctdb, vnn, ctdb_db->db_id, CTDB_LMASTER_ANY, ctdb, &keys);
+               if (ret == -1) {
+                       printf("Unable to pull remote database\n");
+                       return -1;
+               }
+               for(i=0;i<keys.num;i++){
+                       char *keystr, *datastr;
+
+                       keystr  = hex_encode(ctdb, keys.keys[i].dptr, keys.keys[i].dsize);
+                       datastr = hex_encode(ctdb, keys.data[i].dptr, keys.data[i].dsize);
+
+                       printf("rsn:%llu lmaster:%d dmaster:%d key:%s data:%s\n", keys.headers[i].rsn, keys.lmasters[i], keys.headers[i].dmaster, keystr, datastr); 
+                       ret++;
+               }
+       }
+       
        talloc_free(ctdb_db);
 
        printf("Dumped %d records\n", ret);
@@ -663,9 +689,11 @@ static int control_getdbmap(struct ctdb_context *ctdb, int argc, const char **ar
        printf("Number of databases:%d\n", dbmap->num);
        for(i=0;i<dbmap->num;i++){
                const char *path;
+               const char *name;
 
                ctdb_ctrl_getdbpath(ctdb, timeval_current_ofs(1, 0), CTDB_CURRENT_NODE, dbmap->dbids[i], ctdb, &path);
-               printf("dbid:0x%08x path:%s\n", dbmap->dbids[i], path);
+               ctdb_ctrl_getdbname(ctdb, timeval_current_ofs(1, 0), CTDB_CURRENT_NODE, dbmap->dbids[i], ctdb, &name);
+               printf("dbid:0x%08x name:%s path:%s\n", dbmap->dbids[i], name, path);
        }
 
        return 0;