From 63e80faf9b42fbe73e25c804dd734b6179e42c24 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 19 Apr 2011 23:04:13 +0930 Subject: [PATCH] tdb2: fix tdb_summary reports 1) Fix the bogus reporting of uncoalesced runs: there has to be more than 1 free record to make a "run", and any other record interrups the run. 2) Fix the bogus data count in the top line (which was number of records, not bytes). 3) Remove the count of free buckets: it's now a constant. --- ccan/tdb2/summary.c | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/ccan/tdb2/summary.c b/ccan/tdb2/summary.c index a369f30e..26cdd3e4 100644 --- a/ccan/tdb2/summary.c +++ b/ccan/tdb2/summary.c @@ -45,7 +45,6 @@ static enum TDB_ERROR summarize(struct tdb_context *tdb, struct tally *data, struct tally *extra, struct tally *uncoal, - struct tally *buckets, struct tally *chains) { tdb_off_t off; @@ -65,24 +64,22 @@ static enum TDB_ERROR summarize(struct tdb_context *tdb, if (TDB_PTR_IS_ERR(p)) { return TDB_PTR_ERR(p); } - if (p->r.magic == TDB_RECOVERY_INVALID_MAGIC - || p->r.magic == TDB_RECOVERY_MAGIC) { - if (unc) { + if (frec_magic(&p->f) != TDB_FREE_MAGIC) { + if (unc > 1) { tally_add(uncoal, unc); unc = 0; } + } + + if (p->r.magic == TDB_RECOVERY_INVALID_MAGIC + || p->r.magic == TDB_RECOVERY_MAGIC) { len = sizeof(p->r) + p->r.max_len; } else if (frec_magic(&p->f) == TDB_FREE_MAGIC) { len = frec_len(&p->f); tally_add(fr, len); - tally_add(buckets, size_to_bucket(len)); len += sizeof(p->u); unc++; } else if (rec_magic(&p->u) == TDB_USED_MAGIC) { - if (unc) { - tally_add(uncoal, unc); - unc = 0; - } len = sizeof(p->u) + rec_key_length(&p->u) + rec_data_length(&p->u) @@ -138,7 +135,6 @@ static enum TDB_ERROR summarize(struct tdb_context *tdb, "Smallest/average/largest free records: %zu/%zu/%zu\n%s" \ "Number of uncoalesced records: %zu\n" \ "Smallest/average/largest uncoalesced runs: %zu/%zu/%zu\n%s" \ - "Number of free lists: %zu\n%s" \ "Toplevel hash used: %u of %u\n" \ "Number of chains: %zu\n" \ "Number of subhashes: %zu\n" \ @@ -161,11 +157,11 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, { tdb_len_t len; struct tally *ftables, *hashes, *freet, *keys, *data, *extra, *uncoal, - *buckets, *chains; - char *hashesg, *freeg, *keysg, *datag, *extrag, *uncoalg, *bucketsg; + *chains; + char *hashesg, *freeg, *keysg, *datag, *extrag, *uncoalg; enum TDB_ERROR ecode; - hashesg = freeg = keysg = datag = extrag = uncoalg = bucketsg = NULL; + hashesg = freeg = keysg = datag = extrag = uncoalg = NULL; ecode = tdb_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, false); if (ecode != TDB_SUCCESS) { @@ -186,10 +182,9 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, data = tally_new(HISTO_HEIGHT); extra = tally_new(HISTO_HEIGHT); uncoal = tally_new(HISTO_HEIGHT); - buckets = tally_new(HISTO_HEIGHT); chains = tally_new(HISTO_HEIGHT); if (!ftables || !hashes || !freet || !keys || !data || !extra - || !uncoal || !buckets || !chains) { + || !uncoal || !chains) { ecode = tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR, "tdb_summary: failed to allocate" " tally structures"); @@ -197,7 +192,7 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, } ecode = summarize(tdb, hashes, ftables, freet, keys, data, extra, - uncoal, buckets, chains); + uncoal, chains); if (ecode != TDB_SUCCESS) { goto unlock; } @@ -209,7 +204,6 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, datag = tally_histogram(data, HISTO_WIDTH, HISTO_HEIGHT); extrag = tally_histogram(extra, HISTO_WIDTH, HISTO_HEIGHT); uncoalg = tally_histogram(uncoal, HISTO_WIDTH, HISTO_HEIGHT); - bucketsg = tally_histogram(buckets, HISTO_WIDTH, HISTO_HEIGHT); } /* 20 is max length of a %llu. */ @@ -219,8 +213,7 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, + (keysg ? strlen(keysg) : 0) + (datag ? strlen(datag) : 0) + (extrag ? strlen(extrag) : 0) - + (uncoalg ? strlen(uncoalg) : 0) - + (bucketsg ? strlen(bucketsg) : 0); + + (uncoalg ? strlen(uncoalg) : 0); *summary = malloc(len); if (!*summary) { @@ -231,7 +224,7 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, sprintf(*summary, SUMMARY_FORMAT, (size_t)tdb->file->map_size, - tally_num(keys) + tally_num(data), + tally_total(keys, NULL) + tally_total(data, NULL), tally_num(keys), tally_min(keys), tally_mean(keys), tally_max(keys), keysg ? keysg : "", @@ -245,8 +238,6 @@ enum TDB_ERROR tdb_summary(struct tdb_context *tdb, tally_total(uncoal, NULL), tally_min(uncoal), tally_mean(uncoal), tally_max(uncoal), uncoalg ? uncoalg : "", - tally_num(buckets), - bucketsg ? bucketsg : "", (unsigned)count_hash(tdb, offsetof(struct tdb_header, hashtable), TDB_TOPLEVEL_HASH_BITS), @@ -276,9 +267,7 @@ unlock: free(datag); free(extrag); free(uncoalg); - free(bucketsg); free(hashes); - free(buckets); free(freet); free(keys); free(data); -- 2.39.2