]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/tools/speed.c
tdb2: cleanups for tools/speed.c
[ccan] / ccan / tdb2 / tools / speed.c
index 216a051fe9f060dae65d96de48fa53f9f0bb8ee3..487c056ae3ddc156651b0ab58513bc5eba24298c 100644 (file)
@@ -94,15 +94,22 @@ 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. */
@@ -110,6 +117,10 @@ int main(int argc, char *argv[])
        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;
@@ -130,6 +141,11 @@ int main(int argc, char *argv[])
                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--;
@@ -137,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");
 
@@ -157,11 +173,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)
@@ -173,16 +188,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 (++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;
@@ -197,16 +220,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 (++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;
@@ -220,16 +250,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 (++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)
@@ -241,16 +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 (++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;
@@ -263,16 +307,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 (++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;
@@ -285,15 +336,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 (++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++)
@@ -305,13 +363,20 @@ 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 (++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++) {
@@ -330,6 +395,14 @@ 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 (++stage == stopat)