mirror of
https://github.com/isar/libmdbx.git
synced 2025-09-10 01:32:22 +08:00
mdbx: устранение гонки в tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP)
при работе в разных потоках.
Проблема была в том, что в случаях фиксированного размера значений clc.lmin/clc.lmax устанавливались в env->kvs[], а затем корректировались по актуальному размеру данных в БД. Поэтому при конкурентном вызове из разных потоков, один поток мог выполнять инициализацию, а второй прочитать временные/промежуточные значения lmin/lmax. В результате, при конкурентном старте транзакций в разных потоках при использовании только-что открытого dbi-хендла, проверка допустимости длины значения могла заканчиваться ложной ошибкой MDBX_BAD_VALSIZE.
This commit is contained in:
@@ -200,6 +200,10 @@ static inline bool check_table_flags(unsigned flags) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline int tbl_setup_ifneed(const MDBX_env *env, volatile kvx_t *const kvx, const tree_t *const db) {
|
||||
return likely(kvx->clc.v.lmax) ? MDBX_SUCCESS : tbl_setup(env, kvx, db);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
MDBX_NOTHROW_PURE_FUNCTION static inline size_t pgno2bytes(const MDBX_env *env, size_t pgno) {
|
||||
|
Reference in New Issue
Block a user