From bfdeda30ee0e359f06dd5714864f8beae22b0736 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Wed, 20 Jul 2011 11:50:14 +1000 Subject: [PATCH] ReadOnly: Add test tool to validate the functions to manipulate and enumerate the bitmap of nodes to where we have readonly delegations --- Makefile.in | 7 +- tests/src/ctdb_trackingdb_test.c | 136 +++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 tests/src/ctdb_trackingdb_test.c diff --git a/Makefile.in b/Makefile.in index 0cce22e0..d2d6888c 100755 --- a/Makefile.in +++ b/Makefile.in @@ -67,7 +67,8 @@ CTDB_SERVER_OBJ = server/ctdbd.o server/ctdb_daemon.o server/ctdb_lockwait.o \ $(CTDB_CLIENT_OBJ) $(CTDB_TCP_OBJ) @INFINIBAND_WRAPPER_OBJ@ TEST_BINS=tests/bin/ctdb_bench tests/bin/ctdb_fetch tests/bin/ctdb_fetch_one \ - tests/bin/ctdb_fetch_lock_once tests/bin/ctdb_store \ + tests/bin/ctdb_fetch_lock_once \ + tests/bin/ctdb_store tests/bin/ctdb_trackingdb_test \ tests/bin/ctdb_randrec tests/bin/ctdb_persistent \ tests/bin/ctdb_traverse tests/bin/rb_test tests/bin/ctdb_transaction \ tests/bin/ctdb_takeover_tests @@ -171,6 +172,10 @@ tests/bin/ctdb_fetch_lock_once: $(CTDB_CLIENT_OBJ) tests/src/ctdb_fetch_lock_onc @echo Linking $@ @$(CC) $(CFLAGS) -o $@ tests/src/ctdb_fetch_lock_once.o $(CTDB_CLIENT_OBJ) $(LIB_FLAGS) +tests/bin/ctdb_trackingdb_test: $(CTDB_CLIENT_OBJ) tests/src/ctdb_trackingdb_test.o + @echo Linking $@ + @$(CC) $(CFLAGS) -o $@ tests/src/ctdb_trackingdb_test.o $(CTDB_CLIENT_OBJ) $(LIB_FLAGS) + tests/bin/ctdb_store: $(CTDB_CLIENT_OBJ) tests/src/ctdb_store.o @echo Linking $@ @$(CC) $(CFLAGS) -o $@ tests/src/ctdb_store.o $(CTDB_CLIENT_OBJ) $(LIB_FLAGS) diff --git a/tests/src/ctdb_trackingdb_test.c b/tests/src/ctdb_trackingdb_test.c new file mode 100644 index 00000000..77eb7b9f --- /dev/null +++ b/tests/src/ctdb_trackingdb_test.c @@ -0,0 +1,136 @@ +/* + simple trackingdb test tool + + This program is used to test the funcitons to manipulate and enumerate + the trackingdb records : + ctdb_trackingdb_add_pnn() + ctdb_trackingdb_traverse() + + Copyright (C) Ronnie Sahlberg 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include +#include +#include "includes.h" +#include "lib/tevent/tevent.h" +#include "system/filesys.h" +#include "popt.h" +#include "cmdline.h" +#include "ctdb_private.h" +#include "db_wrap.h" + +#define MAXINDEX 64 +char indices[MAXINDEX]; + +void vn_cb(struct ctdb_context *ctdb, uint32_t pnn, void *private_data) +{ + char *ind = private_data; + + printf("Callback for node %d\n", pnn); + if (ind[pnn] == 0) { + printf("ERROR, node %d from callback was never added\n", pnn); + exit(10); + } + ind[pnn] = 0; +} + +void verify_nodes(struct ctdb_context *ctdb, TDB_DATA data) +{ + int i; + + printf("Verify the nodes\n"); + ctdb_trackingdb_traverse(ctdb, data, vn_cb, indices); + for(i = 0; i < MAXINDEX; i++) { + if (indices[i] != 0) { + printf("Callback for %d was never invoked\n", i); + exit(0); + } + } +} + + + +void add_node(struct ctdb_context *ctdb, TDB_DATA *data, int pnn) +{ + int i; + + printf("Add node %d\n", pnn); + if (ctdb_trackingdb_add_pnn(ctdb, data, pnn)) { + printf("Failed to add tracking db data\n"); + exit(10); + } + indices[pnn] = 1; +} + +static void trackdb_test(struct ctdb_context *ctdb) +{ + TDB_DATA data = {NULL,0}; + int i; + + printf("Add 10 nodes\n"); + srandom(time(NULL)); + for(i=0; i<10; i++) { + add_node(ctdb, &data, random()%MAXINDEX); + } + + verify_nodes(ctdb, data); + printf("OK all seems well\n"); +} + +/* + main program +*/ +int main(int argc, const char *argv[]) +{ + struct ctdb_context *ctdb; + + struct poptOption popt_options[] = { + POPT_AUTOHELP + POPT_CTDB_CMDLINE + POPT_TABLEEND + }; + int opt; + const char **extra_argv; + int extra_argc = 0; + poptContext pc; + struct event_context *ev; + + pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST); + + while ((opt = poptGetNextOpt(pc)) != -1) { + switch (opt) { + default: + fprintf(stderr, "Invalid option %s: %s\n", + poptBadOption(pc, 0), poptStrerror(opt)); + exit(1); + } + } + + /* setup the remaining options for the main program to use */ + extra_argv = poptGetArgs(pc); + if (extra_argv) { + extra_argv++; + while (extra_argv[extra_argc]) extra_argc++; + } + + ev = event_context_init(NULL); + + ctdb = ctdb_cmdline_client(ev); + + trackdb_test(ctdb); + + return 0; +} -- 2.34.1