From 0159f97e940e29dcc61f0f036f86a0a6d13db8e3 Mon Sep 17 00:00:00 2001 From: Leonid Yuriev Date: Wed, 11 Jan 2023 01:08:30 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=20=D1=80=D0=B0=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=20=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=BE=D0=BC=20read-only=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Цель в предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая совсем не информативна для пользователя и возникает в этом случае (когда файл открыт read-only и короче запрошенного размера). --- ChangeLog.md | 6 ++++++ src/osal.c | 13 +++++++++---- src/osal.h | 5 ++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index dd1921a6..1dbd33b9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,12 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic ## v0.13 (в разработке) +Исправления (без корректировок новых функций): + + - Ограничиваем размер отображения при коротком read-only файле для + предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая совсем + не информативна для пользователя и возникает в этом случае. + Ликвидация технических долгов и мелочи: - Исправление опечаток. diff --git a/src/osal.c b/src/osal.c index 5e7606c1..dfe528e1 100644 --- a/src/osal.c +++ b/src/osal.c @@ -2160,9 +2160,8 @@ static int check_mmap_limit(const size_t limit) { return MDBX_SUCCESS; } -MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, - const size_t size, const size_t limit, - const unsigned options) { +MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, size_t size, + const size_t limit, const unsigned options) { assert(size <= limit); map->limit = 0; map->current = 0; @@ -2192,7 +2191,13 @@ MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, err = osal_filesize(map->fd, &map->filesize); if (err != MDBX_SUCCESS) return err; -#if !(defined(_WIN32) || defined(_WIN64)) +#if defined(_WIN32) || defined(_WIN64) + if (map->filesize < size) { + WARNING("file size (%zu) less than requested for mapping (%zu)", + (size_t)map->filesize, size); + size = (size_t)map->filesize; + } +#else map->current = (map->filesize > limit) ? limit : (size_t)map->filesize; #endif /* !Windows */ } diff --git a/src/osal.h b/src/osal.h index 6eb519aa..77277279 100644 --- a/src/osal.h +++ b/src/osal.h @@ -577,9 +577,8 @@ MDBX_INTERNAL_FUNC int osal_lockfile(mdbx_filehandle_t fd, bool wait); #define MMAP_OPTION_TRUNCATE 1 #define MMAP_OPTION_SEMAPHORE 2 -MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, - const size_t must, const size_t limit, - const unsigned options); +MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, size_t size, + const size_t limit, const unsigned options); MDBX_INTERNAL_FUNC int osal_munmap(osal_mmap_t *map); #define MDBX_MRESIZE_MAY_MOVE 0x00000100 #define MDBX_MRESIZE_MAY_UNMAP 0x00000200