mirror of
https://github.com/isar/libmdbx.git
synced 2025-02-23 14:18:14 +08:00
mdbx: устранение излишнего предупреждения при смене размера БД во время открытия (backport).
Изменение геометрии (увеличение размера) больших БД может быть не возможно после их открытия вследствие системных ограничений (отсутствия свободного адресного пространства). Поэтому API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен. Спасибо Илье Михееву (Erigon) за сообщение об этом недочете.
This commit is contained in:
parent
80de77b1ee
commit
0ef0f49e2e
@ -11,7 +11,14 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx
|
|||||||
Благодарности:
|
Благодарности:
|
||||||
|
|
||||||
- [Erigon](https://docs.erigon.tech/) за спонсорство.
|
- [Erigon](https://docs.erigon.tech/) за спонсорство.
|
||||||
|
- [Илье Михееву](https://t.me/IlyaMkhv) за сообщение о лишнем/ненужном предупреждении несоответствия файла БД новому размеру.
|
||||||
|
|
||||||
|
Исправления:
|
||||||
|
|
||||||
|
- Устранение лишнего/ненужного предупреждения в сценарии изменения размера БД посредством вызова `mdbx_env_set_geometry()` до её открытия.
|
||||||
|
API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов,
|
||||||
|
так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение
|
||||||
|
о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен.
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -567,6 +567,7 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool new_size_from_user = false;
|
||||||
const size_t used_bytes = pgno2bytes(env, header.geometry.first_unallocated);
|
const size_t used_bytes = pgno2bytes(env, header.geometry.first_unallocated);
|
||||||
const size_t used_aligned2os_bytes = ceil_powerof2(used_bytes, globals.sys_pagesize);
|
const size_t used_aligned2os_bytes = ceil_powerof2(used_bytes, globals.sys_pagesize);
|
||||||
if ((env->flags & MDBX_RDONLY) /* readonly */
|
if ((env->flags & MDBX_RDONLY) /* readonly */
|
||||||
@ -601,6 +602,8 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
/* pre-shrink if enabled */
|
/* pre-shrink if enabled */
|
||||||
env->geo_in_bytes.now = used_bytes + env->geo_in_bytes.shrink - used_bytes % env->geo_in_bytes.shrink;
|
env->geo_in_bytes.now = used_bytes + env->geo_in_bytes.shrink - used_bytes % env->geo_in_bytes.shrink;
|
||||||
|
|
||||||
|
/* сейчас БД еще не открыта, поэтому этот вызов не изменит геометрию, но проверит и скорректирует параметры
|
||||||
|
* с учетом реального размера страницы. */
|
||||||
err = mdbx_env_set_geometry(env, env->geo_in_bytes.lower, env->geo_in_bytes.now, env->geo_in_bytes.upper,
|
err = mdbx_env_set_geometry(env, env->geo_in_bytes.lower, env->geo_in_bytes.now, env->geo_in_bytes.upper,
|
||||||
env->geo_in_bytes.grow, env->geo_in_bytes.shrink, header.pagesize);
|
env->geo_in_bytes.grow, env->geo_in_bytes.shrink, header.pagesize);
|
||||||
if (unlikely(err != MDBX_SUCCESS)) {
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
@ -608,7 +611,9 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
return (err == MDBX_EINVAL) ? MDBX_INCOMPATIBLE : err;
|
return (err == MDBX_EINVAL) ? MDBX_INCOMPATIBLE : err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update meta fields */
|
/* altering fields to match geometry given from user */
|
||||||
|
new_size_from_user = header.geometry.now != bytes2pgno(env, env->geo_in_bytes.now);
|
||||||
|
if (new_size_from_user)
|
||||||
header.geometry.now = bytes2pgno(env, env->geo_in_bytes.now);
|
header.geometry.now = bytes2pgno(env, env->geo_in_bytes.now);
|
||||||
header.geometry.lower = bytes2pgno(env, env->geo_in_bytes.lower);
|
header.geometry.lower = bytes2pgno(env, env->geo_in_bytes.lower);
|
||||||
header.geometry.upper = bytes2pgno(env, env->geo_in_bytes.upper);
|
header.geometry.upper = bytes2pgno(env, env->geo_in_bytes.upper);
|
||||||
@ -646,6 +651,7 @@ __cold int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bit
|
|||||||
env->geo_in_bytes.now, bytes2pgno(env, env->geo_in_bytes.now), filesize_before,
|
env->geo_in_bytes.now, bytes2pgno(env, env->geo_in_bytes.now), filesize_before,
|
||||||
bytes2pgno(env, (size_t)filesize_before));
|
bytes2pgno(env, (size_t)filesize_before));
|
||||||
} else {
|
} else {
|
||||||
|
if (!new_size_from_user)
|
||||||
WARNING("filesize mismatch (expect %" PRIuSIZE "b/%" PRIaPGNO "p, have %" PRIu64 "b/%" PRIaPGNO "p)",
|
WARNING("filesize mismatch (expect %" PRIuSIZE "b/%" PRIaPGNO "p, have %" PRIu64 "b/%" PRIaPGNO "p)",
|
||||||
env->geo_in_bytes.now, bytes2pgno(env, env->geo_in_bytes.now), filesize_before,
|
env->geo_in_bytes.now, bytes2pgno(env, env->geo_in_bytes.now), filesize_before,
|
||||||
bytes2pgno(env, (size_t)filesize_before));
|
bytes2pgno(env, (size_t)filesize_before));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user