From efdcbd8c356fbf619c9e7968e95a4d8629a180f8 Mon Sep 17 00:00:00 2001 From: Leo Yuriev Date: Wed, 13 Jun 2018 02:43:44 +0300 Subject: [PATCH] mdbx: disable non-blocking DB-close under Windows. Change-Id: If6579467132439b6b627e756f67f6bd35fed8b4f --- src/mdbx.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/mdbx.c b/src/mdbx.c index be93a46c..82ca0aad 100644 --- a/src/mdbx.c +++ b/src/mdbx.c @@ -5945,8 +5945,19 @@ int __cold mdbx_env_close_ex(MDBX_env *env, int dont_sync) { env->me_txn0->mt_owner != mdbx_thread_self()) return MDBX_BUSY; if (!dont_sync) { +#if defined(_WIN32) || defined(_WIN64) + /* On windows, without blocking is impossible to determine whether another + * process is running a writing transaction or not. + * Because in the "owner died" condition kernel don't release + * file lock immediately. */ + rc = mdbx_env_sync_ex(env, true, false); +#else rc = mdbx_env_sync_ex(env, true, true); - rc = (rc == MDBX_BUSY) ? MDBX_SUCCESS : rc; + rc = (rc == MDBX_BUSY || rc == EAGAIN || rc == EACCES || rc == EBUSY || + rc == EWOULDBLOCK) + ? MDBX_SUCCESS + : rc; +#endif } }