mirror of
https://github.com/isar/libmdbx.git
synced 2025-11-06 19:08:56 +08:00
mdbx: переработка ошибок файловых блокировок в API копирования с устранением проблемы на OSX.
На POSIX-платформах внутри API копирования используются файловый блокировки `fcntl(F_SETLK)` и `flock()`, так как только совместное использование обеспечивает блокировку на всех платформах и файловых системах, включая NFS и SMB. Однако, в зависимости от платформы, версии ядра ОС, типа файловой системы, а в случае NFS/SMB также от удаленной стороны, используемые системные файловые блокировки могут не работать или конфликтовать между собой (в частности на OSX). Поэтому в этом коммите реализуется более гибкий подход. Если кратко, то допускается отказ одной из блокировок при успехе другой: - При успехе fcntl(F_SETLK) допускается EAGAIN/EWOULDBLOCK и EREMOTEIO от flock(), если целевой файл на не-локальной файловой системе, а также на не-Linux платформах, где одновременная блокировка может быть не разрешена fcntl(F_SETLK) и flock(). - При успехе flock() допускается ENOTSUP и REMOTEIO от fcntl(F_SETLK), если целевой файл на не-локальной файловой системе.
This commit is contained in:
@@ -389,6 +389,11 @@ MDBX_MAYBE_UNUSED MDBX_CONST_FUNCTION static inline int ignore_enosys_and_eagain
|
||||
MDBX_MAYBE_UNUSED MDBX_CONST_FUNCTION static inline int ignore_enosys_and_einval(int err) {
|
||||
return (err == EINVAL) ? MDBX_RESULT_TRUE : ignore_enosys(err);
|
||||
}
|
||||
|
||||
MDBX_MAYBE_UNUSED MDBX_CONST_FUNCTION static inline int ignore_enosys_and_eremote(int err) {
|
||||
return (err == MDBX_EREMOTE) ? MDBX_RESULT_TRUE : ignore_enosys(err);
|
||||
}
|
||||
|
||||
#endif /* defined(_WIN32) || defined(_WIN64) */
|
||||
|
||||
static inline int check_env(const MDBX_env *env, const bool wanna_active) {
|
||||
|
||||
Reference in New Issue
Block a user