mirror of
https://gitflic.ru/project/erthink/libmdbx.git
synced 2025-01-27 18:39:24 +00:00
mdbx: исправление ошибки открытия БД на ФС только-для-чтения.
This commit is contained in:
parent
fff3fbd866
commit
446d6c9421
@ -62,6 +62,8 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
|
|||||||
- Исправление assert-проверки внутри `check_txn()` для случая завершенных транзакций в режиме `MDBX_NO_TLS`.
|
- Исправление assert-проверки внутри `check_txn()` для случая завершенных транзакций в режиме `MDBX_NO_TLS`.
|
||||||
Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет.
|
Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет.
|
||||||
|
|
||||||
|
- Устранение ошибки при открытии БД на файловой системе только-для-чтения.
|
||||||
|
|
||||||
Прочее:
|
Прочее:
|
||||||
|
|
||||||
- Расширение стохастического теста dupfixed-сценариями.
|
- Расширение стохастического теста dupfixed-сценариями.
|
||||||
|
22
src/core.c
22
src/core.c
@ -5589,6 +5589,14 @@ __cold static void meta_troika_dump(const MDBX_env *env,
|
|||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static __inline MDBX_CONST_FUNCTION MDBX_lockinfo *
|
||||||
|
lckless_stub(const MDBX_env *env) {
|
||||||
|
uintptr_t stub = (uintptr_t)&env->x_lckless_stub;
|
||||||
|
/* align to avoid false-positive alarm from UndefinedBehaviorSanitizer */
|
||||||
|
stub = (stub + MDBX_CACHELINE_SIZE - 1) & ~(MDBX_CACHELINE_SIZE - 1);
|
||||||
|
return (MDBX_lockinfo *)stub;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find oldest txnid still referenced. */
|
/* Find oldest txnid still referenced. */
|
||||||
static txnid_t find_oldest_reader(MDBX_env *const env, const txnid_t steady) {
|
static txnid_t find_oldest_reader(MDBX_env *const env, const txnid_t steady) {
|
||||||
const uint32_t nothing_changed = MDBX_STRING_TETRAD("None");
|
const uint32_t nothing_changed = MDBX_STRING_TETRAD("None");
|
||||||
@ -5596,7 +5604,7 @@ static txnid_t find_oldest_reader(MDBX_env *const env, const txnid_t steady) {
|
|||||||
|
|
||||||
MDBX_lockinfo *const lck = env->me_lck_mmap.lck;
|
MDBX_lockinfo *const lck = env->me_lck_mmap.lck;
|
||||||
if (unlikely(lck == NULL /* exclusive without-lck mode */)) {
|
if (unlikely(lck == NULL /* exclusive without-lck mode */)) {
|
||||||
eASSERT(env, env->me_lck == (void *)&env->x_lckless_stub);
|
eASSERT(env, env->me_lck == lckless_stub(env));
|
||||||
env->me_lck->mti_readers_refresh_flag.weak = nothing_changed;
|
env->me_lck->mti_readers_refresh_flag.weak = nothing_changed;
|
||||||
return env->me_lck->mti_oldest_reader.weak = steady;
|
return env->me_lck->mti_oldest_reader.weak = steady;
|
||||||
}
|
}
|
||||||
@ -8897,8 +8905,7 @@ static int txn_renew(MDBX_txn *txn, const unsigned flags) {
|
|||||||
mo_AcquireRelease);
|
mo_AcquireRelease);
|
||||||
} else {
|
} else {
|
||||||
/* exclusive mode without lck */
|
/* exclusive mode without lck */
|
||||||
eASSERT(env, !env->me_lck_mmap.lck &&
|
eASSERT(env, !env->me_lck_mmap.lck && env->me_lck == lckless_stub(env));
|
||||||
env->me_lck == (void *)&env->x_lckless_stub);
|
|
||||||
}
|
}
|
||||||
jitter4testing(true);
|
jitter4testing(true);
|
||||||
|
|
||||||
@ -13136,14 +13143,6 @@ __cold static void setup_pagesize(MDBX_env *env, const size_t pagesize) {
|
|||||||
env->me_options.dp_initial = env->me_options.dp_limit;
|
env->me_options.dp_initial = env->me_options.dp_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline MDBX_CONST_FUNCTION MDBX_lockinfo *
|
|
||||||
lckless_stub(const MDBX_env *env) {
|
|
||||||
uintptr_t stub = (uintptr_t)&env->x_lckless_stub;
|
|
||||||
/* align to avoid false-positive alarm from UndefinedBehaviorSanitizer */
|
|
||||||
stub = (stub + MDBX_CACHELINE_SIZE - 1) & ~(MDBX_CACHELINE_SIZE - 1);
|
|
||||||
return (MDBX_lockinfo *)stub;
|
|
||||||
}
|
|
||||||
|
|
||||||
__cold int mdbx_env_create(MDBX_env **penv) {
|
__cold int mdbx_env_create(MDBX_env **penv) {
|
||||||
if (unlikely(!penv))
|
if (unlikely(!penv))
|
||||||
return MDBX_EINVAL;
|
return MDBX_EINVAL;
|
||||||
@ -15252,6 +15251,7 @@ __cold int mdbx_env_openW(MDBX_env *env, const wchar_t *pathname,
|
|||||||
if (rc == MDBX_RESULT_TRUE) {
|
if (rc == MDBX_RESULT_TRUE) {
|
||||||
env->me_incore = true;
|
env->me_incore = true;
|
||||||
NOTICE("%s", "in-core database");
|
NOTICE("%s", "in-core database");
|
||||||
|
rc = MDBX_SUCCESS;
|
||||||
} else if (unlikely(rc != MDBX_SUCCESS)) {
|
} else if (unlikely(rc != MDBX_SUCCESS)) {
|
||||||
ERROR("check_fs_incore(), err %d", rc);
|
ERROR("check_fs_incore(), err %d", rc);
|
||||||
goto bailout;
|
goto bailout;
|
||||||
|
@ -1826,8 +1826,8 @@ MDBX_INTERNAL_FUNC int osal_check_fs_rdonly(mdbx_filehandle_t handle,
|
|||||||
#else
|
#else
|
||||||
struct statvfs info;
|
struct statvfs info;
|
||||||
if (err != MDBX_ENOFILE) {
|
if (err != MDBX_ENOFILE) {
|
||||||
if (statvfs(pathname, &info) == 0 && (info.f_flag & ST_RDONLY) == 0)
|
if (statvfs(pathname, &info) == 0)
|
||||||
return err;
|
return (info.f_flag & ST_RDONLY) ? MDBX_SUCCESS : err;
|
||||||
if (errno != MDBX_ENOFILE)
|
if (errno != MDBX_ENOFILE)
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user