mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-30 22:47:16 +08:00
mdbx: add MDBX_opt_dp_reserve_limit
.
More for https://github.com/erthink/libmdbx/issues/128 Change-Id: I620b6dcd833fcff19680770974f32431ab91c0ab
This commit is contained in:
parent
42019e0b8d
commit
461ba000e3
3
mdbx.h
3
mdbx.h
@ -1799,6 +1799,9 @@ enum MDBX_option_t {
|
|||||||
MDBX_opt_sync_period,
|
MDBX_opt_sync_period,
|
||||||
MDBX_opt_max_dbx,
|
MDBX_opt_max_dbx,
|
||||||
MDBX_opt_max_readers,
|
MDBX_opt_max_readers,
|
||||||
|
|
||||||
|
/** \brief The limit to grow a list of pre-allocated dirty pages. */
|
||||||
|
MDBX_opt_dp_reserve_limit,
|
||||||
};
|
};
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
/** \ingroup c_settings */
|
/** \ingroup c_settings */
|
||||||
|
32
src/core.c
32
src/core.c
@ -19637,6 +19637,9 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
|
|||||||
if (unlikely(err != MDBX_SUCCESS))
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
const bool lock_needed = (env->me_map && env->me_txn0 &&
|
||||||
|
env->me_txn0->mt_owner != mdbx_thread_self());
|
||||||
|
bool should_unlock = false;
|
||||||
switch (option) {
|
switch (option) {
|
||||||
case MDBX_opt_sync_bytes:
|
case MDBX_opt_sync_bytes:
|
||||||
if (unlikely(env->me_flags & MDBX_RDONLY))
|
if (unlikely(env->me_flags & MDBX_RDONLY))
|
||||||
@ -19684,10 +19687,35 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
|
|||||||
env->me_maxreaders = (unsigned)value;
|
env->me_maxreaders = (unsigned)value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MDBX_opt_dp_reserve_limit:
|
||||||
|
if (unlikely(value > INT_MAX))
|
||||||
|
return MDBX_EINVAL;
|
||||||
|
if (env->me_options.dp_reserve_limit != (unsigned)value) {
|
||||||
|
if (lock_needed) {
|
||||||
|
err = mdbx_txn_lock(env, false);
|
||||||
|
if (unlikely(err != MDBX_SUCCESS))
|
||||||
|
return err;
|
||||||
|
should_unlock = true;
|
||||||
|
}
|
||||||
|
env->me_options.dp_reserve_limit = (unsigned)value;
|
||||||
|
while (env->me_dp_reserve_len > env->me_options.dp_reserve_limit) {
|
||||||
|
mdbx_assert(env, env->me_dp_reserve != NULL);
|
||||||
|
MDBX_page *mp = env->me_dp_reserve;
|
||||||
|
ASAN_UNPOISON_MEMORY_REGION(&mp->mp_next, sizeof(mp->mp_next));
|
||||||
|
VALGRIND_MAKE_MEM_DEFINED(&mp->mp_next, sizeof(mp->mp_next));
|
||||||
|
env->me_dp_reserve = mp->mp_next;
|
||||||
|
mdbx_free(mp);
|
||||||
|
env->me_dp_reserve_len -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MDBX_EINVAL;
|
return MDBX_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (should_unlock)
|
||||||
|
mdbx_txn_unlock(env);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19720,6 +19748,10 @@ __cold int mdbx_env_get_option(const MDBX_env *env, const MDBX_option_t option,
|
|||||||
*value = env->me_maxreaders;
|
*value = env->me_maxreaders;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MDBX_opt_dp_reserve_limit:
|
||||||
|
*value = env->me_options.dp_reserve_limit;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MDBX_EINVAL;
|
return MDBX_EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user