mdbx: исправление неожиданного MDBX_BUSY из mdbx_env_set_option().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2022-11-03 17:23:32 +03:00
parent 91a6e84cab
commit d4e67d14ce

View File

@ -23467,13 +23467,16 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
return MDBX_EPERM; return MDBX_EPERM;
if (unlikely(value > SIZE_MAX - 65536)) if (unlikely(value > SIZE_MAX - 65536))
return MDBX_TOO_LARGE; return MDBX_TOO_LARGE;
if (atomic_store32(&env->me_lck->mti_autosync_threshold, value = bytes2pgno(env, (size_t)value + env->me_psize - 1);
bytes2pgno(env, (size_t)value + env->me_psize - 1), if ((uint32_t)value != atomic_load32(&env->me_lck->mti_autosync_threshold,
mo_Relaxed) != 0 && mo_AcquireRelease) &&
(env->me_flags & MDBX_ENV_ACTIVE)) { atomic_store32(&env->me_lck->mti_autosync_threshold, (uint32_t)value,
err = mdbx_env_sync_poll(env); mo_Relaxed)
if (unlikely(MDBX_IS_ERROR(err))) /* Дергаем sync(force=off) только если задано новое не-нулевое значение
return err; * и мы вне транзакции */
&& lock_needed) {
err = env_sync(env, false, false);
if (err == /* нечего сбрасывать на диск */ MDBX_RESULT_TRUE)
err = MDBX_SUCCESS; err = MDBX_SUCCESS;
} }
break; break;
@ -23487,13 +23490,15 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
return MDBX_EPERM; return MDBX_EPERM;
if (unlikely(value > UINT32_MAX)) if (unlikely(value > UINT32_MAX))
return MDBX_TOO_LARGE; return MDBX_TOO_LARGE;
if (atomic_store64(&env->me_lck->mti_autosync_period, value = osal_16dot16_to_monotime((uint32_t)value);
osal_16dot16_to_monotime((uint32_t)value), if (value != atomic_load64(&env->me_lck->mti_autosync_period,
mo_Relaxed) != 0 && mo_AcquireRelease) &&
(env->me_flags & MDBX_ENV_ACTIVE)) { atomic_store64(&env->me_lck->mti_autosync_period, value, mo_Relaxed)
err = mdbx_env_sync_poll(env); /* Дергаем sync(force=off) только если задано новое не-нулевое значение
if (unlikely(MDBX_IS_ERROR(err))) * и мы вне транзакции */
return err; && lock_needed) {
err = env_sync(env, false, false);
if (err == /* нечего сбрасывать на диск */ MDBX_RESULT_TRUE)
err = MDBX_SUCCESS; err = MDBX_SUCCESS;
} }
break; break;