mdbx: ограничиваем размер отображения при коротком read-only файле.

Цель в предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая
совсем не информативна для пользователя и возникает в этом случае (когда
файл открыт read-only и короче запрошенного размера).
This commit is contained in:
Leonid Yuriev 2023-01-11 01:08:30 +03:00 committed by Леонид Юрьев (Leonid Yuriev)
parent 56050f201f
commit 0159f97e94
3 changed files with 17 additions and 7 deletions

View File

@ -6,6 +6,12 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic
## v0.13 (в разработке) ## v0.13 (в разработке)
Исправления (без корректировок новых функций):
- Ограничиваем размер отображения при коротком read-only файле для
предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая совсем
не информативна для пользователя и возникает в этом случае.
Ликвидация технических долгов и мелочи: Ликвидация технических долгов и мелочи:
- Исправление опечаток. - Исправление опечаток.

View File

@ -2160,9 +2160,8 @@ static int check_mmap_limit(const size_t limit) {
return MDBX_SUCCESS; return MDBX_SUCCESS;
} }
MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, size_t size,
const size_t size, const size_t limit, const size_t limit, const unsigned options) {
const unsigned options) {
assert(size <= limit); assert(size <= limit);
map->limit = 0; map->limit = 0;
map->current = 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); err = osal_filesize(map->fd, &map->filesize);
if (err != MDBX_SUCCESS) if (err != MDBX_SUCCESS)
return err; 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; map->current = (map->filesize > limit) ? limit : (size_t)map->filesize;
#endif /* !Windows */ #endif /* !Windows */
} }

View File

@ -577,9 +577,8 @@ MDBX_INTERNAL_FUNC int osal_lockfile(mdbx_filehandle_t fd, bool wait);
#define MMAP_OPTION_TRUNCATE 1 #define MMAP_OPTION_TRUNCATE 1
#define MMAP_OPTION_SEMAPHORE 2 #define MMAP_OPTION_SEMAPHORE 2
MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, MDBX_INTERNAL_FUNC int osal_mmap(const int flags, osal_mmap_t *map, size_t size,
const size_t must, const size_t limit, const size_t limit, const unsigned options);
const unsigned options);
MDBX_INTERNAL_FUNC int osal_munmap(osal_mmap_t *map); MDBX_INTERNAL_FUNC int osal_munmap(osal_mmap_t *map);
#define MDBX_MRESIZE_MAY_MOVE 0x00000100 #define MDBX_MRESIZE_MAY_MOVE 0x00000100
#define MDBX_MRESIZE_MAY_UNMAP 0x00000200 #define MDBX_MRESIZE_MAY_UNMAP 0x00000200