X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ftools%2Fspeed.c;h=487c056ae3ddc156651b0ab58513bc5eba24298c;hb=4ee7bd08f427b3e93d6225dd30e745ee62a4e85f;hp=4ed8997146ea8d35613e5f21cd9250b06d3e657c;hpb=f2c286c95f808520e0904b320dccc3680868f6ab;p=ccan diff --git a/ccan/tdb2/tools/speed.c b/ccan/tdb2/tools/speed.c index 4ed89971..487c056a 100644 --- a/ccan/tdb2/tools/speed.c +++ b/ccan/tdb2/tools/speed.c @@ -49,6 +49,8 @@ static void dump_and_clear_stats(struct tdb_attribute_stats *stats) (unsigned long long)stats->allocs); printf(" alloc_subhash = %llu\n", (unsigned long long)stats->alloc_subhash); + printf(" alloc_chain = %llu\n", + (unsigned long long)stats->alloc_chain); printf(" alloc_bucket_exact = %llu\n", (unsigned long long)stats->alloc_bucket_exact); printf(" alloc_bucket_max = %llu\n", @@ -92,21 +94,33 @@ static void dump_and_clear_stats(struct tdb_attribute_stats *stats) memset(&stats->allocs, 0, (char *)(stats+1) - (char *)&stats->allocs); } +static void tdb_log(struct tdb_context *tdb, enum tdb_log_level level, + const char *message, void *data) +{ + fputs(message, stderr); + putc('\n', stderr); +} + int main(int argc, char *argv[]) { unsigned int i, j, num = 1000, stage = 0, stopat = -1; int flags = TDB_DEFAULT; - bool transaction = false; + bool transaction = false, summary = false; TDB_DATA key, data; struct tdb_context *tdb; struct timeval start, stop; - union tdb_attribute seed, stats; + union tdb_attribute seed, stats, log; + enum TDB_ERROR ecode; /* Try to keep benchmarks even. */ seed.base.attr = TDB_ATTRIBUTE_SEED; seed.base.next = NULL; seed.seed.seed = 0; + log.base.attr = TDB_ATTRIBUTE_LOG; + log.base.next = &seed; + log.log.fn = tdb_log; + memset(&stats, 0, sizeof(stats)); stats.base.attr = TDB_ATTRIBUTE_STATS; stats.base.next = NULL; @@ -122,6 +136,16 @@ int main(int argc, char *argv[]) argc--; argv++; } + if (argv[1] && strcmp(argv[1], "--no-sync") == 0) { + flags |= TDB_NOSYNC; + argc--; + argv++; + } + if (argv[1] && strcmp(argv[1], "--summary") == 0) { + summary = true; + argc--; + argv++; + } if (argv[1] && strcmp(argv[1], "--stats") == 0) { seed.base.next = &stats; argc--; @@ -129,7 +153,7 @@ int main(int argc, char *argv[]) } tdb = tdb_open("/tmp/speed.tdb", flags, O_RDWR|O_CREAT|O_TRUNC, - 0600, &seed); + 0600, &log); if (!tdb) err(1, "Opening /tmp/speed.tdb"); @@ -149,77 +173,100 @@ int main(int argc, char *argv[]) argc--; } - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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 (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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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++) { - 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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++) { - 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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) @@ -227,99 +274,135 @@ 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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; - 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* 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; - 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* Append 1000 records. */ + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); 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 (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 (++stage == stopat) exit(0); - if (transaction && tdb_transaction_start(tdb)) - errx(1, "starting transaction: %s", tdb_errorstr(tdb)); - /* Churn 1000 records: not in order! */ + if (transaction && (ecode = tdb_transaction_start(tdb))) + errx(1, "starting transaction: %s", tdb_errorstr(ecode)); 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()); + 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 (++stage == stopat)