From ec88af5dd11a003beb8cd3fbe420f9d5e5dcf5d9 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 1 Dec 2010 23:51:41 +1030 Subject: [PATCH 1/1] tdb2: make summary command handle recovery "dead zone" We can run summary with a recovery area, or a dead zone. --- ccan/tdb2/check.c | 2 +- ccan/tdb2/private.h | 3 +++ ccan/tdb2/summary.c | 14 ++++++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ccan/tdb2/check.c b/ccan/tdb2/check.c index 3f5c5bd7..54f96bb0 100644 --- a/ccan/tdb2/check.c +++ b/ccan/tdb2/check.c @@ -381,7 +381,7 @@ static bool check_free_list(struct tdb_context *tdb, } /* Slow, but should be very rare. */ -static size_t dead_space(struct tdb_context *tdb, tdb_off_t off) +size_t dead_space(struct tdb_context *tdb, tdb_off_t off) { size_t len; diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 22014759..aebfa020 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -391,6 +391,9 @@ int set_header(struct tdb_context *tdb, unsigned int size_to_bucket(tdb_len_t data_len); tdb_off_t bucket_off(tdb_off_t flist_off, unsigned bucket); +/* Used by tdb_summary */ +size_t dead_space(struct tdb_context *tdb, tdb_off_t off); + /* io.c: */ /* Initialize tdb->methods. */ void tdb_io_init(struct tdb_context *tdb); diff --git a/ccan/tdb2/summary.c b/ccan/tdb2/summary.c index dd6fa399..97052608 100644 --- a/ccan/tdb2/summary.c +++ b/ccan/tdb2/summary.c @@ -53,17 +53,22 @@ static bool summarize(struct tdb_context *tdb, union { struct tdb_used_record u; struct tdb_free_record f; + struct tdb_recovery_record r; } 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 (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++; - } else { + } else if (frec_magic(&p->f) == TDB_FREE_MAGIC) { 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)); - } + } else + len = dead_space(tdb, off); } if (unc) tally_add(uncoal, unc); -- 2.39.2