mdbx: рефакторинг обработки установки опций в значения по-умолчанию.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2022-12-12 15:02:08 +03:00
parent 54b15d7e41
commit b959e217b1

View File

@ -24359,14 +24359,14 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
bool should_unlock = false; bool should_unlock = false;
switch (option) { switch (option) {
case MDBX_opt_sync_bytes: case MDBX_opt_sync_bytes:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = SIZE_MAX - 65536; value = MAX_WRITE;
if (unlikely(env->me_flags & MDBX_RDONLY)) if (unlikely(env->me_flags & MDBX_RDONLY))
return MDBX_EACCESS; return MDBX_EACCESS;
if (unlikely(!(env->me_flags & MDBX_ENV_ACTIVE))) if (unlikely(!(env->me_flags & MDBX_ENV_ACTIVE)))
return MDBX_EPERM; return MDBX_EPERM;
if (unlikely(value > SIZE_MAX - 65536)) if (unlikely(value > SIZE_MAX - 65536))
return MDBX_TOO_LARGE; return MDBX_EINVAL;
value = bytes2pgno(env, (size_t)value + env->me_psize - 1); value = bytes2pgno(env, (size_t)value + env->me_psize - 1);
if ((uint32_t)value != atomic_load32(&env->me_lck->mti_autosync_threshold, if ((uint32_t)value != atomic_load32(&env->me_lck->mti_autosync_threshold,
mo_AcquireRelease) && mo_AcquireRelease) &&
@ -24382,14 +24382,14 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_sync_period: case MDBX_opt_sync_period:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = UINT32_MAX; value = 2780315 /* 42.42424 секунды */;
if (unlikely(env->me_flags & MDBX_RDONLY)) if (unlikely(env->me_flags & MDBX_RDONLY))
return MDBX_EACCESS; return MDBX_EACCESS;
if (unlikely(!(env->me_flags & MDBX_ENV_ACTIVE))) if (unlikely(!(env->me_flags & MDBX_ENV_ACTIVE)))
return MDBX_EPERM; return MDBX_EPERM;
if (unlikely(value > UINT32_MAX)) if (unlikely(value > UINT32_MAX))
return MDBX_TOO_LARGE; return MDBX_EINVAL;
value = osal_16dot16_to_monotime((uint32_t)value); value = osal_16dot16_to_monotime((uint32_t)value);
if (value != atomic_load64(&env->me_lck->mti_autosync_period, if (value != atomic_load64(&env->me_lck->mti_autosync_period,
mo_AcquireRelease) && mo_AcquireRelease) &&
@ -24404,8 +24404,8 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_max_db: case MDBX_opt_max_db:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = MDBX_MAX_DBI; value = 42;
if (unlikely(value > MDBX_MAX_DBI)) if (unlikely(value > MDBX_MAX_DBI))
return MDBX_EINVAL; return MDBX_EINVAL;
if (unlikely(env->me_map)) if (unlikely(env->me_map))
@ -24414,7 +24414,7 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_max_readers: case MDBX_opt_max_readers:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = MDBX_READERS_LIMIT; value = MDBX_READERS_LIMIT;
if (unlikely(value < 1 || value > MDBX_READERS_LIMIT)) if (unlikely(value < 1 || value > MDBX_READERS_LIMIT))
return MDBX_EINVAL; return MDBX_EINVAL;
@ -24424,7 +24424,7 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_dp_reserve_limit: case MDBX_opt_dp_reserve_limit:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = INT_MAX; value = INT_MAX;
if (unlikely(value > INT_MAX)) if (unlikely(value > INT_MAX))
return MDBX_EINVAL; return MDBX_EINVAL;
@ -24450,7 +24450,7 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_rp_augment_limit: case MDBX_opt_rp_augment_limit:
if (value == UINT64_MAX) { if (value == /* default */ UINT64_MAX) {
env->me_options.flags.non_auto.rp_augment_limit = 0; env->me_options.flags.non_auto.rp_augment_limit = 0;
env->me_options.rp_augment_limit = default_rp_augment_limit(env); env->me_options.rp_augment_limit = default_rp_augment_limit(env);
} else if (unlikely(value > MDBX_PGL_LIMIT)) } else if (unlikely(value > MDBX_PGL_LIMIT))
@ -24463,7 +24463,7 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
case MDBX_opt_txn_dp_limit: case MDBX_opt_txn_dp_limit:
case MDBX_opt_txn_dp_initial: case MDBX_opt_txn_dp_initial:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = MDBX_PGL_LIMIT; value = MDBX_PGL_LIMIT;
if (unlikely(value > MDBX_PGL_LIMIT || value < CURSOR_STACK * 4)) if (unlikely(value > MDBX_PGL_LIMIT || value < CURSOR_STACK * 4))
return MDBX_EINVAL; return MDBX_EINVAL;
@ -24498,34 +24498,38 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_spill_max_denominator: case MDBX_opt_spill_max_denominator:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = 255; value = 8;
if (unlikely(value > 255)) if (unlikely(value > 255))
return MDBX_EINVAL; return MDBX_EINVAL;
env->me_options.spill_max_denominator = (uint8_t)value; env->me_options.spill_max_denominator = (uint8_t)value;
break; break;
case MDBX_opt_spill_min_denominator: case MDBX_opt_spill_min_denominator:
if (value == /* default */ UINT64_MAX)
value = 8;
if (unlikely(value > 255)) if (unlikely(value > 255))
return MDBX_EINVAL; return MDBX_EINVAL;
env->me_options.spill_min_denominator = (uint8_t)value; env->me_options.spill_min_denominator = (uint8_t)value;
break; break;
case MDBX_opt_spill_parent4child_denominator: case MDBX_opt_spill_parent4child_denominator:
if (value == /* default */ UINT64_MAX)
value = 0;
if (unlikely(value > 255)) if (unlikely(value > 255))
return MDBX_EINVAL; return MDBX_EINVAL;
env->me_options.spill_parent4child_denominator = (uint8_t)value; env->me_options.spill_parent4child_denominator = (uint8_t)value;
break; break;
case MDBX_opt_loose_limit: case MDBX_opt_loose_limit:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = 255; value = 64;
if (unlikely(value > 255)) if (unlikely(value > 255))
return MDBX_EINVAL; return MDBX_EINVAL;
env->me_options.dp_loose_limit = (uint8_t)value; env->me_options.dp_loose_limit = (uint8_t)value;
break; break;
case MDBX_opt_merge_threshold_16dot16_percent: case MDBX_opt_merge_threshold_16dot16_percent:
if (value == UINT64_MAX) if (value == /* default */ UINT64_MAX)
value = 32768; value = 65536 / 4 /* 25% */;
if (unlikely(value < 8192 || value > 32768)) if (unlikely(value < 8192 || value > 32768))
return MDBX_EINVAL; return MDBX_EINVAL;
env->me_options.merge_threshold_16dot16_percent = (unsigned)value; env->me_options.merge_threshold_16dot16_percent = (unsigned)value;
@ -24533,23 +24537,22 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
break; break;
case MDBX_opt_writethrough_threshold: case MDBX_opt_writethrough_threshold:
#if defined(_WIN32) || defined(_WIN64)
/* позволяем "установить" значение по-умолчанию и совпадающее
* с поведением соответствующим текущей установке MDBX_NOMETASYNC */
if (value == /* default */ UINT64_MAX &&
value != ((env->me_flags & MDBX_NOMETASYNC) ? 0 : UINT_MAX))
err = MDBX_EINVAL;
#else
if (value == /* default */ UINT64_MAX)
value = MDBX_WRITETHROUGH_THRESHOLD_DEFAULT;
if (value != (unsigned)value) if (value != (unsigned)value)
err = MDBX_EINVAL; err = MDBX_EINVAL;
else else
#if defined(_WIN32) || defined(_WIN64) env->me_options.writethrough_threshold = (unsigned)value;
/* позволяем "установить" значение по-умолчанию и совпадающее
* с поведением соответствующим текущей установке MDBX_NOMETASYNC */
if ((unsigned)-1 != (unsigned)value &&
value != ((env->me_flags & MDBX_NOMETASYNC) ? 0 : INT_MAX))
err = MDBX_EINVAL;
#else
env->me_options.writethrough_threshold =
((unsigned)-1 == (unsigned)value)
? MDBX_WRITETHROUGH_THRESHOLD_DEFAULT
: (unsigned)value;
#endif #endif
break; break;
default: default:
return MDBX_EINVAL; return MDBX_EINVAL;
} }