FlashDB icon indicating copy to clipboard operation
FlashDB copied to clipboard

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

Open Zmmfly opened this issue 1 year ago • 2 comments

设了锁后,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_default: https://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

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

Zmmfly avatar Jan 23 '24 05:01 Zmmfly

是的,我也遇到这个问题,第一次初始化时如果用了操作系统的锁功能会出现死锁卡死,我的环境是: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); }

doctor1cong avatar Apr 24 '24 08:04 doctor1cong

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

欢迎提交 PR 哈

armink avatar Apr 24 '24 12:04 armink