X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftools%2Fspeed.c;h=881d101300ead9a102f9a787aa2d74b083da9d6a;hb=8388c33a83ad51c6fdc355d938f08419d2b24923;hp=dc5f0ad820db09c7cff610c46d89408ba43317b3;hpb=4bde5a87c0df66d2000d972a2a0a9992a9d9396d;p=ccan diff --git a/ccan/tdb2/tools/speed.c b/ccan/tdb2/tools/speed.c index dc5f0ad8..881d1013 100644 --- a/ccan/tdb2/tools/speed.c +++ b/ccan/tdb2/tools/speed.c @@ -43,61 +43,94 @@ static int count_record(struct tdb_context *tdb, return 0; } -static void dump_and_clear_stats(struct tdb_attribute_stats *stats) +static void dump_and_clear_stats(struct tdb_context **tdb, + int flags, + union tdb_attribute *attr) { + union tdb_attribute stats; + enum TDB_ERROR ecode; + + stats.base.attr = TDB_ATTRIBUTE_STATS; + stats.stats.size = sizeof(stats.stats); + ecode = tdb_get_attribute(*tdb, &stats); + if (ecode != TDB_SUCCESS) + errx(1, "Getting stats: %s", tdb_errorstr(ecode)); + printf("allocs = %llu\n", - (unsigned long long)stats->allocs); + (unsigned long long)stats.stats.allocs); printf(" alloc_subhash = %llu\n", - (unsigned long long)stats->alloc_subhash); + (unsigned long long)stats.stats.alloc_subhash); printf(" alloc_chain = %llu\n", - (unsigned long long)stats->alloc_chain); + (unsigned long long)stats.stats.alloc_chain); printf(" alloc_bucket_exact = %llu\n", - (unsigned long long)stats->alloc_bucket_exact); + (unsigned long long)stats.stats.alloc_bucket_exact); printf(" alloc_bucket_max = %llu\n", - (unsigned long long)stats->alloc_bucket_max); + (unsigned long long)stats.stats.alloc_bucket_max); printf(" alloc_leftover = %llu\n", - (unsigned long long)stats->alloc_leftover); + (unsigned long long)stats.stats.alloc_leftover); printf(" alloc_coalesce_tried = %llu\n", - (unsigned long long)stats->alloc_coalesce_tried); + (unsigned long long)stats.stats.alloc_coalesce_tried); + printf(" alloc_coalesce_iterate_clash = %llu\n", + (unsigned long long)stats.stats.alloc_coalesce_iterate_clash); printf(" alloc_coalesce_lockfail = %llu\n", - (unsigned long long)stats->alloc_coalesce_lockfail); + (unsigned long long)stats.stats.alloc_coalesce_lockfail); printf(" alloc_coalesce_race = %llu\n", - (unsigned long long)stats->alloc_coalesce_race); + (unsigned long long)stats.stats.alloc_coalesce_race); printf(" alloc_coalesce_succeeded = %llu\n", - (unsigned long long)stats->alloc_coalesce_succeeded); - printf(" alloc_coalesce_num_merged = %llu\n", - (unsigned long long)stats->alloc_coalesce_num_merged); + (unsigned long long)stats.stats.alloc_coalesce_succeeded); + printf(" alloc_coalesce_num_merged = %llu\n", + (unsigned long long)stats.stats.alloc_coalesce_num_merged); printf("compares = %llu\n", - (unsigned long long)stats->compares); + (unsigned long long)stats.stats.compares); printf(" compare_wrong_bucket = %llu\n", - (unsigned long long)stats->compare_wrong_bucket); + (unsigned long long)stats.stats.compare_wrong_bucket); printf(" compare_wrong_offsetbits = %llu\n", - (unsigned long long)stats->compare_wrong_offsetbits); + (unsigned long long)stats.stats.compare_wrong_offsetbits); printf(" compare_wrong_keylen = %llu\n", - (unsigned long long)stats->compare_wrong_keylen); + (unsigned long long)stats.stats.compare_wrong_keylen); printf(" compare_wrong_rechash = %llu\n", - (unsigned long long)stats->compare_wrong_rechash); + (unsigned long long)stats.stats.compare_wrong_rechash); printf(" compare_wrong_keycmp = %llu\n", - (unsigned long long)stats->compare_wrong_keycmp); + (unsigned long long)stats.stats.compare_wrong_keycmp); + printf("transactions = %llu\n", + (unsigned long long)stats.stats.transactions); + printf(" transaction_cancel = %llu\n", + (unsigned long long)stats.stats.transaction_cancel); + printf(" transaction_nest = %llu\n", + (unsigned long long)stats.stats.transaction_nest); + printf(" transaction_expand_file = %llu\n", + (unsigned long long)stats.stats.transaction_expand_file); + printf(" transaction_read_direct = %llu\n", + (unsigned long long)stats.stats.transaction_read_direct); + printf(" transaction_read_direct_fail = %llu\n", + (unsigned long long)stats.stats.transaction_read_direct_fail); + printf(" transaction_write_direct = %llu\n", + (unsigned long long)stats.stats.transaction_write_direct); + printf(" transaction_write_direct_fail = %llu\n", + (unsigned long long)stats.stats.transaction_write_direct_fail); printf("expands = %llu\n", - (unsigned long long)stats->expands); + (unsigned long long)stats.stats.expands); printf("frees = %llu\n", - (unsigned long long)stats->frees); + (unsigned long long)stats.stats.frees); printf("locks = %llu\n", - (unsigned long long)stats->locks); - printf(" lock_lowlevel = %llu\n", - (unsigned long long)stats->lock_lowlevel); - printf(" lock_nonblock = %llu\n", - (unsigned long long)stats->lock_nonblock); + (unsigned long long)stats.stats.locks); + printf(" lock_lowlevel = %llu\n", + (unsigned long long)stats.stats.lock_lowlevel); + printf(" lock_nonblock = %llu\n", + (unsigned long long)stats.stats.lock_nonblock); + printf(" lock_nonblock_fail = %llu\n", + (unsigned long long)stats.stats.lock_nonblock_fail); /* Now clear. */ - memset(&stats->allocs, 0, (char *)(stats+1) - (char *)&stats->allocs); + tdb_close(*tdb); + *tdb = tdb_open("/tmp/speed.tdb", flags, O_RDWR, 0, attr); } static void tdb_log(struct tdb_context *tdb, enum tdb_log_level level, - void *private, const char *message) + const char *message, void *data) { fputs(message, stderr); + putc('\n', stderr); } int main(int argc, char *argv[]) @@ -108,7 +141,8 @@ int main(int argc, char *argv[]) TDB_DATA key, data; struct tdb_context *tdb; struct timeval start, stop; - union tdb_attribute seed, stats, log; + union tdb_attribute seed, log; + bool do_stats = false; enum TDB_ERROR ecode; /* Try to keep benchmarks even. */ @@ -118,12 +152,7 @@ int main(int argc, char *argv[]) log.base.attr = TDB_ATTRIBUTE_LOG; log.base.next = &seed; - log.log.log_fn = tdb_log; - - memset(&stats, 0, sizeof(stats)); - stats.base.attr = TDB_ATTRIBUTE_STATS; - stats.base.next = NULL; - stats.stats.size = sizeof(stats); + log.log.fn = tdb_log; if (argv[1] && strcmp(argv[1], "--internal") == 0) { flags = TDB_INTERNAL; @@ -146,7 +175,7 @@ int main(int argc, char *argv[]) argv++; } if (argv[1] && strcmp(argv[1], "--stats") == 0) { - seed.base.next = &stats; + do_stats = true; argc--; argv++; } @@ -172,11 +201,10 @@ int main(int argc, char *argv[]) argc--; } - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); gettimeofday(&start, NULL); for (i = 0; i < num; i++) if ((ecode = tdb_store(tdb, key, data, TDB_INSERT)) != 0) @@ -188,22 +216,24 @@ int main(int argc, char *argv[]) printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); + if (++stage == stopat) exit(0); - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); gettimeofday(&start, NULL); for (i = 0; i < num; i++) { struct tdb_data dbuf; @@ -218,22 +248,23 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0); - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); gettimeofday(&start, NULL); for (i = num; i < num*2; i++) { struct tdb_data dbuf; @@ -247,22 +278,23 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0); - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); i = 0; gettimeofday(&start, NULL); if (tdb_traverse(tdb, count_record, &i) != num) @@ -274,22 +306,23 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0); - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); gettimeofday(&start, NULL); for (j = 0; j < num; j++) { i = (j + 100003) % num; @@ -302,22 +335,23 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0); - 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); + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); gettimeofday(&start, NULL); for (j = 0; j < num; j++) { i = (j + 100003) % num; @@ -330,20 +364,22 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0); + /* Append 1000 records. */ 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++) @@ -355,6 +391,8 @@ int main(int argc, char *argv[]) errx(1, "committing transaction: %s", tdb_errorstr(ecode)); printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); @@ -364,10 +402,9 @@ int main(int argc, char *argv[]) if (++stage == stopat) exit(0); + /* Churn 1000 records: not in order! */ 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++) { @@ -386,14 +423,16 @@ int main(int argc, char *argv[]) printf(" %zu ns (%zu bytes)\n", normalize(&start, &stop, num), file_size()); + if (tdb_check(tdb, NULL, NULL)) + errx(1, "tdb_check failed!"); if (summary) { char *sumstr = NULL; tdb_summary(tdb, TDB_SUMMARY_HISTOGRAMS, &sumstr); printf("%s\n", sumstr); free(sumstr); } - if (seed.base.next) - dump_and_clear_stats(&stats.stats); + if (do_stats) + dump_and_clear_stats(&tdb, flags, &log); if (++stage == stopat) exit(0);