mirror of
https://github.com/isar/libmdbx.git
synced 2025-08-25 21:54:28 +08:00
mdbx: add LCK-tracking to resolve double-open issue with POSIX-filelocks.
Change-Id: I29377000e4dde3c43527302b55d0daec58b709f5
This commit is contained in:
33
src/osal.h
33
src/osal.h
@@ -633,14 +633,39 @@ uint64_t mdbx_osal_16dot16_to_monotime(uint32_t seconds_16dot16);
|
||||
#define MDBX_OSAL_LOCK_SIGN UINT32_C(0x8017)
|
||||
#endif /* MDBX_OSAL_LOCK */
|
||||
|
||||
/// \brief Инициализация объектов синхронизации внутри текущего процесса
|
||||
/// связанных с экземпляром MDBX_env.
|
||||
/// \brief Инициализация объектов синхронизации связанных с экземпляром MDBX_env
|
||||
/// как общик в LCK-файле, так и внутри текущего процесса.
|
||||
/// \param
|
||||
/// global_uniqueness_flag = true - означает что сейчас в системе нет других
|
||||
/// процессов работающих с БД и LCK-файлом. Соответственно функция ДОЛЖНА
|
||||
/// инициализировать разделяемые объекты синхронизации расположенные
|
||||
/// в отображенном в память LCK-файле.
|
||||
/// global_uniqueness_flag = false - означает что в системе есть хотя-бы
|
||||
/// один другой процесс уже работающий с БД и LCK-файлом, в том числе
|
||||
/// БД уже может быть открыта текущим процессом. Соответственно функция
|
||||
/// НЕ должна инициализировать уже используемые разделяемые объекты
|
||||
/// синхронизации расположенные в отображенном в память LCK-файле.
|
||||
/// \return Код ошибки или 0 в случае успеха.
|
||||
int mdbx_lck_init(MDBX_env *env);
|
||||
int mdbx_lck_init(MDBX_env *env, int global_uniqueness_flag);
|
||||
|
||||
/// \brief Отключение от общих межпроцесных объектов и разрушение объектов
|
||||
/// синхронизации внутри текущего процесса связанных с экземпляром MDBX_env.
|
||||
void mdbx_lck_destroy(MDBX_env *env);
|
||||
/// \param
|
||||
/// inprocess_neighbor = NULL - если в текущем процессе нет других экземпляров
|
||||
/// MDBX_env связанных с закрываемой БД. Соответственно функция ДОЛЖНА
|
||||
/// своими средствами проверить, есть ли другие процесса работающие с БД
|
||||
/// и LCK-файлом, и в зависимости от этого разрушить или сохранить бъекты
|
||||
/// синхронизации расположенные в отображенном в память LCK-файле.
|
||||
/// inprocess_neighbor = не-NULL - тогда он указывает на другой (любой
|
||||
/// в случае нескольких) экземпляр MDBX_env работающей с БД и LCK-файлом
|
||||
/// внутри текущего процесса. Соответственно, функция НЕ должна пытаться
|
||||
/// захватывать эксклюзивную блокировки и/или пытаться разрушить общие
|
||||
/// объекты синхронизации связанные с БД и LCK-файлом. Кроме этого,
|
||||
/// реализация ДОЛЖНА обеспечить корректность работы других экземпляров
|
||||
/// MDBX_env внутри процесса - например, восстановить POSIX-fcntl блокировки
|
||||
/// после закрытия файловых дескрипторов.
|
||||
/// \return Код ошибки (MDBX_PANIC) или 0 в случае успеха.
|
||||
int mdbx_lck_destroy(MDBX_env *env, MDBX_env *inprocess_neighbor);
|
||||
|
||||
/// \brief Подключение к общим межпроцесным объектам блокировки с попыткой
|
||||
/// захвата блокировки максимального уровня (разделяемой при недоступности
|
||||
|
Reference in New Issue
Block a user