mdbx-windows: move the LockFileEx(LOCKFILE_FAIL_IMMEDIATELY) repeats for using in all cases.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev)
2025-09-07 12:14:03 +03:00
parent cd27aa017f
commit 74ef6502e3

View File

@@ -24,26 +24,35 @@ static int flock_with_event(HANDLE fd, HANDLE event, unsigned flags, size_t offs
ov.hEvent = event; ov.hEvent = event;
ov.Offset = (DWORD)offset; ov.Offset = (DWORD)offset;
ov.OffsetHigh = HIGH_DWORD(offset); ov.OffsetHigh = HIGH_DWORD(offset);
if (LockFileEx(fd, flags, 0, (DWORD)bytes, HIGH_DWORD(bytes), &ov)) {
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << %s", fd, event, flags, offset, bytes, "done");
return MDBX_SUCCESS;
}
DWORD rc = GetLastError(); int retry_left = (flags & LOCKFILE_FAIL_IMMEDIATELY) ? 3 : 0;
if (rc == ERROR_IO_PENDING) { while (true) {
if (event) { if (LockFileEx(fd, flags, 0, (DWORD)bytes, HIGH_DWORD(bytes), &ov)) {
if (GetOverlappedResult(fd, &ov, &rc, true)) { TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << %s", fd, event, flags, offset, bytes, "done");
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << %s", fd, event, flags, offset, bytes, return MDBX_SUCCESS;
"overlapped-done"); }
return MDBX_SUCCESS;
} DWORD rc = GetLastError();
rc = GetLastError(); if (rc == ERROR_IO_PENDING) {
} else if (event) {
CancelIo(fd); if (GetOverlappedResult(fd, &ov, &rc, true)) {
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << %s", fd, event, flags, offset, bytes,
"overlapped-done");
return MDBX_SUCCESS;
}
rc = GetLastError();
} else
CancelIo(fd);
}
if (rc != ERROR_LOCK_VIOLATION || --retry_left < 1) {
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << err %d", fd, event, flags, offset, bytes,
(int)rc);
return (int)rc;
}
SleepEx(0, true);
} }
TRACE("lock<<: fd %p, event %p, flags 0x%x offset %zu, bytes %zu << err %d", fd, event, flags, offset, bytes,
(int)rc);
return (int)rc;
} }
static inline int flock(HANDLE fd, unsigned flags, size_t offset, size_t bytes) { static inline int flock(HANDLE fd, unsigned flags, size_t offset, size_t bytes) {
@@ -94,14 +103,6 @@ int lck_txn_lock(MDBX_env *env, bool dontwait) {
const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd; const HANDLE fd4data = env->ioring.overlapped_fd ? env->ioring.overlapped_fd : env->lazy_fd;
int rc = flock_with_event(fd4data, env->dxb_lock_event, int rc = flock_with_event(fd4data, env->dxb_lock_event,
dontwait ? (LCK_EXCLUSIVE | LCK_DONTWAIT) : (LCK_EXCLUSIVE | LCK_WAITFOR), DXB_BODY); dontwait ? (LCK_EXCLUSIVE | LCK_DONTWAIT) : (LCK_EXCLUSIVE | LCK_WAITFOR), DXB_BODY);
if (rc == ERROR_LOCK_VIOLATION && dontwait) {
SleepEx(0, true);
rc = flock_with_event(fd4data, env->dxb_lock_event, LCK_EXCLUSIVE | LCK_DONTWAIT, DXB_BODY);
if (rc == ERROR_LOCK_VIOLATION) {
SleepEx(0, true);
rc = flock_with_event(fd4data, env->dxb_lock_event, LCK_EXCLUSIVE | LCK_DONTWAIT, DXB_BODY);
}
}
if (rc == MDBX_SUCCESS) { if (rc == MDBX_SUCCESS) {
done: done:
if (env->basal_txn) if (env->basal_txn)