From 29bed7cf5dfedeccd799c529184bc53aee956e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Mon, 7 Apr 2025 12:13:27 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20`EAGAIN`=20=D0=BE?= =?UTF-8?q?=D1=82=20`flock()`=20=D0=B2=20=D1=81=D0=BB=D1=83=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=B0=20NFS.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api-copy.c | 22 ++++++++++++++++------ src/osal.c | 2 +- src/osal.h | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/api-copy.c b/src/api-copy.c index ca109d84..9f0ce892 100644 --- a/src/api-copy.c +++ b/src/api-copy.c @@ -766,14 +766,24 @@ __cold static int copy2pathname(MDBX_txn *txn, const pathchar_t *dest_path, MDBX lock_op.l_whence = SEEK_SET; lock_op.l_start = 0; lock_op.l_len = OFF_T_MAX; - if (MDBX_FCNTL(newfd, MDBX_F_SETLK, &lock_op) -#if (defined(__linux__) || defined(__gnu_linux__)) && defined(LOCK_EX) && \ - (!defined(__ANDROID_API__) || __ANDROID_API__ >= 24) - || flock(newfd, LOCK_EX | LOCK_NB) -#endif /* Linux */ - ) + if (MDBX_FCNTL(newfd, MDBX_F_SETLK, &lock_op)) rc = errno; } + +#if defined(LOCK_EX) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 24) + if (rc == MDBX_SUCCESS && flock(newfd, LOCK_EX | LOCK_NB)) { + const int err_flock = errno, err_fs = osal_check_fs_local(newfd, 0); + if (err_flock != EAGAIN || err_fs != MDBX_EREMOTE) { + ERROR("%s flock(%" MDBX_PRIsPATH ") error %d, remote-fs check status %d", "unexpected", dest_path, err_flock, + err_fs); + rc = err_flock; + } else { + WARNING("%s flock(%" MDBX_PRIsPATH ") error %d, remote-fs check status %d", "ignore", dest_path, err_flock, + err_fs); + } + } +#endif /* LOCK_EX && ANDROID_API >= 24 */ + #endif /* Windows / POSIX */ if (rc == MDBX_SUCCESS) diff --git a/src/osal.c b/src/osal.c index ec2e0d7c..0ba44b61 100644 --- a/src/osal.c +++ b/src/osal.c @@ -1745,7 +1745,7 @@ MDBX_INTERNAL int osal_check_fs_incore(mdbx_filehandle_t handle) { return MDBX_RESULT_FALSE; } -static int osal_check_fs_local(mdbx_filehandle_t handle, int flags) { +MDBX_INTERNAL int osal_check_fs_local(mdbx_filehandle_t handle, int flags) { #if defined(_WIN32) || defined(_WIN64) if (globals.running_under_Wine && !(flags & MDBX_EXCLUSIVE)) return ERROR_NOT_CAPABLE /* workaround for Wine */; diff --git a/src/osal.h b/src/osal.h index 484bbab8..06f58c60 100644 --- a/src/osal.h +++ b/src/osal.h @@ -481,6 +481,7 @@ MDBX_INTERNAL int osal_resume_threads_after_remap(mdbx_handle_array_t *array); MDBX_INTERNAL int osal_msync(const osal_mmap_t *map, size_t offset, size_t length, enum osal_syncmode_bits mode_bits); MDBX_INTERNAL int osal_check_fs_rdonly(mdbx_filehandle_t handle, const pathchar_t *pathname, int err); MDBX_INTERNAL int osal_check_fs_incore(mdbx_filehandle_t handle); +MDBX_INTERNAL int osal_check_fs_local(mdbx_filehandle_t handle, int flags); MDBX_MAYBE_UNUSED static inline uint32_t osal_getpid(void) { STATIC_ASSERT(sizeof(mdbx_pid_t) <= sizeof(uint32_t));