From a2a2f53d8a581595b4c5d4c8f9e6619b5b572b05 Mon Sep 17 00:00:00 2001 From: eggcar Date: Sun, 5 Jul 2020 01:58:35 +0800 Subject: [PATCH] Fix: fdb_kv_iterate() now return and stats only active kvs (kv->status are FDB_KV_WRITE) --- src/fdb_kvdb.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/fdb_kvdb.c b/src/fdb_kvdb.c index a381af3..648e4b8 100644 --- a/src/fdb_kvdb.c +++ b/src/fdb_kvdb.c @@ -1645,26 +1645,28 @@ bool fdb_kv_iterate(fdb_kvdb_t db, fdb_kv_iterator_t itr) struct kvdb_sec_info sector; fdb_kv_t kv = &(itr->curr_kv); do { - if (read_sector_info(db, itr->sector_addr, §or, false) != FDB_NO_ERR) { - continue; - } - else if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) { - if (kv->addr.start == 0) { - kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE; - } - else if ((kv->addr.start = get_next_kv_addr(db, §or, kv)) == FAILED_ADDR) { - kv->addr.start = 0; - continue; - } - /* If iterator statistics is needed */ - itr->iterated_cnt++; - itr->iterated_obj_bytes += kv->len; - itr->iterated_value_bytes += kv->value_len; - - /* We got a valid kv here. */ - read_kv(db, kv); - return true; - } + if (read_sector_info(db, itr->sector_addr, §or, false) == FDB_NO_ERR) { + if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) { + if (kv->addr.start == 0) { + kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE; + } + else if ((kv->addr.start = get_next_kv_addr(db, §or, kv)) == FAILED_ADDR) { + kv->addr.start = 0; + continue; + } + do { + read_kv(db, kv); + if (kv->status == FDB_KV_WRITE) { + /* We got a valid kv here. */ + /* If iterator statistics is needed */ + itr->iterated_cnt++; + itr->iterated_obj_bytes += kv->len; + itr->iterated_value_bytes += kv->value_len; + return true; + } + } while((kv->addr.start = get_next_kv_addr(db, §or, kv)) != FAILED_ADDR); + } + } /** Set kv->addr.start to 0 when we get into a new sector so that if we successfully get the next sector info, * the kv->addr.start is set to the new sector.addr + SECTOR_HDR_DATA_SIZE. */