X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftools%2Fspeed.c;h=ccb5ae349d894f43d57ce0349b280d6539713e7d;hp=487c056ae3ddc156651b0ab58513bc5eba24298c;hb=56023cca5f66a40646a1e807c3d10af6e5913623;hpb=4ee7bd08f427b3e93d6225dd30e745ee62a4e85f diff --git a/ccan/tdb2/tools/speed.c b/ccan/tdb2/tools/speed.c index 487c056a..ccb5ae34 100644 --- a/ccan/tdb2/tools/speed.c +++ b/ccan/tdb2/tools/speed.c @@ -10,7 +10,7 @@ #include #include #include -#include +#include "tdb2.h" /* Nanoseconds per operation */ static size_t normalize(const struct timeval *start, @@ -43,62 +43,97 @@ 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, - const char *message, void *data) +static void tdb_log(struct tdb_context *tdb, + enum tdb_log_level level, + enum TDB_ERROR ecode, + const char *message, + void *data) { - fputs(message, stderr); - putc('\n', stderr); + fprintf(stderr, "tdb:%s:%s:%s\n", + tdb_name(tdb), tdb_errorstr(ecode), message); } int main(int argc, char *argv[]) @@ -109,7 +144,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. */ @@ -121,11 +157,6 @@ int main(int argc, char *argv[]) log.base.next = &seed; 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); - if (argv[1] && strcmp(argv[1], "--internal") == 0) { flags = TDB_INTERNAL; argc--; @@ -147,7 +178,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++; } @@ -196,8 +227,8 @@ int main(int argc, char *argv[]) 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); @@ -228,8 +259,8 @@ int main(int argc, char *argv[]) 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); @@ -258,8 +289,8 @@ int main(int argc, char *argv[]) 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); @@ -286,8 +317,8 @@ int main(int argc, char *argv[]) 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); @@ -315,8 +346,8 @@ int main(int argc, char *argv[]) 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); @@ -344,8 +375,8 @@ int main(int argc, char *argv[]) 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); @@ -403,8 +434,8 @@ int main(int argc, char *argv[]) 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);