mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-01 23:34:13 +08:00
mdbx: исправление me_dxb_mmap.current > me_dxb_mmap.limit
и срабатывания соответствующей assert-проверки (backport).
Устранение упущения приводящего к нелогичной ситуации `me_dxb_mmap.curren > me_dxb_mmap.limit` при "дребезге" размера БД. В текущем понимании, последствий кроме срабатывания assert-проверки нет, а вероятность проявления близка к нулю.
This commit is contained in:
parent
74f2bc813b
commit
a0a4af7701
11
src/core.c
11
src/core.c
@ -6195,6 +6195,7 @@ __cold static int dxb_resize(MDBX_env *const env, const pgno_t used_pgno,
|
|||||||
#endif /* MDBX_ENABLE_MADVISE */
|
#endif /* MDBX_ENABLE_MADVISE */
|
||||||
|
|
||||||
rc = osal_mresize(mresize_flags, &env->me_dxb_mmap, size_bytes, limit_bytes);
|
rc = osal_mresize(mresize_flags, &env->me_dxb_mmap, size_bytes, limit_bytes);
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
|
|
||||||
#if MDBX_ENABLE_MADVISE
|
#if MDBX_ENABLE_MADVISE
|
||||||
if (rc == MDBX_SUCCESS) {
|
if (rc == MDBX_SUCCESS) {
|
||||||
@ -6220,6 +6221,7 @@ __cold static int dxb_resize(MDBX_env *const env, const pgno_t used_pgno,
|
|||||||
|
|
||||||
bailout:
|
bailout:
|
||||||
if (rc == MDBX_SUCCESS) {
|
if (rc == MDBX_SUCCESS) {
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
eASSERT(env, limit_bytes == env->me_dxb_mmap.limit);
|
eASSERT(env, limit_bytes == env->me_dxb_mmap.limit);
|
||||||
eASSERT(env, size_bytes <= env->me_dxb_mmap.filesize);
|
eASSERT(env, size_bytes <= env->me_dxb_mmap.filesize);
|
||||||
if (mode == explicit_resize)
|
if (mode == explicit_resize)
|
||||||
@ -6250,6 +6252,7 @@ bailout:
|
|||||||
"present %" PRIuPTR " -> %" PRIuPTR ", "
|
"present %" PRIuPTR " -> %" PRIuPTR ", "
|
||||||
"limit %" PRIuPTR " -> %" PRIuPTR ", errcode %d",
|
"limit %" PRIuPTR " -> %" PRIuPTR ", errcode %d",
|
||||||
prev_size, size_bytes, prev_limit, limit_bytes, rc);
|
prev_size, size_bytes, prev_limit, limit_bytes, rc);
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
}
|
}
|
||||||
if (!env->me_dxb_mmap.base) {
|
if (!env->me_dxb_mmap.base) {
|
||||||
env->me_flags |= MDBX_FATAL_ERROR;
|
env->me_flags |= MDBX_FATAL_ERROR;
|
||||||
@ -9061,6 +9064,7 @@ static int txn_renew(MDBX_txn *txn, const unsigned flags) {
|
|||||||
const size_t used_bytes = pgno2bytes(env, txn->mt_next_pgno);
|
const size_t used_bytes = pgno2bytes(env, txn->mt_next_pgno);
|
||||||
const size_t required_bytes =
|
const size_t required_bytes =
|
||||||
(txn->mt_flags & MDBX_TXN_RDONLY) ? used_bytes : size_bytes;
|
(txn->mt_flags & MDBX_TXN_RDONLY) ? used_bytes : size_bytes;
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
if (unlikely(required_bytes > env->me_dxb_mmap.current)) {
|
if (unlikely(required_bytes > env->me_dxb_mmap.current)) {
|
||||||
/* Размер БД (для пишущих транзакций) или используемых данных (для
|
/* Размер БД (для пишущих транзакций) или используемых данных (для
|
||||||
* читающих транзакций) больше предыдущего/текущего размера внутри
|
* читающих транзакций) больше предыдущего/текущего размера внутри
|
||||||
@ -9078,6 +9082,7 @@ static int txn_renew(MDBX_txn *txn, const unsigned flags) {
|
|||||||
txn->mt_geo.upper, implicit_grow);
|
txn->mt_geo.upper, implicit_grow);
|
||||||
if (unlikely(rc != MDBX_SUCCESS))
|
if (unlikely(rc != MDBX_SUCCESS))
|
||||||
goto bailout;
|
goto bailout;
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
} else if (unlikely(size_bytes < env->me_dxb_mmap.current)) {
|
} else if (unlikely(size_bytes < env->me_dxb_mmap.current)) {
|
||||||
/* Размер БД меньше предыдущего/текущего размера внутри процесса, можно
|
/* Размер БД меньше предыдущего/текущего размера внутри процесса, можно
|
||||||
* уменьшить, но всё сложнее:
|
* уменьшить, но всё сложнее:
|
||||||
@ -9103,11 +9108,15 @@ static int txn_renew(MDBX_txn *txn, const unsigned flags) {
|
|||||||
rc = osal_fastmutex_acquire(&env->me_remap_guard);
|
rc = osal_fastmutex_acquire(&env->me_remap_guard);
|
||||||
#endif
|
#endif
|
||||||
if (likely(rc == MDBX_SUCCESS)) {
|
if (likely(rc == MDBX_SUCCESS)) {
|
||||||
|
eASSERT(env, env->me_dxb_mmap.limit >= env->me_dxb_mmap.current);
|
||||||
rc = osal_filesize(env->me_dxb_mmap.fd, &env->me_dxb_mmap.filesize);
|
rc = osal_filesize(env->me_dxb_mmap.fd, &env->me_dxb_mmap.filesize);
|
||||||
if (likely(rc == MDBX_SUCCESS)) {
|
if (likely(rc == MDBX_SUCCESS)) {
|
||||||
eASSERT(env, env->me_dxb_mmap.filesize >= required_bytes);
|
eASSERT(env, env->me_dxb_mmap.filesize >= required_bytes);
|
||||||
if (env->me_dxb_mmap.current > env->me_dxb_mmap.filesize)
|
if (env->me_dxb_mmap.current > env->me_dxb_mmap.filesize)
|
||||||
env->me_dxb_mmap.current = (size_t)env->me_dxb_mmap.filesize;
|
env->me_dxb_mmap.current =
|
||||||
|
(env->me_dxb_mmap.limit < env->me_dxb_mmap.filesize)
|
||||||
|
? env->me_dxb_mmap.limit
|
||||||
|
: (size_t)env->me_dxb_mmap.filesize;
|
||||||
}
|
}
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
osal_srwlock_ReleaseShared(&env->me_remap_guard);
|
osal_srwlock_ReleaseShared(&env->me_remap_guard);
|
||||||
|
@ -2571,7 +2571,7 @@ retry_mapview:;
|
|||||||
ptr_disp(map->base, size),
|
ptr_disp(map->base, size),
|
||||||
((map->current < map->limit) ? map->current : map->limit) - size);
|
((map->current < map->limit) ? map->current : map->limit) - size);
|
||||||
}
|
}
|
||||||
map->current = size;
|
map->current = (size < map->limit) ? size : map->limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (limit == map->limit)
|
if (limit == map->limit)
|
||||||
@ -2732,6 +2732,7 @@ retry_mapview:;
|
|||||||
map->base = ptr;
|
map->base = ptr;
|
||||||
}
|
}
|
||||||
map->limit = limit;
|
map->limit = limit;
|
||||||
|
map->current = size;
|
||||||
|
|
||||||
#if MDBX_ENABLE_MADVISE
|
#if MDBX_ENABLE_MADVISE
|
||||||
#ifdef MADV_DONTFORK
|
#ifdef MADV_DONTFORK
|
||||||
|
Loading…
x
Reference in New Issue
Block a user