X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftools%2Ftdbtorture.c;h=e9c793ac89f08d2b7c34898f5f1e1820efb5fa38;hp=3547d8038b7893749f83185c3c639058edea161a;hb=1f2fc8975204bdedcd3bd17a7410bf8f60783b0d;hpb=f2050233ad3b995baf239715457b53d64ebbf106 diff --git a/ccan/tdb/tools/tdbtorture.c b/ccan/tdb/tools/tdbtorture.c index 3547d803..e9c793ac 100644 --- a/ccan/tdb/tools/tdbtorture.c +++ b/ccan/tdb/tools/tdbtorture.c @@ -22,9 +22,7 @@ #define APPEND_PROB 6 #define TRANSACTION_PROB 10 #define TRANSACTION_PREPARE_PROB 2 -#if 0 #define LOCKSTORE_PROB 5 -#endif #define TRAVERSE_PROB 20 #define TRAVERSE_READ_PROB 20 #define TRAVERSE_MOD_PROB 100 @@ -37,6 +35,7 @@ static struct tdb_context *db; static int in_transaction; static int in_traverse; static int error_count; +static int always_transaction = 0; #ifdef PRINTF_ATTRIBUTE static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, const char *format, ...) PRINTF_ATTRIBUTE(3,4); @@ -122,8 +121,15 @@ static void addrec_db(void) data.dptr = (unsigned char *)d; data.dsize = dlen+1; +#if REOPEN_PROB + if (in_traverse == 0 && in_transaction == 0 && random() % REOPEN_PROB == 0) { + tdb_reopen_all(0); + goto next; + } +#endif + #if TRANSACTION_PROB - if (in_traverse == 0 && in_transaction == 0 && random() % TRANSACTION_PROB == 0) { + if (in_traverse == 0 && in_transaction == 0 && (always_transaction || random() % TRANSACTION_PROB == 0)) { if (tdb_transaction_start(db) != 0) { fatal("tdb_transaction_start failed"); } @@ -131,13 +137,11 @@ static void addrec_db(void) goto next; } if (in_traverse == 0 && in_transaction && random() % TRANSACTION_PROB == 0) { -#if 0 if (random() % TRANSACTION_PREPARE_PROB == 0) { if (tdb_transaction_prepare_commit(db) != 0) { fatal("tdb_transaction_prepare_commit failed"); } } -#endif if (tdb_transaction_commit(db) != 0) { fatal("tdb_transaction_commit failed"); } @@ -145,7 +149,6 @@ static void addrec_db(void) goto next; } -#if 0 if (in_traverse == 0 && in_transaction && random() % TRANSACTION_PROB == 0) { if (tdb_transaction_cancel(db) != 0) { fatal("tdb_transaction_cancel failed"); @@ -154,14 +157,6 @@ static void addrec_db(void) goto next; } #endif -#endif - -#if REOPEN_PROB - if (in_traverse == 0 && in_transaction == 0 && random() % REOPEN_PROB == 0) { - tdb_reopen_all(0); - goto next; - } -#endif #if DELETE_PROB if (random() % DELETE_PROB == 0) { @@ -237,7 +232,7 @@ static int traverse_fn(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, static void usage(void) { - printf("Usage: tdbtorture [-n NUM_PROCS] [-l NUM_LOOPS] [-s SEED] [-H HASH_SIZE]\n"); + printf("Usage: tdbtorture [-t] [-n NUM_PROCS] [-l NUM_LOOPS] [-s SEED] [-H HASH_SIZE]\n"); exit(0); } @@ -254,7 +249,7 @@ int main(int argc, char * const *argv) struct tdb_logging_context log_ctx; log_ctx.log_fn = tdb_log; - while ((c = getopt(argc, argv, "n:l:s:H:h")) != -1) { + while ((c = getopt(argc, argv, "n:l:s:H:th")) != -1) { switch (c) { case 'n': num_procs = strtol(optarg, NULL, 0); @@ -268,6 +263,9 @@ int main(int argc, char * const *argv) case 's': seed = strtol(optarg, NULL, 0); break; + case 't': + always_transaction = 1; + break; default: usage(); } @@ -293,8 +291,8 @@ int main(int argc, char * const *argv) } if (i == 0) { - printf("testing with %d processes, %d loops, %d hash_size, seed=%d\n", - num_procs, num_loops, hash_size, seed); + printf("testing with %d processes, %d loops, %d hash_size, seed=%d%s\n", + num_procs, num_loops, hash_size, seed, always_transaction ? " (all within transactions)" : ""); } srand(seed + i); @@ -306,8 +304,20 @@ int main(int argc, char * const *argv) if (error_count == 0) { tdb_traverse_read(db, NULL, NULL); + if (always_transaction) { + while (in_transaction) { + tdb_transaction_cancel(db); + in_transaction--; + } + if (tdb_transaction_start(db) != 0) + fatal("tdb_transaction_start failed"); + } tdb_traverse(db, traverse_fn, NULL); tdb_traverse(db, traverse_fn, NULL); + if (always_transaction) { + if (tdb_transaction_commit(db) != 0) + fatal("tdb_transaction_commit failed"); + } } tdb_close(db);