mirror of
				https://github.com/isar/libmdbx.git
				synced 2025-10-31 03:29:01 +08:00 
			
		
		
		
	mdbx: игнорирование EAGAIN от flock() в случае копирования на NFS.
				
					
				
			This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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 */; | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user