]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb/summary.c
tdb: fix uncoalesced record count in tdb_summary.
[ccan] / ccan / tdb / summary.c
index a8f2b71bf1ff1ae4f741cc6179dd018e1afb178a..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;
@@ -117,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);
@@ -126,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);
@@ -137,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));