From 169e69c52e3f5389ae8b8729e02a279c48a919bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Thu, 30 Nov 2023 22:53:28 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=BF=D0=BE=D0=B4=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0=20rp=5Faugment=5Flimit=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=82=20gc=5Ftime=5Flimit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Когда rp_augment_limit не задан пользователем посредством `MDBX_opt_rp_augment_limit`, то как и ранее он подстраивается в зависимости от текущего размера БД (актуального кол-ва страниц). Теперь-же авто-устанавливаемое значение rp_augment_limit вычисляется обратно-пропорционально `MDBX_opt_gc_time_limit`: - Если gc_time_limit == 0, то rp_augment_limit устанавливается в 1/3 от общего кол-ва страниц БД, но не меньше рационального минимума. Это соответствует прежнему поведению и обеспечивает достаточно глубокую переработку GC во всех не-экстремальных сценариях. - При gc_time_limit >= 16_секунд rp_augment_limit устанавливается в минимальное значение. - Когда 0 < gc_time_limit < 16_секунд rp_augment_limit устанавливается между минимумом и 1/3 от размера БД пропорционально остатку gc_time_limit до 16 секунд. Соответственно, при больших значениях gc_time_limit, выбирается меньшее значение rp_augment_limit, и контроль глубины переработки GC ограничивается в основном по-времени. --- src/core.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/core.c b/src/core.c index 1e0a400b..c8f47537 100644 --- a/src/core.c +++ b/src/core.c @@ -6423,11 +6423,21 @@ __cold static void munlock_all(const MDBX_env *env) { } __cold static unsigned default_rp_augment_limit(const MDBX_env *env) { - /* default rp_augment_limit = npages / 3 */ - const size_t augment = env->me_dbgeo.now / 3 >> env->me_psize2log; - eASSERT(env, augment < MDBX_PGL_LIMIT); - return pnl_bytes2size(pnl_size2bytes( - (augment > MDBX_PNL_INITIAL) ? augment : MDBX_PNL_INITIAL)); + const size_t timeframe = 16 << 16; + const size_t remain_1sec = + (env->me_options.gc_time_limit < timeframe) + ? timeframe - (size_t)env->me_options.gc_time_limit + : 0; + const size_t minimum = (env->me_maxgc_ov1page * 2 > MDBX_PNL_INITIAL) + ? env->me_maxgc_ov1page * 2 + : MDBX_PNL_INITIAL; + const size_t one_third = env->me_dbgeo.now / 3 >> env->me_psize2log; + const size_t augment_limit = + (one_third > minimum) + ? minimum + (one_third - minimum) / timeframe * remain_1sec + : minimum; + eASSERT(env, augment_limit < MDBX_PGL_LIMIT); + return pnl_bytes2size(pnl_size2bytes(augment_limit)); } static bool default_prefault_write(const MDBX_env *env) { @@ -25918,6 +25928,8 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option, if (env->me_txn && env->me_txn0->mt_owner != osal_thread_self()) return MDBX_EPERM; env->me_options.gc_time_limit = value; + if (!env->me_options.flags.non_auto.rp_augment_limit) + env->me_options.rp_augment_limit = default_rp_augment_limit(env); } break;