armink / FlashDB

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

用文件作为存储后端,有锁首次初始化时,_fdb_kv_load 中调用 fdb_kv_set_default 死锁 #276

Open Zmmfly opened 5 months ago

Zmmfly commented 5 months ago

设了锁后,fdb_kvdb_init里调了一次db_lock: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1757-L1758

再在 _fdb_kv_load里检查到失败计数check_failed_countSECTOR_NUM相等时,调用fdb_kv_set_defaulthttps://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1643-L1646

fdb_kv_set_default里又调一次db_lock: https://github.com/armink/FlashDB/blob/c1226f337a876f55c7c527634bb8729ae16b5c99/src/fdb_kvdb.c#L1392-L1399

用递归锁可以规避,但是文档中没有见到相关描述

doctor1cong commented 2 months ago

是的,我也遇到这个问题,第一次初始化时如果用了操作系统的锁功能会出现死锁卡死,我的环境是:STM32F429+FreeRTOS.使用互斥锁会卡死在: / 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); },我看好多人反馈这个问题了,作者是不继续维护了吗?

我的解决方法:进入fdb_kv_set_default()前先解锁。 / all sector header check failed / if (check_failed_count == SECTOR_NUM) { FDB_INFO("All sector header is incorrect. Set it to default.\n");
/ unlock the KVDB / db_unlock(db); //if not unlock will cause a deadlock in "fdb_kv_set_default(db);" fdb_kv_set_default(db); }

armink commented 2 months ago

我这边没有用过 FreeRTOS 呢,RT-Thread/Zephyr 及 PC 系统 Linux/Windows/MACOS + GCC 都没有问题的

欢迎提交 PR 哈