mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-06 19:34:15 +08:00
mdbx: roundup readers/lck-filesize.
This commit is contained in:
parent
0b400c5dd0
commit
b558757cf1
40
src/mdbx.c
40
src/mdbx.c
@ -3848,10 +3848,17 @@ static int __cold mdbx_env_open2(MDB_env *env, MDB_meta *meta) {
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
static __inline bool is_powerof2(size_t x) { return (x & (x - 1)) == 0; }
|
||||||
|
|
||||||
|
static __inline size_t roundup2(size_t value, size_t granularity) {
|
||||||
|
assert(is_powerof2(granularity));
|
||||||
|
return (value + granularity - 1) & ~(granularity - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Open and/or initialize the lock region for the environment. */
|
/* Open and/or initialize the lock region for the environment. */
|
||||||
static int __cold mdbx_env_setup_locks(MDB_env *env, char *lpath, int mode,
|
static int __cold mdbx_env_setup_locks(MDB_env *env, char *lpath, int mode,
|
||||||
int *excl) {
|
int *excl) {
|
||||||
off_t size, rsize;
|
off_t size;
|
||||||
|
|
||||||
int rc = mdbx_openfile(lpath, O_RDWR | O_CREAT, mode, &env->me_lfd);
|
int rc = mdbx_openfile(lpath, O_RDWR | O_CREAT, mode, &env->me_lfd);
|
||||||
if (rc != MDB_SUCCESS) {
|
if (rc != MDB_SUCCESS) {
|
||||||
@ -3875,19 +3882,22 @@ static int __cold mdbx_env_setup_locks(MDB_env *env, char *lpath, int mode,
|
|||||||
rc = mdbx_filesize(env->me_lfd, &size);
|
rc = mdbx_filesize(env->me_lfd, &size);
|
||||||
if (unlikely(rc != MDB_SUCCESS))
|
if (unlikely(rc != MDB_SUCCESS))
|
||||||
return rc;
|
return rc;
|
||||||
rsize = (env->me_maxreaders - 1) * sizeof(MDB_reader) + sizeof(MDBX_lockinfo);
|
|
||||||
if (size != rsize && *excl > 0) {
|
if (*excl > 0) {
|
||||||
rc = mdbx_ftruncate(env->me_lfd, rsize);
|
off_t wanna = roundup2((env->me_maxreaders - 1) * sizeof(MDB_reader) +
|
||||||
|
sizeof(MDBX_lockinfo),
|
||||||
|
env->me_os_psize);
|
||||||
|
if (size != wanna) {
|
||||||
|
rc = mdbx_ftruncate(env->me_lfd, wanna);
|
||||||
if (unlikely(rc != MDB_SUCCESS))
|
if (unlikely(rc != MDB_SUCCESS))
|
||||||
return rc;
|
return rc;
|
||||||
} else {
|
size = wanna;
|
||||||
rsize = size;
|
|
||||||
size = rsize - sizeof(MDBX_lockinfo);
|
|
||||||
env->me_maxreaders = size / sizeof(MDB_reader) + 1;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
env->me_maxreaders = (size - sizeof(MDBX_lockinfo)) / sizeof(MDB_reader) + 1;
|
||||||
|
|
||||||
void *addr = NULL;
|
void *addr = NULL;
|
||||||
rc = mdbx_mmap(&addr, rsize, true, env->me_lfd);
|
rc = mdbx_mmap(&addr, size, true, env->me_lfd);
|
||||||
if (unlikely(rc != MDB_SUCCESS))
|
if (unlikely(rc != MDB_SUCCESS))
|
||||||
return rc;
|
return rc;
|
||||||
env->me_txns = addr;
|
env->me_txns = addr;
|
||||||
@ -3901,25 +3911,25 @@ static int __cold mdbx_env_setup_locks(MDB_env *env, char *lpath, int mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MADV_NOHUGEPAGE
|
#ifdef MADV_NOHUGEPAGE
|
||||||
(void)madvise(env->me_txns, rsize, MADV_NOHUGEPAGE);
|
(void)madvise(env->me_txns, size, MADV_NOHUGEPAGE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MADV_DODUMP
|
#ifdef MADV_DODUMP
|
||||||
(void)madvise(env->me_txns, rsize, MADV_DODUMP);
|
(void)madvise(env->me_txns, size, MADV_DODUMP);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MADV_DONTFORK
|
#ifdef MADV_DONTFORK
|
||||||
if (madvise(env->me_txns, rsize, MADV_DONTFORK) < 0)
|
if (madvise(env->me_txns, size, MADV_DONTFORK) < 0)
|
||||||
return errno;
|
return errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MADV_WILLNEED
|
#ifdef MADV_WILLNEED
|
||||||
if (madvise(env->me_txns, rsize, MADV_WILLNEED) < 0)
|
if (madvise(env->me_txns, size, MADV_WILLNEED) < 0)
|
||||||
return errno;
|
return errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MADV_RANDOM
|
#ifdef MADV_RANDOM
|
||||||
if (madvise(env->me_txns, rsize, MADV_RANDOM) < 0)
|
if (madvise(env->me_txns, size, MADV_RANDOM) < 0)
|
||||||
return errno;
|
return errno;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4129,7 +4139,6 @@ static void __cold mdbx_env_close0(MDB_env *env) {
|
|||||||
if (!(env->me_flags & MDB_ENV_ACTIVE))
|
if (!(env->me_flags & MDB_ENV_ACTIVE))
|
||||||
return;
|
return;
|
||||||
env->me_flags &= ~MDB_ENV_ACTIVE;
|
env->me_flags &= ~MDB_ENV_ACTIVE;
|
||||||
mdbx_lck_destroy(env);
|
|
||||||
|
|
||||||
/* Doing this here since me_dbxs may not exist during mdbx_env_close */
|
/* Doing this here since me_dbxs may not exist during mdbx_env_close */
|
||||||
if (env->me_dbxs) {
|
if (env->me_dbxs) {
|
||||||
@ -4171,6 +4180,7 @@ static void __cold mdbx_env_close0(MDB_env *env) {
|
|||||||
env->me_txns = NULL;
|
env->me_txns = NULL;
|
||||||
env->me_pid = 0;
|
env->me_pid = 0;
|
||||||
|
|
||||||
|
mdbx_lck_destroy(env);
|
||||||
if (env->me_lfd != INVALID_HANDLE_VALUE) {
|
if (env->me_lfd != INVALID_HANDLE_VALUE) {
|
||||||
(void)mdbx_closefile(env->me_lfd);
|
(void)mdbx_closefile(env->me_lfd);
|
||||||
env->me_lfd = INVALID_HANDLE_VALUE;
|
env->me_lfd = INVALID_HANDLE_VALUE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user