mirror of
https://github.com/isar/libmdbx.git
synced 2024-12-29 09:48:49 +08:00
mdbx-doc: документирование mdbx_env_resurrect_after_fork()
.
This commit is contained in:
parent
5fc3965f5b
commit
94a6bc140d
@ -106,6 +106,7 @@ reservation can deplete system resources (trigger ENOMEM error, etc)
|
|||||||
when setting an inadequately large upper DB size using \ref
|
when setting an inadequately large upper DB size using \ref
|
||||||
mdbx_env_set_geometry() or \ref mdbx::env::geometry. So just avoid this.
|
mdbx_env_set_geometry() or \ref mdbx::env::geometry. So just avoid this.
|
||||||
|
|
||||||
|
|
||||||
## Remote filesystems
|
## Remote filesystems
|
||||||
Do not use MDBX databases on remote filesystems, even between processes
|
Do not use MDBX databases on remote filesystems, even between processes
|
||||||
on the same host. This breaks file locks on some platforms, possibly
|
on the same host. This breaks file locks on some platforms, possibly
|
||||||
@ -132,6 +133,11 @@ corruption in such cases.
|
|||||||
On the other hand, MDBX allow calling \ref mdbx_env_close() in such cases to
|
On the other hand, MDBX allow calling \ref mdbx_env_close() in such cases to
|
||||||
release resources, but no more and in general this is a wrong way.
|
release resources, but no more and in general this is a wrong way.
|
||||||
|
|
||||||
|
#### Since v0.13.1 and later
|
||||||
|
Начиная с версии 0.13.1 в API доступна функция \ref mdbx_env_resurrect_after_fork(),
|
||||||
|
которая позволяет пере-использовать в дочерних процессах уже открытую среду БД,
|
||||||
|
но строго без наследования транзакций от родительского процесса.
|
||||||
|
|
||||||
|
|
||||||
## Read-only mode
|
## Read-only mode
|
||||||
There is no pure read-only mode in a normal explicitly way, since
|
There is no pure read-only mode in a normal explicitly way, since
|
||||||
|
76
mdbx.h
76
mdbx.h
@ -2944,8 +2944,80 @@ LIBMDBX_INLINE_API(int, mdbx_env_close, (MDBX_env * env)) {
|
|||||||
return mdbx_env_close_ex(env, false);
|
return mdbx_env_close_ex(env, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(defined(_WIN32) || defined(_WIN64))
|
#if defined(DOXYGEN) || !(defined(_WIN32) || defined(_WIN64))
|
||||||
/** FIXME */
|
/** \brief Восстанавливает экземпляр среды в дочернем процессе после ветвления
|
||||||
|
* родительского процесса посредством `fork()` и родственных системных вызовов.
|
||||||
|
* \ingroup c_extra
|
||||||
|
*
|
||||||
|
* Без вызова \ref mdbx_env_resurrect_after_fork() использование открытого
|
||||||
|
* экземпляра среды в дочернем процессе не возможно, включая все выполняющиеся
|
||||||
|
* на момент ветвления транзакции.
|
||||||
|
*
|
||||||
|
* Выполняемые функцией действия можно рассматривать как повторное открытие БД
|
||||||
|
* в дочернем процессе, с сохранением заданных опций и адресов уже созданных
|
||||||
|
* экземпляров объектов связанных с API.
|
||||||
|
*
|
||||||
|
* \note Функция не доступна в ОС семейства Windows по причине отсутствия
|
||||||
|
* функционала ветвления процесса в API операционной системы.
|
||||||
|
*
|
||||||
|
* Ветвление не оказывает влияния на состояние MDBX-среды в родительском
|
||||||
|
* процессе. Все транзакции, которые были в родительском процессе на момент
|
||||||
|
* ветвления, после ветвления в родительском процессе продолжат выполняться без
|
||||||
|
* помех. Но в дочернем процессе все соответствующие транзакции безальтернативно
|
||||||
|
* перестают быть валидными, а попытка их использования приведет к возврату
|
||||||
|
* ошибки или отправке `SIGSEGV`.
|
||||||
|
*
|
||||||
|
* Использование экземпляра среды в дочернем процессе не возможно до вызова
|
||||||
|
* \ref mdbx_env_resurrect_after_fork(), так как в результате ветвления у
|
||||||
|
* процесса меняется PID, значение которого используется для организации
|
||||||
|
* совместно работы с БД, в том числе, для отслеживания процессов/потоков
|
||||||
|
* выполняющих читающие транзакции связанные с соответствующими снимками данных.
|
||||||
|
* Все активные на момент ветвления транзакции не могут продолжаться в дочернем
|
||||||
|
* процессе, так как не владеют какими-либо блокировками или каким-либо снимком
|
||||||
|
* данных и не удерживает его от переработки при сборке мусора.
|
||||||
|
*
|
||||||
|
* Функция \ref mdbx_env_resurrect_after_fork() восстанавливает переданный
|
||||||
|
* экземпляр среды в дочернем процессе после ветвления, а именно: обновляет
|
||||||
|
* используемые системные идентификаторы, повторно открывает дескрипторы файлов,
|
||||||
|
* производит захват необходимых блокировок связанных с LCK- и DXB-файлами БД,
|
||||||
|
* восстанавливает отображения в память страницы БД, таблицы читателей и
|
||||||
|
* служебных/вспомогательных данных в память. Однако унаследованные от
|
||||||
|
* родительского процесса транзакции не восстанавливаются, прием пишущие и
|
||||||
|
* читающие транзакции обрабатываются по-разному:
|
||||||
|
*
|
||||||
|
* - Пишущая транзакция, если таковая была на момент ветвления,
|
||||||
|
* прерывается в дочернем процессе с освобождение связанных с ней ресурсов,
|
||||||
|
* включая все вложенные транзакции.
|
||||||
|
*
|
||||||
|
* - Читающие же транзакции, если таковые были в родительском процессе,
|
||||||
|
* в дочернем процессе логически прерываются, но без освобождения ресурсов.
|
||||||
|
* Поэтому необходимо обеспечить вызов \ref mdbx_txn_abort() для каждой
|
||||||
|
* такой читающей транзакций в дочернем процессе, либо смириться с утечкой
|
||||||
|
* ресурсов до завершения дочернего процесса.
|
||||||
|
*
|
||||||
|
* Причина не-освобождения ресурсов читающих транзакций в том, что исторически
|
||||||
|
* MDBX не ведет какой-либо общий список экземпляров читающих, так как это не
|
||||||
|
* требуется для штатных режимов работы, но требует использования атомарных
|
||||||
|
* операций или дополнительных объектов синхронизации при создании/разрушении
|
||||||
|
* экземпляров \ref MDBX_txn.
|
||||||
|
*
|
||||||
|
* Вызов \ref mdbx_env_resurrect_after_fork() без ветвления, не в дочернем
|
||||||
|
* процессе, либо повторные вызовы не приводят к каким-либо действиям или
|
||||||
|
* изменениям.
|
||||||
|
*
|
||||||
|
* \returns Ненулевое значение ошибки при сбое и 0 при успешном выполнении,
|
||||||
|
* некоторые возможные ошибки таковы:
|
||||||
|
*
|
||||||
|
* \retval MDBX_BUSY В родительском процессе БД была открыта
|
||||||
|
* в режиме \ref MDBX_EXCLUSIVE.
|
||||||
|
*
|
||||||
|
* \retval MDBX_EBADSIGN При повреждении сигнатуры экземпляра объекта, а также
|
||||||
|
* в случае одновременного вызова \ref
|
||||||
|
* mdbx_env_resurrect_after_fork() из разных потоков.
|
||||||
|
*
|
||||||
|
* \retval MDBX_PANIC Произошла критическая ошибка при восстановлении
|
||||||
|
* экземпляра среды, либо такая ошибка уже была
|
||||||
|
* до вызова функции. */
|
||||||
LIBMDBX_API int mdbx_env_resurrect_after_fork(MDBX_env *env);
|
LIBMDBX_API int mdbx_env_resurrect_after_fork(MDBX_env *env);
|
||||||
#endif /* Windows */
|
#endif /* Windows */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user