diff --git a/ChangeLog.md b/ChangeLog.md index 51269f92..b65bf5ff 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -66,7 +66,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic интеграции с легковесными потоками/нитями их мультиплексирования вместе с транзакциями по потокам операционной системы. - - TODO: Опция `MDBX_opt_prefer_waf_insteadof_balance`. + - Опция `MDBX_opt_prefer_waf_insteadof_balance`. - TODO: Опции `MDBX_opt_subpage_limit`, `MDBX_opt_subpage_room_threshold`, `MDBX_opt_subpage_reserve_prereq`, `MDBX_opt_subpage_reserve_limit`. diff --git a/mdbx.h b/mdbx.h index 98f9a866..e19e47c8 100644 --- a/mdbx.h +++ b/mdbx.h @@ -2320,14 +2320,14 @@ enum MDBX_option_t { MDBX_opt_spill_parent4child_denominator, /** \brief Controls the in-process threshold of semi-empty pages merge. - * \warning This is experimental option and subject for change or removal. * \details This option controls the in-process threshold of minimum page * fill, as used space of percentage of a page. Neighbour pages emptier than * this value are candidates for merging. The threshold value is specified * in 1/65536 of percent, which is equivalent to the 16-dot-16 fixed point * format. The specified value must be in the range from 12.5% (almost empty) * to 50% (half empty) which corresponds to the range from 8192 and to 32768 - * in units respectively. */ + * in units respectively. + * \see MDBX_opt_prefer_waf_insteadof_balance */ MDBX_opt_merge_threshold_16dot16_percent, /** \brief Controls the choosing between use write-through disk writes and @@ -2388,7 +2388,32 @@ enum MDBX_option_t { * С другой стороны, при минимальном значении (включая 0) * `MDBX_opt_rp_augment_limit` переработка GC будет ограничиваться * преимущественно затраченным временем. */ - MDBX_opt_gc_time_limit + MDBX_opt_gc_time_limit, + + /** \brief Управляет выбором между стремлением к равномерности наполнения + * страниц, либо уменьшением количества измененных и записанных страниц. + * + * \details После операций удаления страницы содержащие меньше минимума + * ключей, либо опустошенные до \ref MDBX_opt_merge_threshold_16dot16_percent + * подлежат слиянию с одной из соседних. Если страницы справа и слева от + * текущей обе «грязные» (были изменены в ходе транзакции и должны быть + * записаны на диск), либо обе «чисты» (не изменялись в текущей транзакции), + * то целью для слияния всегда выбирается менее заполненная страница. + * Когда же только одна из соседствующих является «грязной», а другая + * «чистой», то возможны две тактики выбора цели для слияния: + * + * - Если `MDBX_opt_prefer_waf_insteadof_balance = True`, то будет выбрана + * уже измененная страница, что НЕ УВЕЛИЧИТ количество измененных страниц + * и объем записи на диск при фиксации текущей транзакции, но в среднем + * будет УВЕЛИЧИВАТЬ неравномерность заполнения страниц. + * + * - Если `MDBX_opt_prefer_waf_insteadof_balance = False`, то будет выбрана + * менее заполненная страница, что УВЕЛИЧИТ количество измененных страниц + * и объем записи на диск при фиксации текущей транзакции, но в среднем + * будет УМЕНЬШАТЬ неравномерность заполнения страниц. + * + * \see MDBX_opt_merge_threshold_16dot16_percent */ + MDBX_opt_prefer_waf_insteadof_balance }; #ifndef __cplusplus /** \ingroup c_settings */ diff --git a/src/core.c b/src/core.c index 2f5a7a2f..ad304319 100644 --- a/src/core.c +++ b/src/core.c @@ -6487,6 +6487,11 @@ static bool default_prefault_write(const MDBX_env *env) { (env->me_flags & (MDBX_WRITEMAP | MDBX_RDONLY)) == MDBX_WRITEMAP; } +static bool default_prefer_waf_insteadof_balance(const MDBX_env *env) { + (void)env; + return false; +} + static void adjust_defaults(MDBX_env *env) { if (!env->me_options.flags.non_auto.rp_augment_limit) env->me_options.rp_augment_limit = default_rp_augment_limit(env); @@ -13692,6 +13697,8 @@ __cold int mdbx_env_create(MDBX_env **penv) { env->me_options.spill_parent4child_denominator = 0; env->me_options.dp_loose_limit = 64; env->me_options.merge_threshold_16dot16_percent = 65536 / 4 /* 25% */; + if (default_prefer_waf_insteadof_balance(env)) + env->me_options.prefer_waf_insteadof_balance = true; #if !(defined(_WIN32) || defined(_WIN64)) env->me_options.writethrough_threshold = @@ -26459,6 +26466,16 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option, } break; + case MDBX_opt_prefer_waf_insteadof_balance: + if (value == /* default */ UINT64_MAX) + env->me_options.prefer_waf_insteadof_balance = + default_prefer_waf_insteadof_balance(env); + else if (value > 1) + err = MDBX_EINVAL; + else + env->me_options.prefer_waf_insteadof_balance = value != 0; + break; + default: return MDBX_EINVAL; } @@ -26548,6 +26565,10 @@ __cold int mdbx_env_get_option(const MDBX_env *env, const MDBX_option_t option, *pvalue = env->me_options.prefault_write; break; + case MDBX_opt_prefer_waf_insteadof_balance: + *pvalue = env->me_options.prefer_waf_insteadof_balance; + break; + default: return MDBX_EINVAL; }