mirror of
https://github.com/isar/libmdbx.git
synced 2025-11-06 19:08:56 +08:00
mdbx: refine handling sys_allocation_granularity.
This commit is contained in:
@@ -1118,13 +1118,16 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
|
|||||||
}
|
}
|
||||||
|
|
||||||
const size_t unit_ps = (globals.sys_pagesize > (size_t)pagesize) ? globals.sys_pagesize : (size_t)pagesize;
|
const size_t unit_ps = (globals.sys_pagesize > (size_t)pagesize) ? globals.sys_pagesize : (size_t)pagesize;
|
||||||
const size_t unit_ag = (globals.sys_allocation_granularity > unit_ps) ? globals.sys_allocation_granularity : unit_ps;
|
const size_t unit_ag = (globals.sys_allocation_granularity > unit_ps &&
|
||||||
|
(growth_step < 0 || (size_t)growth_step >= globals.sys_allocation_granularity))
|
||||||
|
? globals.sys_allocation_granularity
|
||||||
|
: unit_ps;
|
||||||
size_lower = ceil_powerof2(size_lower, unit_ps);
|
size_lower = ceil_powerof2(size_lower, unit_ps);
|
||||||
size_upper = ceil_powerof2(size_upper, unit_ag);
|
size_upper = ceil_powerof2(size_upper, unit_ag);
|
||||||
size_now = ceil_powerof2(size_now, unit_ag);
|
size_now = ceil_powerof2(size_now, unit_ag);
|
||||||
|
|
||||||
/* LY: подбираем значение size_upper:
|
/* LY: подбираем значение size_upper:
|
||||||
* - кратное размеру страницы
|
* - кратное размеру unit_ag (размеру страницы БД и системному размеру выделения)
|
||||||
* - без нарушения MAX_MAPSIZE и MAX_PAGENO */
|
* - без нарушения MAX_MAPSIZE и MAX_PAGENO */
|
||||||
while (unlikely((size_t)size_upper > MAX_MAPSIZE || (uint64_t)size_upper / pagesize > MAX_PAGENO + 1)) {
|
while (unlikely((size_t)size_upper > MAX_MAPSIZE || (uint64_t)size_upper / pagesize > MAX_PAGENO + 1)) {
|
||||||
if ((size_t)size_upper < unit_ag + MIN_MAPSIZE || (size_t)size_upper < (size_t)pagesize * (MIN_PAGENO + 1)) {
|
if ((size_t)size_upper < unit_ag + MIN_MAPSIZE || (size_t)size_upper < (size_t)pagesize * (MIN_PAGENO + 1)) {
|
||||||
|
|||||||
@@ -570,7 +570,7 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
|
|
||||||
size_t expected_filesize = 0;
|
size_t expected_filesize = 0;
|
||||||
const size_t used_bytes = pgno2bytes(env, header.geometry.first_unallocated);
|
const size_t used_bytes = pgno2bytes(env, header.geometry.first_unallocated);
|
||||||
const size_t used_aligned2os_bytes = ceil_powerof2(used_bytes, globals.sys_pagesize);
|
const size_t used_aligned2os_bytes = ceil_powerof2(used_bytes, globals.sys_allocation_granularity);
|
||||||
if ((env->flags & MDBX_RDONLY) /* readonly */
|
if ((env->flags & MDBX_RDONLY) /* readonly */
|
||||||
|| lck_rc != MDBX_RESULT_TRUE /* not exclusive */
|
|| lck_rc != MDBX_RESULT_TRUE /* not exclusive */
|
||||||
|| /* recovery mode */ env->stuck_meta >= 0) {
|
|| /* recovery mode */ env->stuck_meta >= 0) {
|
||||||
@@ -843,13 +843,13 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
if (lck_rc == /* lck exclusive */ MDBX_RESULT_TRUE) {
|
if (lck_rc == /* lck exclusive */ MDBX_RESULT_TRUE) {
|
||||||
//-------------------------------------------------- shrink DB & update geo
|
//-------------------------------------------------- shrink DB & update geo
|
||||||
/* re-check size after mmap */
|
/* re-check size after mmap */
|
||||||
if ((env->dxb_mmap.current & (globals.sys_pagesize - 1)) != 0 || env->dxb_mmap.current < used_bytes) {
|
if (floor_powerof2(env->dxb_mmap.current, globals.sys_pagesize) < used_bytes) {
|
||||||
ERROR("unacceptable/unexpected datafile size %" PRIuPTR, env->dxb_mmap.current);
|
ERROR("unacceptable/unexpected datafile size %" PRIuPTR, env->dxb_mmap.current);
|
||||||
return MDBX_PROBLEM;
|
return MDBX_PROBLEM;
|
||||||
}
|
}
|
||||||
if (env->dxb_mmap.current != env->geo_in_bytes.now) {
|
if (env->dxb_mmap.current != env->geo_in_bytes.now) {
|
||||||
header.geometry.now = bytes2pgno(env, env->dxb_mmap.current);
|
header.geometry.now = bytes2pgno(env, env->geo_in_bytes.now);
|
||||||
NOTICE("need update meta-geo to filesize %" PRIuPTR " bytes, %" PRIaPGNO " pages", env->dxb_mmap.current,
|
NOTICE("need update meta-geo to filesize %" PRIuPTR " bytes, aligned %" PRIaPGNO " pages", env->geo_in_bytes.now,
|
||||||
header.geometry.now);
|
header.geometry.now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3517,7 +3517,8 @@ void osal_ctor(void) {
|
|||||||
SYSTEM_INFO si;
|
SYSTEM_INFO si;
|
||||||
GetSystemInfo(&si);
|
GetSystemInfo(&si);
|
||||||
globals.sys_pagesize = si.dwPageSize;
|
globals.sys_pagesize = si.dwPageSize;
|
||||||
globals.sys_allocation_granularity = si.dwAllocationGranularity;
|
globals.sys_allocation_granularity =
|
||||||
|
(si.dwAllocationGranularity > globals.sys_pagesize) ? si.dwAllocationGranularity : globals.sys_pagesize;
|
||||||
#else
|
#else
|
||||||
globals.sys_pagesize = sysconf(_SC_PAGE_SIZE);
|
globals.sys_pagesize = sysconf(_SC_PAGE_SIZE);
|
||||||
globals.sys_allocation_granularity = (MDBX_WORDBITS > 32) ? 65536 : 16384;
|
globals.sys_allocation_granularity = (MDBX_WORDBITS > 32) ? 65536 : 16384;
|
||||||
@@ -3533,8 +3534,9 @@ void osal_ctor(void) {
|
|||||||
globals.sys_allocation_granularity = globals.sys_unified_cache_block;
|
globals.sys_allocation_granularity = globals.sys_unified_cache_block;
|
||||||
}
|
}
|
||||||
#endif /* AT_UCACHEBSIZE */
|
#endif /* AT_UCACHEBSIZE */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
if (globals.sys_allocation_granularity > 4 * MEGABYTE && globals.sys_pagesize < MEGABYTE)
|
||||||
|
globals.sys_allocation_granularity = 4 * MEGABYTE;
|
||||||
assert(globals.sys_pagesize > 0 && (globals.sys_pagesize & (globals.sys_pagesize - 1)) == 0);
|
assert(globals.sys_pagesize > 0 && (globals.sys_pagesize & (globals.sys_pagesize - 1)) == 0);
|
||||||
assert(globals.sys_allocation_granularity >= globals.sys_pagesize &&
|
assert(globals.sys_allocation_granularity >= globals.sys_pagesize &&
|
||||||
globals.sys_allocation_granularity % globals.sys_pagesize == 0);
|
globals.sys_allocation_granularity % globals.sys_pagesize == 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user