mdbx-windows: устранение регресса ERROR_SHARING_VIOLATION в режиме MDBX_EXCLUSIVE.

Спасибо maxc0d3r@protonmail.com за сообщение о проблеме.
This commit is contained in:
Leonid Yuriev 2023-01-11 21:09:50 +03:00 committed by Леонид Юрьев (Leonid Yuriev)
parent 0159f97e94
commit 9e15bd9b29
3 changed files with 17 additions and 3 deletions

View File

@ -6,8 +6,17 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic
## v0.13 (в разработке)
Благодарности:
- Max <maxc0d3r@protonmail.com> за сообщение о проблеме ERROR_SHARING_VIOLATION
в режиме MDBX_EXCLUSIVE на Windows.
Исправления (без корректировок новых функций):
- Устранение регресса после коммита 474391c83c5f81def6fdf3b0b6f5716a87b78fbf
приводящего к возврату ERROR_SHARING_VIOLATION в Windows при открытии БД
в режиме MDBX_EXCLUSIVE для чтения-записи.
- Ограничиваем размер отображения при коротком read-only файле для
предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая совсем
не информативна для пользователя и возникает в этом случае.

View File

@ -14892,7 +14892,8 @@ __cold int mdbx_env_openW(MDBX_env *env, const wchar_t *pathname,
#if defined(_WIN32) || defined(_WIN64)
eASSERT(env, env->me_overlapped_fd == 0);
bool ior_direct = false;
if (!(flags & (MDBX_RDONLY | MDBX_SAFE_NOSYNC | MDBX_NOMETASYNC))) {
if (!(flags &
(MDBX_RDONLY | MDBX_SAFE_NOSYNC | MDBX_NOMETASYNC | MDBX_EXCLUSIVE))) {
if (MDBX_AVOID_MSYNC && (flags & MDBX_WRITEMAP)) {
/* Запрошен режим MDBX_SAFE_NOSYNC | MDBX_WRITEMAP при активной опции
* MDBX_AVOID_MSYNC.
@ -14964,7 +14965,11 @@ __cold int mdbx_env_openW(MDBX_env *env, const wchar_t *pathname,
osal_fseek(env->me_lfd, safe_parking_lot_offset);
eASSERT(env, env->me_dsync_fd == INVALID_HANDLE_VALUE);
if (!(flags & (MDBX_RDONLY | MDBX_SAFE_NOSYNC | MDBX_DEPRECATED_MAPASYNC))) {
if (!(flags & (MDBX_RDONLY | MDBX_SAFE_NOSYNC | MDBX_DEPRECATED_MAPASYNC
#if defined(_WIN32) || defined(_WIN64)
| MDBX_EXCLUSIVE
#endif /* !Windows */
))) {
rc = osal_openfile(MDBX_OPEN_DXB_DSYNC, env, env_pathname.dxb,
&env->me_dsync_fd, 0);
if (MDBX_IS_ERROR(rc))

View File

@ -1160,7 +1160,7 @@ MDBX_INTERNAL_FUNC void osal_ioring_destroy(osal_ioring_t *ior) {
#else
osal_free(ior->pool);
#endif
memset(ior, -1, sizeof(osal_ioring_t));
memset(ior, 0, sizeof(osal_ioring_t));
}
/*----------------------------------------------------------------------------*/