Browse Source

tdb2: update tools/speed.c, tools/tdbtool.c and tools/tdbtorture.c to new API

Rusty Russell 15 years ago
parent
commit
f82eddef12
3 changed files with 128 additions and 148 deletions
  1. 55 52
      ccan/tdb2/tools/speed.c
  2. 66 73
      ccan/tdb2/tools/tdbtool.c
  3. 7 23
      ccan/tdb2/tools/tdbtorture.c

+ 55 - 52
ccan/tdb2/tools/speed.c

@@ -103,6 +103,7 @@ int main(int argc, char *argv[])
 	struct tdb_context *tdb;
 	struct timeval start, stop;
 	union tdb_attribute seed, stats;
+	enum TDB_ERROR ecode;
 
 	/* Try to keep benchmarks even. */
 	seed.base.attr = TDB_ATTRIBUTE_SEED;
@@ -151,19 +152,19 @@ int main(int argc, char *argv[])
 		argc--;
 	}
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Add 1000 records. */
 	printf("Adding %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (i = 0; i < num; i++)
-		if (tdb_store(tdb, key, data, TDB_INSERT) != 0)
+		if ((ecode = tdb_store(tdb, key, data, TDB_INSERT)) != 0)
 			errx(1, "Inserting key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 
@@ -172,22 +173,23 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Finding 1000 records. */
 	printf("Finding %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (i = 0; i < num; i++) {
-		int *dptr;
-		dptr = (int *)tdb_fetch(tdb, key).dptr;
-		if (!dptr || *dptr != i)
+		struct tdb_data dbuf;
+		if ((ecode = tdb_fetch(tdb, key, &dbuf)) != TDB_SUCCESS
+		    || *(int *)dbuf.dptr != i) {
 			errx(1, "Fetching key %u in tdb gave %u",
-			     i, dptr ? *dptr : -1);
+			     i, ecode ? ecode : *(int *)dbuf.dptr);
+		}
 	}
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (seed.base.next)
@@ -195,21 +197,22 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Missing 1000 records. */
 	printf("Missing %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (i = num; i < num*2; i++) {
-		int *dptr;
-		dptr = (int *)tdb_fetch(tdb, key).dptr;
-		if (dptr)
-			errx(1, "Fetching key %u in tdb gave %u", i, *dptr);
+		struct tdb_data dbuf;
+		ecode = tdb_fetch(tdb, key, &dbuf);
+		if (ecode != TDB_ERR_NOEXIST)
+			errx(1, "Fetching key %u in tdb gave %s",
+			     i, tdb_errorstr(ecode));
 	}
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (seed.base.next)
@@ -217,8 +220,8 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Traverse 1000 records. */
 	printf("Traversing %u records: ", num); fflush(stdout);
@@ -229,8 +232,8 @@ int main(int argc, char *argv[])
 	if (i != (num - 1) * (num / 2))
 		errx(1, "Traverse tallied to %u", i);
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (seed.base.next)
@@ -238,21 +241,21 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Delete 1000 records (not in order). */
 	printf("Deleting %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (j = 0; j < num; j++) {
 		i = (j + 100003) % num;
-		if (tdb_delete(tdb, key) != 0)
+		if ((ecode = tdb_delete(tdb, key)) != TDB_SUCCESS)
 			errx(1, "Deleting key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 	}
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (seed.base.next)
@@ -260,21 +263,21 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Re-add 1000 records (not in order). */
 	printf("Re-adding %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (j = 0; j < num; j++) {
 		i = (j + 100003) % num;
-		if (tdb_store(tdb, key, data, TDB_INSERT) != 0)
+		if ((ecode = tdb_store(tdb, key, data, TDB_INSERT)) != 0)
 			errx(1, "Inserting key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 	}
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (seed.base.next)
@@ -282,43 +285,43 @@ int main(int argc, char *argv[])
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Append 1000 records. */
 	printf("Appending %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (i = 0; i < num; i++)
-		if (tdb_append(tdb, key, data) != 0)
+		if ((ecode = tdb_append(tdb, key, data)) != TDB_SUCCESS)
 			errx(1, "Appending key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 	if (++stage == stopat)
 		exit(0);
 
-	if (transaction && tdb_transaction_start(tdb))
-		errx(1, "starting transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_start(tdb)))
+		errx(1, "starting transaction: %s", tdb_errorstr(ecode));
 
 	/* Churn 1000 records: not in order! */
 	printf("Churning %u records: ", num); fflush(stdout);
 	gettimeofday(&start, NULL);
 	for (j = 0; j < num; j++) {
 		i = (j + 1000019) % num;
-		if (tdb_delete(tdb, key) != 0)
+		if ((ecode = tdb_delete(tdb, key)) != TDB_SUCCESS)
 			errx(1, "Deleting key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 		i += num;
-		if (tdb_store(tdb, key, data, TDB_INSERT) != 0)
+		if ((ecode = tdb_store(tdb, key, data, TDB_INSERT)) != 0)
 			errx(1, "Inserting key %u in tdb: %s",
-			     i, tdb_errorstr(tdb));
+			     i, tdb_errorstr(ecode));
 	}
 	gettimeofday(&stop, NULL);
-	if (transaction && tdb_transaction_commit(tdb))
-		errx(1, "committing transaction: %s", tdb_errorstr(tdb));
+	if (transaction && (ecode = tdb_transaction_commit(tdb)))
+		errx(1, "committing transaction: %s", tdb_errorstr(ecode));
 	printf(" %zu ns (%zu bytes)\n",
 	       normalize(&start, &stop, num), file_size());
 

+ 66 - 73
ccan/tdb2/tools/tdbtool.c

@@ -46,12 +46,9 @@ static int disable_mmap;
 enum commands {
 	CMD_CREATE_TDB,
 	CMD_OPEN_TDB,
-	CMD_OPENJH_TDB,
-#if 0
 	CMD_TRANSACTION_START,
 	CMD_TRANSACTION_COMMIT,
 	CMD_TRANSACTION_CANCEL,
-#endif
 	CMD_ERASE,
 	CMD_DUMP,
 	CMD_INSERT,
@@ -84,7 +81,6 @@ typedef struct {
 COMMAND_TABLE cmd_table[] = {
 	{"create",	CMD_CREATE_TDB},
 	{"open",	CMD_OPEN_TDB},
-	{"openjh",	CMD_OPENJH_TDB},
 #if 0
 	{"transaction_start",	CMD_TRANSACTION_START},
 	{"transaction_commit",	CMD_TRANSACTION_COMMIT},
@@ -131,13 +127,10 @@ static double _end_timer(void)
 	       (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
 }
 
-static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *priv, const char *format, ...)
+static void tdb_log(struct tdb_context *tdb, enum tdb_log_level level,
+		    void *priv, const char *message)
 {
-	va_list ap;
-    
-	va_start(ap, format);
-	vfprintf(stderr, format, ap);
-	va_end(ap);
+	fputs(message, stderr);
 }
 
 /* a tdb tool for manipulating a tdb database */
@@ -226,9 +219,12 @@ static void help(void)
 "\n");
 }
 
-static void terror(const char *why)
+static void terror(enum TDB_ERROR err, const char *why)
 {
-	printf("%s\n", why);
+	if (err != TDB_SUCCESS)
+		printf("%s:%s\n", tdb_errorstr(err), why);
+	else
+		printf("%s\n", why);
 }
 
 static void create_tdb(const char *tdbname)
@@ -252,20 +248,16 @@ static uint64_t jenkins_hash(const void *key, size_t len, uint64_t seed,
 	return hash_any(key, len, seed);
 }
 
-static void open_tdb(const char *tdbname, tdb_hashfn_t hashfn)
+static void open_tdb(const char *tdbname)
 {
-	union tdb_attribute log_attr, hash_attr;
+	union tdb_attribute log_attr;
 	log_attr.base.attr = TDB_ATTRIBUTE_LOG;
 	log_attr.base.next = NULL;
 	log_attr.log.log_fn = tdb_log;
 
-	hash_attr.base.attr = TDB_ATTRIBUTE_HASH;
-	hash_attr.base.next = &log_attr;
-	hash_attr.hash.hash_fn = hashfn;
-
 	if (tdb) tdb_close(tdb);
 	tdb = tdb_open(tdbname, disable_mmap?TDB_NOMMAP:0, O_RDWR, 0600,
-		       hashfn ? &hash_attr : &log_attr);
+		       &log_attr);
 	if (!tdb) {
 		printf("Could not open %s: %s\n", tdbname, strerror(errno));
 	}
@@ -274,9 +266,10 @@ static void open_tdb(const char *tdbname, tdb_hashfn_t hashfn)
 static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
 {
 	TDB_DATA key, dbuf;
+	enum TDB_ERROR ecode;
 
 	if ((keyname == NULL) || (keylen == 0)) {
-		terror("need key");
+		terror(TDB_SUCCESS, "need key");
 		return;
 	}
 
@@ -285,22 +278,24 @@ static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
 	dbuf.dptr = (unsigned char *)data;
 	dbuf.dsize = datalen;
 
-	if (tdb_store(tdb, key, dbuf, TDB_INSERT) == -1) {
-		terror("insert failed");
+	ecode = tdb_store(tdb, key, dbuf, TDB_INSERT);
+	if (ecode) {
+		terror(ecode, "insert failed");
 	}
 }
 
 static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
 {
 	TDB_DATA key, dbuf;
+	enum TDB_ERROR ecode;
 
 	if ((keyname == NULL) || (keylen == 0)) {
-		terror("need key");
+		terror(TDB_SUCCESS, "need key");
 		return;
 	}
 
 	if ((data == NULL) || (datalen == 0)) {
-		terror("need data");
+		terror(TDB_SUCCESS, "need data");
 		return;
 	}
 
@@ -312,50 +307,52 @@ static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
 	printf("Storing key:\n");
 	print_rec(tdb, key, dbuf, NULL);
 
-	if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1) {
-		terror("store failed");
+	ecode = tdb_store(tdb, key, dbuf, TDB_REPLACE);
+	if (ecode) {
+		terror(ecode, "store failed");
 	}
 }
 
 static void show_tdb(char *keyname, size_t keylen)
 {
 	TDB_DATA key, dbuf;
+	enum TDB_ERROR ecode;
 
 	if ((keyname == NULL) || (keylen == 0)) {
-		terror("need key");
+		terror(TDB_SUCCESS, "need key");
 		return;
 	}
 
 	key.dptr = (unsigned char *)keyname;
 	key.dsize = keylen;
 
-	dbuf = tdb_fetch(tdb, key);
-	if (!dbuf.dptr) {
-	    terror("fetch failed");
-	    return;
+	ecode = tdb_fetch(tdb, key, &dbuf);
+	if (ecode) {
+		terror(ecode, "fetch failed");
+		return;
 	}
 	
 	print_rec(tdb, key, dbuf, NULL);
 	
 	free( dbuf.dptr );
-	
-	return;
 }
 
 static void delete_tdb(char *keyname, size_t keylen)
 {
 	TDB_DATA key;
+	enum TDB_ERROR ecode;
 
 	if ((keyname == NULL) || (keylen == 0)) {
-		terror("need key");
+		terror(TDB_SUCCESS, "need key");
 		return;
 	}
 
 	key.dptr = (unsigned char *)keyname;
 	key.dsize = keylen;
 
-	if (tdb_delete(tdb, key) != 0) {
-		terror("delete failed");
+	ecode = tdb_delete(tdb, key);
+	if (ecode) {
+		terror(ecode, "delete failed");
 	}
 }
 
@@ -363,23 +360,24 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname)
 {
 	TDB_DATA key, dbuf;
 	struct tdb_context *dst_tdb;
+	enum TDB_ERROR ecode;
 
 	if ((keyname == NULL) || (keylen == 0)) {
-		terror("need key");
+		terror(TDB_SUCCESS, "need key");
 		return;
 	}
 
 	if ( !tdbname ) {
-		terror("need destination tdb name");
+		terror(TDB_SUCCESS, "need destination tdb name");
 		return;
 	}
 
 	key.dptr = (unsigned char *)keyname;
 	key.dsize = keylen;
 
-	dbuf = tdb_fetch(tdb, key);
-	if (!dbuf.dptr) {
-		terror("fetch failed");
+	ecode = tdb_fetch(tdb, key, &dbuf);
+	if (ecode) {
+		terror(ecode, "fetch failed");
 		return;
 	}
 	
@@ -387,19 +385,17 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname)
 	
 	dst_tdb = tdb_open(tdbname, 0, O_RDWR, 0600, NULL);
 	if ( !dst_tdb ) {
-		terror("unable to open destination tdb");
+		terror(TDB_SUCCESS, "unable to open destination tdb");
 		return;
 	}
 	
-	if ( tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) == -1 ) {
-		terror("failed to move record");
-	}
+	ecode = tdb_store( dst_tdb, key, dbuf, TDB_REPLACE);
+	if (ecode)
+		terror(ecode, "failed to move record");
 	else
 		printf("record moved\n");
 	
 	tdb_close( dst_tdb );
-	
-	return;
 }
 
 static int print_rec(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
@@ -437,10 +433,13 @@ static int traverse_fn(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf,
 
 static void info_tdb(void)
 {
-	char *summary = tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS);
+	enum TDB_ERROR ecode;
+	char *summary;
 
-	if (!summary) {
-		printf("Error = %s\n", tdb_errorstr(tdb));
+	ecode = tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &summary);
+
+	if (ecode) {
+		terror(ecode, "Getting summary");
 	} else {
 		printf("%s", summary);
 		free(summary);
@@ -480,13 +479,12 @@ static void speed_tdb(const char *tlimit)
 		key.dsize = strlen((char *)key.dptr);
 		dbuf.dptr = (unsigned char *)&r;
 		dbuf.dsize = sizeof(r);
-		tdb_fetch(tdb, key);
+		tdb_fetch(tdb, key, &dbuf);
 		t = _end_timer();
 		ops++;
 	} while (t < timelimit);
 	printf("%10.3f ops/sec\n", ops/t);
 
-#if 0 /* FIXME */
 	ops = 0;
 	printf("Testing transaction speed for %u seconds\n", timelimit);
 	_start_timer();
@@ -504,7 +502,6 @@ static void speed_tdb(const char *tlimit)
 		ops++;
 	} while (t < timelimit);
 	printf("%10.3f ops/sec\n", ops/t);
-#endif
 
 	ops = 0;
 	printf("Testing traverse speed for %u seconds\n", timelimit);
@@ -548,10 +545,11 @@ static int do_delete_fn(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf
 static void first_record(struct tdb_context *the_tdb, TDB_DATA *pkey)
 {
 	TDB_DATA dbuf;
-	*pkey = tdb_firstkey(the_tdb);
-	
-	dbuf = tdb_fetch(the_tdb, *pkey);
-	if (!dbuf.dptr) terror("fetch failed");
+	enum TDB_ERROR ecode;
+	ecode = tdb_firstkey(the_tdb, pkey);
+	if (!ecode)
+		ecode = tdb_fetch(the_tdb, *pkey, &dbuf);
+	if (ecode) terror(ecode, "fetch failed");
 	else {
 		print_rec(the_tdb, *pkey, dbuf, NULL);
 	}
@@ -560,11 +558,13 @@ static void first_record(struct tdb_context *the_tdb, TDB_DATA *pkey)
 static void next_record(struct tdb_context *the_tdb, TDB_DATA *pkey)
 {
 	TDB_DATA dbuf;
-	*pkey = tdb_nextkey(the_tdb, *pkey);
-	
-	dbuf = tdb_fetch(the_tdb, *pkey);
-	if (!dbuf.dptr) 
-		terror("fetch failed");
+	enum TDB_ERROR ecode;
+	ecode = tdb_nextkey(the_tdb, pkey);
+
+	if (!ecode)
+		ecode = tdb_fetch(the_tdb, *pkey, &dbuf);
+	if (ecode) 
+		terror(ecode, "fetch failed");
 	else
 		print_rec(the_tdb, *pkey, dbuf, NULL);
 }
@@ -574,7 +574,7 @@ static void check_db(struct tdb_context *the_tdb)
 	if (!the_tdb) {
 		printf("Error: No database opened!\n");
 	} else {
-		if (tdb_check(the_tdb, NULL, NULL) == -1)
+		if (tdb_check(the_tdb, NULL, NULL) != 0)
 			printf("Integrity check for the opened database failed.\n");
 		else
 			printf("Database integrity is OK.\n");
@@ -607,16 +607,12 @@ static int do_command(void)
 		return 0;
 	case CMD_OPEN_TDB:
 		bIterate = 0;
-		open_tdb(arg1, NULL);
-		return 0;
-	case CMD_OPENJH_TDB:
-		bIterate = 0;
-		open_tdb(arg1, jenkins_hash);
+		open_tdb(arg1);
 		return 0;
 	case CMD_SYSTEM:
 		/* Shell command */
 		if (system(arg1) == -1) {
-			terror("system() call failed\n");
+			terror(TDB_SUCCESS, "system() call failed\n");
 		}
 		return 0;
 	case CMD_QUIT:
@@ -625,12 +621,11 @@ static int do_command(void)
 		/* all the rest require a open database */
 		if (!tdb) {
 			bIterate = 0;
-			terror("database not open");
+			terror(TDB_SUCCESS, "database not open");
 			help();
 			return 0;
 		}
 		switch (mycmd) {
-#if 0
 		case CMD_TRANSACTION_START:
 			bIterate = 0;
 			tdb_transaction_start(tdb);
@@ -643,7 +638,6 @@ static int do_command(void)
 			bIterate = 0;
 			tdb_transaction_cancel(tdb);
 			return 0;
-#endif
 		case CMD_ERASE:
 			bIterate = 0;
 			tdb_traverse(tdb, do_delete_fn, NULL);
@@ -711,7 +705,6 @@ static int do_command(void)
 			return 0;
 		case CMD_CREATE_TDB:
 		case CMD_OPEN_TDB:
-		case CMD_OPENJH_TDB:
 		case CMD_SYSTEM:
 		case CMD_QUIT:
 			/*

+ 7 - 23
ccan/tdb2/tools/tdbtorture.c

@@ -24,7 +24,6 @@
 #define TRANSACTION_PREPARE_PROB 2
 #define LOCKSTORE_PROB 5
 #define TRAVERSE_PROB 20
-#define TRAVERSE_READ_PROB 20
 #define TRAVERSE_MOD_PROB 100
 #define TRAVERSE_ABORT_PROB 500
 #define CULL_PROB 100
@@ -43,16 +42,10 @@ static int count_pipe;
 static union tdb_attribute log_attr;
 static union tdb_attribute seed_attr;
 
-#ifdef PRINTF_FMT
-static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *private, const char *format, ...) PRINTF_FMT(4,5);
-#endif
-static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *private, const char *format, ...)
+static void tdb_log(struct tdb_context *tdb, enum tdb_log_level level,
+		    void *private, const char *message)
 {
-	va_list ap;
-
-	va_start(ap, format);
-	vfprintf(stdout, format, ap);
-	va_end(ap);
+	fputs(message, stdout);
 	fflush(stdout);
 #if 0
 	{
@@ -202,7 +195,7 @@ static void addrec_db(void)
 #if LOCKSTORE_PROB
 	if (random() % LOCKSTORE_PROB == 0) {
 		tdb_chainlock(db, key);
-		data = tdb_fetch(db, key);
+		tdb_fetch(db, key, &data);
 		if (tdb_store(db, key, data, TDB_REPLACE) != 0) {
 			fatal("tdb_store failed");
 		}
@@ -222,17 +215,8 @@ static void addrec_db(void)
 	}
 #endif
 
-#if TRAVERSE_READ_PROB
-	if (in_traverse == 0 && random() % TRAVERSE_READ_PROB == 0) {
-		in_traverse++;
-		tdb_traverse_read(db, NULL, NULL);
-		in_traverse--;
-		goto next;
-	}
-#endif
-
-	data = tdb_fetch(db, key);
-	if (data.dptr) free(data.dptr);
+	if (tdb_fetch(db, key, &data) == TDB_SUCCESS)
+		free(data.dptr);
 
 next:
 	free(k);
@@ -296,7 +280,7 @@ static int run_child(int i, int seed, unsigned num_loops, unsigned start)
 	}
 
 	if (error_count == 0) {
-		tdb_traverse_read(db, NULL, NULL);
+		tdb_traverse(db, NULL, NULL);
 #if TRANSACTION_PROB
 		if (always_transaction) {
 			while (in_transaction) {