tdb2: make summary command handle recovery "dead zone"
[ccan] / ccan / tdb2 / summary.c
index dd6fa399e7e6cc38f9419e0ea96b73ac18df420a..97052608fc866735156ab5938bf827ea8f653242 100644 (file)
@@ -53,17 +53,22 @@ static bool summarize(struct tdb_context *tdb,
                union {
                        struct tdb_used_record u;
                        struct tdb_free_record f;
                union {
                        struct tdb_used_record u;
                        struct tdb_free_record f;
+                       struct tdb_recovery_record r;
                } pad, *p;
                } pad, *p;
-               p = tdb_get(tdb, off, &pad, sizeof(pad));
+               /* We might not be able to get the whole thing. */
+               p = tdb_get(tdb, off, &pad, sizeof(p->f));
                if (!p)
                        return false;
                if (!p)
                        return false;
-               if (rec_magic(&p->u) != TDB_MAGIC) {
+               if (p->r.magic == TDB_RECOVERY_INVALID_MAGIC
+                   || p->r.magic == TDB_RECOVERY_MAGIC) {
+                       len = sizeof(p->r) + p->r.max_len;
+               } else if (rec_magic(&p->u) != TDB_MAGIC) {
                        len = p->f.data_len;
                        tally_add(free, len);
                        tally_add(buckets, size_to_bucket(len));
                        len += sizeof(p->u);
                        unc++;
                        len = p->f.data_len;
                        tally_add(free, len);
                        tally_add(buckets, size_to_bucket(len));
                        len += sizeof(p->u);
                        unc++;
-               } else {
+               } else if (frec_magic(&p->f) == TDB_FREE_MAGIC) {
                        if (unc) {
                                tally_add(uncoal, unc);
                                unc = 0;
                        if (unc) {
                                tally_add(uncoal, unc);
                                unc = 0;
@@ -91,7 +96,8 @@ static bool summarize(struct tdb_context *tdb,
                                tally_add(data, rec_data_length(&p->u));
                        }
                        tally_add(extra, rec_extra_padding(&p->u));
                                tally_add(data, rec_data_length(&p->u));
                        }
                        tally_add(extra, rec_extra_padding(&p->u));
-               }
+               } else
+                       len = dead_space(tdb, off);
        }
        if (unc)
                tally_add(uncoal, unc);
        }
        if (unc)
                tally_add(uncoal, unc);