mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-20 16:18:20 +08:00
mdbx: restore env-flags when env_open() failed.
Change-Id: I597b242c6f56c16dfef0a3d34c2113f71908cef4
This commit is contained in:
parent
0dfa9cd09a
commit
f625b6cb42
22
src/mdbx.c
22
src/mdbx.c
@ -5718,10 +5718,13 @@ int __cold mdbx_env_open(MDBX_env *env, const char *path, unsigned flags,
|
|||||||
if (unlikely(env->me_signature != MDBX_ME_SIGNATURE))
|
if (unlikely(env->me_signature != MDBX_ME_SIGNATURE))
|
||||||
return MDBX_EBADSIGN;
|
return MDBX_EBADSIGN;
|
||||||
|
|
||||||
if (env->me_fd != INVALID_HANDLE_VALUE ||
|
if (flags & ~(CHANGEABLE | CHANGELESS))
|
||||||
(flags & ~(CHANGEABLE | CHANGELESS)))
|
|
||||||
return MDBX_EINVAL;
|
return MDBX_EINVAL;
|
||||||
|
|
||||||
|
if (env->me_fd != INVALID_HANDLE_VALUE ||
|
||||||
|
(env->me_flags & MDBX_ENV_ACTIVE) != 0)
|
||||||
|
return MDBX_EPERM;
|
||||||
|
|
||||||
size_t len_full, len = strlen(path);
|
size_t len_full, len = strlen(path);
|
||||||
if (flags & MDBX_NOSUBDIR) {
|
if (flags & MDBX_NOSUBDIR) {
|
||||||
len_full = len + sizeof(MDBX_LOCK_SUFFIX) + len + 1;
|
len_full = len + sizeof(MDBX_LOCK_SUFFIX) + len + 1;
|
||||||
@ -5755,7 +5758,9 @@ int __cold mdbx_env_open(MDBX_env *env, const char *path, unsigned flags,
|
|||||||
(env->me_dirtylist = calloc(MDBX_PNL_UM_SIZE, sizeof(MDBX_ID2)))))
|
(env->me_dirtylist = calloc(MDBX_PNL_UM_SIZE, sizeof(MDBX_ID2)))))
|
||||||
rc = MDBX_ENOMEM;
|
rc = MDBX_ENOMEM;
|
||||||
}
|
}
|
||||||
env->me_flags = flags |= MDBX_ENV_ACTIVE;
|
|
||||||
|
const uint32_t saved_me_flags = env->me_flags;
|
||||||
|
env->me_flags = flags | MDBX_ENV_ACTIVE;
|
||||||
if (rc)
|
if (rc)
|
||||||
goto bailout;
|
goto bailout;
|
||||||
|
|
||||||
@ -5873,8 +5878,10 @@ int __cold mdbx_env_open(MDBX_env *env, const char *path, unsigned flags,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
bailout:
|
bailout:
|
||||||
if (rc)
|
if (rc) {
|
||||||
mdbx_env_close0(env);
|
mdbx_env_close0(env);
|
||||||
|
env->me_flags = saved_me_flags;
|
||||||
|
}
|
||||||
free(lck_pathname);
|
free(lck_pathname);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -5903,10 +5910,8 @@ static void __cold mdbx_env_close0(MDBX_env *env) {
|
|||||||
}
|
}
|
||||||
mdbx_pnl_free(env->me_free_pgs);
|
mdbx_pnl_free(env->me_free_pgs);
|
||||||
|
|
||||||
if (env->me_flags & MDBX_ENV_TXKEY) {
|
if (env->me_flags & MDBX_ENV_TXKEY)
|
||||||
mdbx_rthc_remove(env->me_txkey);
|
mdbx_rthc_remove(env->me_txkey);
|
||||||
env->me_flags &= ~MDBX_ENV_TXKEY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (env->me_map) {
|
if (env->me_map) {
|
||||||
mdbx_munmap(&env->me_dxb_mmap);
|
mdbx_munmap(&env->me_dxb_mmap);
|
||||||
@ -5922,7 +5927,6 @@ static void __cold mdbx_env_close0(MDBX_env *env) {
|
|||||||
|
|
||||||
if (env->me_lck)
|
if (env->me_lck)
|
||||||
mdbx_munmap(&env->me_lck_mmap);
|
mdbx_munmap(&env->me_lck_mmap);
|
||||||
env->me_pid = 0;
|
|
||||||
env->me_oldest = nullptr;
|
env->me_oldest = nullptr;
|
||||||
|
|
||||||
mdbx_lck_destroy(env);
|
mdbx_lck_destroy(env);
|
||||||
@ -5930,6 +5934,7 @@ static void __cold mdbx_env_close0(MDBX_env *env) {
|
|||||||
(void)mdbx_closefile(env->me_lfd);
|
(void)mdbx_closefile(env->me_lfd);
|
||||||
env->me_lfd = INVALID_HANDLE_VALUE;
|
env->me_lfd = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
env->me_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __cold mdbx_env_close_ex(MDBX_env *env, int dont_sync) {
|
int __cold mdbx_env_close_ex(MDBX_env *env, int dont_sync) {
|
||||||
@ -5980,6 +5985,7 @@ int __cold mdbx_env_close_ex(MDBX_env *env, int dont_sync) {
|
|||||||
mdbx_fastmutex_destroy(&env->me_remap_guard) == MDBX_SUCCESS);
|
mdbx_fastmutex_destroy(&env->me_remap_guard) == MDBX_SUCCESS);
|
||||||
#endif /* Windows */
|
#endif /* Windows */
|
||||||
|
|
||||||
|
env->me_pid = 0;
|
||||||
env->me_signature = 0;
|
env->me_signature = 0;
|
||||||
free(env);
|
free(env);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user