armink / FlashDB

An ultra-lightweight database that supports key-value and time series data | 一款支持 KV 数据和时序数据的超轻量级数据库
Apache License 2.0
1.71k stars 399 forks source link

`db_lock()` and `db_unlock()` are not used in pairs in _fdb_kv_load() ? #246

Closed guoweilkd closed 9 months ago

guoweilkd commented 9 months ago

db_unlock() is called under the tag __exit, but db_lock() not called before the first goto __exit

static fdb_err_t _fdb_kv_load(fdb_kvdb_t db)
{
    fdb_err_t result = FDB_NO_ERR;
    struct fdb_kv kv;
    struct kvdb_sec_info sector;
    size_t check_failed_count = 0;

    db->in_recovery_check = true;
    /* check all sector header */
    sector_iterator(db, &sector, FDB_SECTOR_STORE_UNUSED, &check_failed_count, db, check_sec_hdr_cb, false);
    if (db->parent.not_formatable && check_failed_count > 0) {
        result = FDB_READ_ERR;
        goto __exit; //此时还未调用  db_lock(db);
    }
    /* all sector header check failed */
    if (check_failed_count == SECTOR_NUM) {
        FDB_INFO("All sector header is incorrect. Set it to default.\n");
        fdb_kv_set_default(db);
    }

    /* lock the KV cache */
    db_lock(db);
    /* check all sector header for recovery GC */
    sector_iterator(db, &sector, FDB_SECTOR_STORE_UNUSED, db, NULL, check_and_recovery_gc_cb, false);

__retry:
    /* check all KV for recovery */
    kv_iterator(db, &kv, db, NULL, check_and_recovery_kv_cb);
    if (db->gc_request) {
        gc_collect(db);
        goto __retry;
    }

    db->in_recovery_check = false;

__exit:
    /* unlock the KV cache */
    db_unlock(db);

    return result;
}
armink commented 9 months ago

image

确实,这里直接 return FDB_READ_ERR 就行了,你方便提交一笔 PR 修正下嘛