mdbx: доработка эвристик для выбора/подстройки default-значений в mdbx_env_set_geometry().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-01-10 23:17:50 +03:00
parent 820bd45818
commit 9c8f90b713

View File

@ -956,7 +956,7 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
const bool inside_txn = txn0_owned && env->txn; const bool inside_txn = txn0_owned && env->txn;
bool should_unlock = false; bool should_unlock = false;
#if MDBX_DEBUG #if MDBX_DEBUG && 0 /* минимальные шаги для проверки/отладки уже не нужны */
if (growth_step < 0) { if (growth_step < 0) {
growth_step = 1; growth_step = 1;
if (shrink_threshold < 0) if (shrink_threshold < 0)
@ -1045,9 +1045,10 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
goto bailout; goto bailout;
} }
const bool size_lower_default = size_lower < 0;
if (size_lower <= 0) { if (size_lower <= 0) {
size_lower = MIN_MAPSIZE; size_lower = (size_lower == 0) ? MIN_MAPSIZE : pagesize * MDBX_WORDBITS;
if (MIN_MAPSIZE / pagesize < MIN_PAGENO) if (size_lower / pagesize < MIN_PAGENO)
size_lower = MIN_PAGENO * pagesize; size_lower = MIN_PAGENO * pagesize;
} }
if (size_lower >= INTPTR_MAX) { if (size_lower >= INTPTR_MAX) {
@ -1056,11 +1057,6 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
size_lower = pagesize * (MAX_PAGENO + 1); size_lower = pagesize * (MAX_PAGENO + 1);
} }
if (size_now <= 0) {
size_now = size_lower;
if (size_upper >= size_lower && size_now > size_upper)
size_now = size_upper;
}
if (size_now >= INTPTR_MAX) { if (size_now >= INTPTR_MAX) {
size_now = reasonable_db_maxsize(); size_now = reasonable_db_maxsize();
if ((size_t)size_now / pagesize > MAX_PAGENO + 1) if ((size_t)size_now / pagesize > MAX_PAGENO + 1)
@ -1068,9 +1064,9 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
} }
if (size_upper <= 0) { if (size_upper <= 0) {
if (growth_step == 0 || size_upper == 0) if ((growth_step == 0 || size_upper == 0) && size_now >= size_lower)
size_upper = size_now; size_upper = size_now;
else if (size_now >= reasonable_db_maxsize() / 2) else if (size_now <= 0 || size_now >= reasonable_db_maxsize() / 2)
size_upper = reasonable_db_maxsize(); size_upper = reasonable_db_maxsize();
else if ((size_t)size_now >= MAX_MAPSIZE32 / 2 && (size_t)size_now <= MAX_MAPSIZE32 / 4 * 3) else if ((size_t)size_now >= MAX_MAPSIZE32 / 2 && (size_t)size_now <= MAX_MAPSIZE32 / 4 * 3)
size_upper = MAX_MAPSIZE32; size_upper = MAX_MAPSIZE32;
@ -1089,13 +1085,21 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
} }
if (unlikely(size_lower < (intptr_t)MIN_MAPSIZE || size_lower > size_upper)) { if (unlikely(size_lower < (intptr_t)MIN_MAPSIZE || size_lower > size_upper)) {
/* паранойа на случай переполнения при невероятных значениях */
rc = MDBX_EINVAL; rc = MDBX_EINVAL;
goto bailout; goto bailout;
} }
if (size_now <= 0) {
size_now = size_lower;
if (size_upper >= size_lower && size_now > size_upper)
size_now = size_upper;
}
if ((uint64_t)size_lower / pagesize < MIN_PAGENO) { if ((uint64_t)size_lower / pagesize < MIN_PAGENO) {
size_lower = pagesize * MIN_PAGENO; size_lower = pagesize * MIN_PAGENO;
if (unlikely(size_lower > size_upper)) { if (unlikely(size_lower > size_upper)) {
/* паранойа на случай переполнения при невероятных значениях */
rc = MDBX_EINVAL; rc = MDBX_EINVAL;
goto bailout; goto bailout;
} }
@ -1135,12 +1139,17 @@ __cold int mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t si
if (growth_step < 0) { if (growth_step < 0) {
growth_step = ((size_t)(size_upper - size_lower)) / 42; growth_step = ((size_t)(size_upper - size_lower)) / 42;
if (growth_step > size_lower && size_lower < (intptr_t)MEGABYTE) if (!size_lower_default && growth_step > size_lower && size_lower < (intptr_t)MEGABYTE)
growth_step = size_lower; growth_step = size_lower;
else if (growth_step / size_lower > 64)
growth_step = size_lower << 6;
if (growth_step < 65536) if (growth_step < 65536)
growth_step = 65536; growth_step = 65536;
if ((size_t)growth_step > MAX_MAPSIZE / 64) if ((size_upper - size_lower) / growth_step > 65536)
growth_step = MAX_MAPSIZE / 64; growth_step = (size_upper - size_lower) >> 16;
const intptr_t growth_step_limit = MEGABYTE * ((MDBX_WORDBITS > 32) ? 4096 : 256);
if (growth_step > growth_step_limit)
growth_step = growth_step_limit;
} }
if (growth_step == 0 && shrink_threshold > 0) if (growth_step == 0 && shrink_threshold > 0)
growth_step = 1; growth_step = 1;