Commit f82eddef authored by Rusty Russell's avatar Rusty Russell

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

parent c8c9a469
...@@ -103,6 +103,7 @@ int main(int argc, char *argv[]) ...@@ -103,6 +103,7 @@ int main(int argc, char *argv[])
struct tdb_context *tdb; struct tdb_context *tdb;
struct timeval start, stop; struct timeval start, stop;
union tdb_attribute seed, stats; union tdb_attribute seed, stats;
enum TDB_ERROR ecode;
/* Try to keep benchmarks even. */ /* Try to keep benchmarks even. */
seed.base.attr = TDB_ATTRIBUTE_SEED; seed.base.attr = TDB_ATTRIBUTE_SEED;
...@@ -151,19 +152,19 @@ int main(int argc, char *argv[]) ...@@ -151,19 +152,19 @@ int main(int argc, char *argv[])
argc--; argc--;
} }
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Add 1000 records. */ /* Add 1000 records. */
printf("Adding %u records: ", num); fflush(stdout); printf("Adding %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (i = 0; i < num; i++) 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", errx(1, "Inserting key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
...@@ -172,22 +173,23 @@ int main(int argc, char *argv[]) ...@@ -172,22 +173,23 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Finding 1000 records. */ /* Finding 1000 records. */
printf("Finding %u records: ", num); fflush(stdout); printf("Finding %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
int *dptr; struct tdb_data dbuf;
dptr = (int *)tdb_fetch(tdb, key).dptr; if ((ecode = tdb_fetch(tdb, key, &dbuf)) != TDB_SUCCESS
if (!dptr || *dptr != i) || *(int *)dbuf.dptr != i) {
errx(1, "Fetching key %u in tdb gave %u", errx(1, "Fetching key %u in tdb gave %u",
i, dptr ? *dptr : -1); i, ecode ? ecode : *(int *)dbuf.dptr);
}
} }
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (seed.base.next) if (seed.base.next)
...@@ -195,21 +197,22 @@ int main(int argc, char *argv[]) ...@@ -195,21 +197,22 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Missing 1000 records. */ /* Missing 1000 records. */
printf("Missing %u records: ", num); fflush(stdout); printf("Missing %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (i = num; i < num*2; i++) { for (i = num; i < num*2; i++) {
int *dptr; struct tdb_data dbuf;
dptr = (int *)tdb_fetch(tdb, key).dptr; ecode = tdb_fetch(tdb, key, &dbuf);
if (dptr) if (ecode != TDB_ERR_NOEXIST)
errx(1, "Fetching key %u in tdb gave %u", i, *dptr); errx(1, "Fetching key %u in tdb gave %s",
i, tdb_errorstr(ecode));
} }
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (seed.base.next) if (seed.base.next)
...@@ -217,8 +220,8 @@ int main(int argc, char *argv[]) ...@@ -217,8 +220,8 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Traverse 1000 records. */ /* Traverse 1000 records. */
printf("Traversing %u records: ", num); fflush(stdout); printf("Traversing %u records: ", num); fflush(stdout);
...@@ -229,8 +232,8 @@ int main(int argc, char *argv[]) ...@@ -229,8 +232,8 @@ int main(int argc, char *argv[])
if (i != (num - 1) * (num / 2)) if (i != (num - 1) * (num / 2))
errx(1, "Traverse tallied to %u", i); errx(1, "Traverse tallied to %u", i);
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (seed.base.next) if (seed.base.next)
...@@ -238,21 +241,21 @@ int main(int argc, char *argv[]) ...@@ -238,21 +241,21 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Delete 1000 records (not in order). */ /* Delete 1000 records (not in order). */
printf("Deleting %u records: ", num); fflush(stdout); printf("Deleting %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (j = 0; j < num; j++) { for (j = 0; j < num; j++) {
i = (j + 100003) % num; 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", errx(1, "Deleting key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
} }
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (seed.base.next) if (seed.base.next)
...@@ -260,21 +263,21 @@ int main(int argc, char *argv[]) ...@@ -260,21 +263,21 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Re-add 1000 records (not in order). */ /* Re-add 1000 records (not in order). */
printf("Re-adding %u records: ", num); fflush(stdout); printf("Re-adding %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (j = 0; j < num; j++) { for (j = 0; j < num; j++) {
i = (j + 100003) % num; 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", errx(1, "Inserting key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
} }
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (seed.base.next) if (seed.base.next)
...@@ -282,43 +285,43 @@ int main(int argc, char *argv[]) ...@@ -282,43 +285,43 @@ int main(int argc, char *argv[])
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Append 1000 records. */ /* Append 1000 records. */
printf("Appending %u records: ", num); fflush(stdout); printf("Appending %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (i = 0; i < num; i++) 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", errx(1, "Appending key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
if (++stage == stopat) if (++stage == stopat)
exit(0); exit(0);
if (transaction && tdb_transaction_start(tdb)) if (transaction && (ecode = tdb_transaction_start(tdb)))
errx(1, "starting transaction: %s", tdb_errorstr(tdb)); errx(1, "starting transaction: %s", tdb_errorstr(ecode));
/* Churn 1000 records: not in order! */ /* Churn 1000 records: not in order! */
printf("Churning %u records: ", num); fflush(stdout); printf("Churning %u records: ", num); fflush(stdout);
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
for (j = 0; j < num; j++) { for (j = 0; j < num; j++) {
i = (j + 1000019) % num; 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", errx(1, "Deleting key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
i += num; 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", errx(1, "Inserting key %u in tdb: %s",
i, tdb_errorstr(tdb)); i, tdb_errorstr(ecode));
} }
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
if (transaction && tdb_transaction_commit(tdb)) if (transaction && (ecode = tdb_transaction_commit(tdb)))
errx(1, "committing transaction: %s", tdb_errorstr(tdb)); errx(1, "committing transaction: %s", tdb_errorstr(ecode));
printf(" %zu ns (%zu bytes)\n", printf(" %zu ns (%zu bytes)\n",
normalize(&start, &stop, num), file_size()); normalize(&start, &stop, num), file_size());
......
...@@ -46,12 +46,9 @@ static int disable_mmap; ...@@ -46,12 +46,9 @@ static int disable_mmap;
enum commands { enum commands {
CMD_CREATE_TDB, CMD_CREATE_TDB,
CMD_OPEN_TDB, CMD_OPEN_TDB,
CMD_OPENJH_TDB,
#if 0
CMD_TRANSACTION_START, CMD_TRANSACTION_START,
CMD_TRANSACTION_COMMIT, CMD_TRANSACTION_COMMIT,
CMD_TRANSACTION_CANCEL, CMD_TRANSACTION_CANCEL,
#endif
CMD_ERASE, CMD_ERASE,
CMD_DUMP, CMD_DUMP,
CMD_INSERT, CMD_INSERT,
...@@ -84,7 +81,6 @@ typedef struct { ...@@ -84,7 +81,6 @@ typedef struct {
COMMAND_TABLE cmd_table[] = { COMMAND_TABLE cmd_table[] = {
{"create", CMD_CREATE_TDB}, {"create", CMD_CREATE_TDB},
{"open", CMD_OPEN_TDB}, {"open", CMD_OPEN_TDB},
{"openjh", CMD_OPENJH_TDB},
#if 0 #if 0
{"transaction_start", CMD_TRANSACTION_START}, {"transaction_start", CMD_TRANSACTION_START},
{"transaction_commit", CMD_TRANSACTION_COMMIT}, {"transaction_commit", CMD_TRANSACTION_COMMIT},
...@@ -131,13 +127,10 @@ static double _end_timer(void) ...@@ -131,13 +127,10 @@ static double _end_timer(void)
(tp2.tv_usec - tp1.tv_usec)*1.0e-6); (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; fputs(message, stderr);
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
} }
/* a tdb tool for manipulating a tdb database */ /* a tdb tool for manipulating a tdb database */
...@@ -226,9 +219,12 @@ static void help(void) ...@@ -226,9 +219,12 @@ static void help(void)
"\n"); "\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) 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, ...@@ -252,20 +248,16 @@ static uint64_t jenkins_hash(const void *key, size_t len, uint64_t seed,
return hash_any(key, len, 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.attr = TDB_ATTRIBUTE_LOG;
log_attr.base.next = NULL; log_attr.base.next = NULL;
log_attr.log.log_fn = tdb_log; 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); if (tdb) tdb_close(tdb);
tdb = tdb_open(tdbname, disable_mmap?TDB_NOMMAP:0, O_RDWR, 0600, tdb = tdb_open(tdbname, disable_mmap?TDB_NOMMAP:0, O_RDWR, 0600,
hashfn ? &hash_attr : &log_attr); &log_attr);
if (!tdb) { if (!tdb) {
printf("Could not open %s: %s\n", tdbname, strerror(errno)); 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) ...@@ -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) static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
{ {
TDB_DATA key, dbuf; TDB_DATA key, dbuf;
enum TDB_ERROR ecode;
if ((keyname == NULL) || (keylen == 0)) { if ((keyname == NULL) || (keylen == 0)) {
terror("need key"); terror(TDB_SUCCESS, "need key");
return; return;
} }
...@@ -285,22 +278,24 @@ static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen) ...@@ -285,22 +278,24 @@ static void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
dbuf.dptr = (unsigned char *)data; dbuf.dptr = (unsigned char *)data;
dbuf.dsize = datalen; dbuf.dsize = datalen;
if (tdb_store(tdb, key, dbuf, TDB_INSERT) == -1) { ecode = tdb_store(tdb, key, dbuf, TDB_INSERT);
terror("insert failed"); if (ecode) {
terror(ecode, "insert failed");
} }
} }
static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen) static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
{ {
TDB_DATA key, dbuf; TDB_DATA key, dbuf;
enum TDB_ERROR ecode;
if ((keyname == NULL) || (keylen == 0)) { if ((keyname == NULL) || (keylen == 0)) {
terror("need key"); terror(TDB_SUCCESS, "need key");
return; return;
} }
if ((data == NULL) || (datalen == 0)) { if ((data == NULL) || (datalen == 0)) {
terror("need data"); terror(TDB_SUCCESS, "need data");
return; return;
} }
...@@ -312,50 +307,52 @@ static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen) ...@@ -312,50 +307,52 @@ static void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
printf("Storing key:\n"); printf("Storing key:\n");
print_rec(tdb, key, dbuf, NULL); print_rec(tdb, key, dbuf, NULL);
if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1) { ecode = tdb_store(tdb, key, dbuf, TDB_REPLACE);
terror("store failed"); if (ecode) {
terror(ecode, "store failed");
} }
} }
static void show_tdb(char *keyname, size_t keylen) static void show_tdb(char *keyname, size_t keylen)
{ {
TDB_DATA key, dbuf; TDB_DATA key, dbuf;
enum TDB_ERROR ecode;
if ((keyname == NULL) || (keylen == 0)) { if ((keyname == NULL) || (keylen == 0)) {
terror("need key"); terror(TDB_SUCCESS, "need key");
return; return;
} }
key.dptr = (unsigned char *)keyname; key.dptr = (unsigned char *)keyname;
key.dsize = keylen; key.dsize = keylen;
dbuf = tdb_fetch(tdb, key); ecode = tdb_fetch(tdb, key, &dbuf);
if (!dbuf.dptr) { if (ecode) {
terror("fetch failed"); terror(ecode, "fetch failed");
return; return;
} }
print_rec(tdb, key, dbuf, NULL); print_rec(tdb, key, dbuf, NULL);
free( dbuf.dptr ); free( dbuf.dptr );
return;
} }
static void delete_tdb(char *keyname, size_t keylen) static void delete_tdb(char *keyname, size_t keylen)
{ {
TDB_DATA key; TDB_DATA key;
enum TDB_ERROR ecode;
if ((keyname == NULL) || (keylen == 0)) { if ((keyname == NULL) || (keylen == 0)) {
terror("need key"); terror(TDB_SUCCESS, "need key");
return; return;
} }
key.dptr = (unsigned char *)keyname; key.dptr = (unsigned char *)keyname;
key.dsize = keylen; key.dsize = keylen;
if (tdb_delete(tdb, key) != 0) { ecode = tdb_delete(tdb, key);
terror("delete failed"); if (ecode) {
terror(ecode, "delete failed");
} }
} }
...@@ -363,23 +360,24 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname) ...@@ -363,23 +360,24 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname)
{ {
TDB_DATA key, dbuf; TDB_DATA key, dbuf;
struct tdb_context *dst_tdb; struct tdb_context *dst_tdb;
enum TDB_ERROR ecode;
if ((keyname == NULL) || (keylen == 0)) { if ((keyname == NULL) || (keylen == 0)) {
terror("need key"); terror(TDB_SUCCESS, "need key");
return; return;
} }
if ( !tdbname ) { if ( !tdbname ) {
terror("need destination tdb name"); terror(TDB_SUCCESS, "need destination tdb name");
return; return;
} }
key.dptr = (unsigned char *)keyname; key.dptr = (unsigned char *)keyname;
key.dsize = keylen; key.dsize = keylen;
dbuf = tdb_fetch(tdb, key); ecode = tdb_fetch(tdb, key, &dbuf);
if (!dbuf.dptr) { if (ecode) {
terror("fetch failed"); terror(ecode, "fetch failed");
return; return;
} }
...@@ -387,19 +385,17 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname) ...@@ -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); dst_tdb = tdb_open(tdbname, 0, O_RDWR, 0600, NULL);
if ( !dst_tdb ) { if ( !dst_tdb ) {
terror("unable to open destination tdb"); terror(TDB_SUCCESS, "unable to open destination tdb");
return; return;
} }
if ( tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) == -1 ) { ecode = tdb_store( dst_tdb, key, dbuf, TDB_REPLACE);
terror("failed to move record"); if (ecode)
} terror(ecode, "failed to move record");
else else
printf("record moved\n"); printf("record moved\n");
tdb_close( dst_tdb ); tdb_close( dst_tdb );
return;
} }
static int print_rec(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state) 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, ...@@ -437,10 +433,13 @@ static int traverse_fn(struct tdb_context *the_tdb, TDB_DATA key, TDB_DATA dbuf,
static void info_tdb(void) static void info_tdb(void)
{ {
char *summary = tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS); enum TDB_ERROR ecode;
char *summary;
if (!summary) { ecode = tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &summary);
printf("Error = %s\n", tdb_errorstr(tdb));
if (ecode) {
terror(ecode, "Getting summary");
} else { } else {
printf("%s", summary); printf("%s", summary);
free(summary); free(summary);
...@@ -480,13 +479,12 @@ static void speed_tdb(const char *tlimit) ...@@ -480,13 +479,12 @@ static void speed_tdb(const char *tlimit)
key.dsize = strlen((char *)key.dptr); key.dsize = strlen((char *)key.dptr);
dbuf.dptr = (unsigned char *)&r; dbuf.dptr = (unsigned char *)&r;
dbuf.dsize = sizeof(r); dbuf.dsize = sizeof(r);
tdb_fetch(tdb, key); tdb_fetch(tdb, key, &dbuf);
t = _end_timer(); t = _end_timer();
ops++; ops++;
} while (t < timelimit); } while (t < timelimit);
printf("%10.3f ops/sec\n", ops/t); printf("%10.3f ops/sec\n", ops/t);
#if 0 /* FIXME */
ops = 0; ops = 0;
printf("Testing transaction speed for %u seconds\n", timelimit); printf("Testing transaction speed for %u seconds\n", timelimit);
_start_timer(); _start_timer();
...@@ -504,7 +502,6 @@ static void speed_tdb(const char *tlimit) ...@@ -504,7 +502,6 @@ static void speed_tdb(const char *tlimit)
ops++; ops++;
} while (t < timelimit); } while (t < timelimit);
printf("%10.3f ops/sec\n", ops/t); printf("%10.3f ops/sec\n", ops/t);
#endif
ops = 0; ops = 0;
printf("Testing traverse speed for %u seconds\n", timelimit); 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 ...@@ -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) static void first_record(struct tdb_context *the_tdb, TDB_DATA *pkey)
{ {
TDB_DATA dbuf; TDB_DATA dbuf;
*pkey = tdb_firstkey(the_tdb); enum TDB_ERROR ecode;
ecode = tdb_firstkey(the_tdb, pkey);
dbuf = tdb_fetch(the_tdb, *pkey); if (!ecode)
if (!dbuf.dptr) terror("fetch failed"); ecode = tdb_fetch(the_tdb, *pkey, &dbuf);
if (ecode) terror(ecode, "fetch failed");
else { else {
print_rec(the_tdb, *pkey, dbuf, NULL); print_rec(the_tdb, *pkey, dbuf, NULL);
} }
...@@ -560,11 +558,13 @@ static void first_record(struct tdb_context *the_tdb, TDB_DATA *pkey) ...@@ -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) static void next_record(struct tdb_context *the_tdb, TDB_DATA *pkey)
{ {
TDB_DATA dbuf; TDB_DATA dbuf;
*pkey = tdb_nextkey(the_tdb, *pkey); enum TDB_ERROR ecode;
ecode = tdb_nextkey(the_tdb, pkey);
dbuf = tdb_fetch(the_tdb, *pkey);
if (!dbuf.dptr) if (!ecode)
terror("fetch failed"); ecode = tdb_fetch(the_tdb, *pkey, &dbuf);
if (ecode)
terror(ecode, "fetch failed");
else else
print_rec(the_tdb, *pkey, dbuf, NULL); print_rec(the_tdb, *pkey, dbuf, NULL);
} }
...@@ -574,7 +574,7 @@ static void check_db(struct tdb_context *the_tdb) ...@@ -574,7 +574,7 @@ static void check_db(struct tdb_context *the_tdb)
if (!the_tdb) { if (!the_tdb) {
printf("Error: No database opened!\n"); printf("Error: No database opened!\n");
} else { } 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"); printf("Integrity check for the opened database failed.\n");
else else
printf("Database integrity is OK.\n"); printf("Database integrity is OK.\n");
...@@ -607,16 +607,12 @@ static int do_command(void) ...@@ -607,16 +607,12 @@ static int do_command(void)
return 0; return 0;
case CMD_OPEN_TDB: case CMD_OPEN_TDB:
bIterate = 0; bIterate = 0;
open_tdb(arg1, NULL); open_tdb(arg1);
return 0;
case CMD_OPENJH_TDB:
bIterate = 0;
open_tdb(arg1, jenkins_hash);
return 0; return 0;
case CMD_SYSTEM: case CMD_SYSTEM:
/* Shell command */ /* Shell command */
if (system(arg1) == -1) { if (system(arg1) == -1) {
terror("system() call failed\n"); terror(TDB_SUCCESS, "system() call failed\n");
} }
return 0; return 0;
case CMD_QUIT: case CMD_QUIT:
...@@ -625,12 +621,11 @@ static int do_command(void) ...@@ -625,12 +621,11 @@ static int do_command(void)
/* all the rest require a open database */ /* all the rest require a open database */
if (!tdb) { if (!tdb) {
bIterate = 0; bIterate = 0;
terror("database not open"); terror(TDB_SUCCESS, "database not open");
help(); help();
return 0; return 0;
} }
switch (mycmd) { switch (mycmd) {
#if 0
case CMD_TRANSACTION_START: case CMD_TRANSACTION_START:
bIterate = 0; bIterate = 0;
tdb_transaction_start(tdb); tdb_transaction_start(tdb);
...@@ -643,7 +638,6 @@ static int do_command(void) ...@@ -643,7 +638,6 @@ static int do_command(void)
bIterate = 0; bIterate = 0;
tdb_transaction_cancel(tdb); tdb_transaction_cancel(tdb);
return 0; return 0;
#endif
case CMD_ERASE: case CMD_ERASE:
bIterate = 0; bIterate = 0;
tdb_traverse(tdb, do_delete_fn, NULL); tdb_traverse(tdb, do_delete_fn, NULL);
...@@ -711,7 +705,6 @@ static int do_command(void) ...@@ -711,7 +705,6 @@ static int do_command(void)
return 0; return 0;
case CMD_CREATE_TDB: case CMD_CREATE_TDB:
case CMD_OPEN_TDB: case CMD_OPEN_TDB:
case CMD_OPENJH_TDB:
case CMD_SYSTEM: case CMD_SYSTEM:
case CMD_QUIT: case CMD_QUIT:
/* /*
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#define TRANSACTION_PREPARE_PROB 2 #define TRANSACTION_PREPARE_PROB 2
#define LOCKSTORE_PROB 5 #define LOCKSTORE_PROB 5
#define TRAVERSE_PROB 20 #define TRAVERSE_PROB 20
#define TRAVERSE_READ_PROB 20
#define TRAVERSE_MOD_PROB 100 #define TRAVERSE_MOD_PROB 100
#define TRAVERSE_ABORT_PROB 500 #define TRAVERSE_ABORT_PROB 500
#define CULL_PROB 100 #define CULL_PROB 100
...@@ -43,16 +42,10 @@ static int count_pipe; ...@@ -43,16 +42,10 @@ static int count_pipe;
static union tdb_attribute log_attr; static union tdb_attribute log_attr;
static union tdb_attribute seed_attr; static union tdb_attribute seed_attr;
#ifdef PRINTF_FMT static void tdb_log(struct tdb_context *tdb, enum tdb_log_level level,
static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *private, const char *format, ...) PRINTF_FMT(4,5); void *private, const char *message)
#endif
static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, void *private, const char *format, ...)
{ {
va_list ap; fputs(message, stdout);
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
fflush(stdout); fflush(stdout);
#if 0 #if 0
{ {
...@@ -202,7 +195,7 @@ static void addrec_db(void) ...@@ -202,7 +195,7 @@ static void addrec_db(void)
#if LOCKSTORE_PROB #if LOCKSTORE_PROB
if (random() % LOCKSTORE_PROB == 0) { if (random() % LOCKSTORE_PROB == 0) {
tdb_chainlock(db, key); tdb_chainlock(db, key);
data = tdb_fetch(db, key); tdb_fetch(db, key, &data);
if (tdb_store(db, key, data, TDB_REPLACE) != 0) { if (tdb_store(db, key, data, TDB_REPLACE) != 0) {
fatal("tdb_store failed"); fatal("tdb_store failed");
} }
...@@ -222,17 +215,8 @@ static void addrec_db(void) ...@@ -222,17 +215,8 @@ static void addrec_db(void)
} }
#endif #endif
#if TRAVERSE_READ_PROB if (tdb_fetch(db, key, &data) == TDB_SUCCESS)
if (in_traverse == 0 && random() % TRAVERSE_READ_PROB == 0) { free(data.dptr);
in_traverse++;
tdb_traverse_read(db, NULL, NULL);
in_traverse--;
goto next;
}
#endif
data = tdb_fetch(db, key);
if (data.dptr) free(data.dptr);
next: next:
free(k); free(k);
...@@ -296,7 +280,7 @@ static int run_child(int i, int seed, unsigned num_loops, unsigned start) ...@@ -296,7 +280,7 @@ static int run_child(int i, int seed, unsigned num_loops, unsigned start)
} }
if (error_count == 0) { if (error_count == 0) {
tdb_traverse_read(db, NULL, NULL); tdb_traverse(db, NULL, NULL);
#if TRANSACTION_PROB #if TRANSACTION_PROB
if (always_transaction) { if (always_transaction) {
while (in_transaction) { while (in_transaction) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment