]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb/summary.c
tdb: fix uncoalesced record count in tdb_summary.
[ccan] / ccan / tdb / summary.c
index b8f7f97624ce69d22533688282410b30d9cf953b..277ab4cb95c336a4767a9034920aebde92d66faa 100644 (file)
@@ -19,7 +19,7 @@
 #include <ccan/tally/tally.h>
 
 #define SUMMARY_FORMAT \
-       "Size of file/data: %zu/%zu\n" \
+       "Size of file/data: %u/%zu\n" \
        "Number of records: %zu\n" \
        "Smallest/average/largest keys: %zu/%zu/%zu\n%s" \
        "Smallest/average/largest data: %zu/%zu/%zu\n%s" \
 #define HISTO_WIDTH 70
 #define HISTO_HEIGHT 20
 
-/* Slow, but should be very rare. */
-static size_t dead_space(struct tdb_context *tdb, tdb_off_t off)
-{
-       size_t len;
-
-       for (len = 0; off + len < tdb->map_size; len++) {
-               char c;
-               if (tdb->methods->tdb_read(tdb, off, &c, 1, 0))
-                       return 0;
-               if (c != 0 && c != 0x42)
-                       break;
-       }
-       return len;
-}
-
 static size_t get_hash_length(struct tdb_context *tdb, unsigned int i)
 {
        tdb_off_t rec_ptr;
@@ -81,6 +66,8 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
        bool locked;
        size_t len, unc = 0;
 
+       freeg = keysg = datag = deadg = extrag = hashg = uncoalg = NULL;
+
        /* Read-only databases use no locking at all: it's best-effort.
         * We may have a write lock already, so skip that case too. */
        if (tdb->read_only || tdb->allrecord_lock.count != 0) {
@@ -115,6 +102,9 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                        tally_add(data, rec.data_len);
                        tally_add(extra, rec.rec_len - (rec.key_len
                                                        + rec.data_len));
+                       if (unc > 1)
+                               tally_add(uncoal, unc - 1);
+                       unc = 0;
                        break;
                case TDB_FREE_MAGIC:
                        tally_add(freet, rec.rec_len);
@@ -124,7 +114,7 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                case TDB_RECOVERY_INVALID_MAGIC:
                case 0x42424242:
                        unc++;
-                       rec.rec_len = dead_space(tdb, off) - sizeof(rec);
+                       rec.rec_len = tdb_dead_space(tdb, off) - sizeof(rec);
                        /* Fall through */
                case TDB_DEAD_MAGIC:
                        tally_add(dead, rec.rec_len);
@@ -135,15 +125,9 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                                 rec.magic, off));
                        goto unlock;
                }
-
-               if (unc &&
-                   (rec.magic == TDB_MAGIC || rec.magic == TDB_DEAD_MAGIC)) {
-                       tally_add(uncoal, unc);
-                       unc = 0;
-               }
        }
-       if (unc)
-               tally_add(uncoal, unc);
+       if (unc > 1)
+               tally_add(uncoal, unc - 1);
 
        for (off = 0; off < tdb->header.hash_size; off++)
                tally_add(hash, get_hash_length(tdb, off));
@@ -156,8 +140,6 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                extrag = tally_histogram(extra, HISTO_WIDTH, HISTO_HEIGHT);
                hashg = tally_histogram(hash, HISTO_WIDTH, HISTO_HEIGHT);
                uncoalg = tally_histogram(uncoal, HISTO_WIDTH, HISTO_HEIGHT);
-       } else {
-               freeg = keysg = datag = deadg = extrag = hashg = NULL;
        }
 
        /* 20 is max length of a %zu. */