X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftools%2Fspeed.c;h=86c36ed809aee3c43f54a2a803b328bf5c79772c;hb=a94286219597d8123188aaff0aaa55dba5104a05;hp=c9fb0d0516145e001f93112159809bf93849e5e7;hpb=007a7e4e8df8f43c61126599bcc582750cbf17fe;p=ccan diff --git a/ccan/tdb2/tools/speed.c b/ccan/tdb2/tools/speed.c index c9fb0d05..86c36ed8 100644 --- a/ccan/tdb2/tools/speed.c +++ b/ccan/tdb2/tools/speed.c @@ -43,61 +43,74 @@ 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_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); + (unsigned long long)stats.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_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("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); + (unsigned long long)stats.stats.locks); printf(" lock_lowlevel = %llu\n", - (unsigned long long)stats->lock_lowlevel); + (unsigned long long)stats.stats.lock_lowlevel); printf(" lock_nonblock = %llu\n", - (unsigned long long)stats->lock_nonblock); + (unsigned long long)stats.stats.lock_nonblock); /* 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 *data, const char *message) + const char *message, void *data) { fputs(message, stderr); + putc('\n', stderr); } int main(int argc, char *argv[]) @@ -108,7 +121,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. */ @@ -120,11 +134,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--; @@ -146,7 +155,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 +181,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 +196,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 +228,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 +258,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 +286,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 +315,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 +344,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 +371,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 +382,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 +403,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);