mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 01:34:12 +08:00
mdbx: исправление очепятки в mdbx_env_turn_for_recovery()
.
Исправление опечатки в имени переменной внутри `mdbx_env_turn_for_recovery()`, что приводило к неверному поведению в некоторых ситуациях. С точки зрения пользователя, с учетом актуальных сценариев использования утилиты `mdbx_chk`, был только один специфический/редкий сценарий проявления ошибки/проблемы - когда выполнялась проверка и активация слабой/weak мета-страницы с НЕ-последней транзакцией после системной аварии машины, где БД использовалась в хрупком/небезопасном режиме. В сценарии, при успешной проверке целевой страницы и её последующей активации выводилось сообщение об ошибке, связанной со срабатыванием механизма контроля не-когерентности кэша файловой системы и отображенных в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было каких-либо негативных последствия, кроме самого сообщения об ошибке. Технически же ошибка проявлялась при "переключении" на мета-страницу, когда у хотя-бы одной из двух других мета-страниц номер транзакции был больше: * Если содержимое других мета-страниц было корректным, а номера связанных транзакций были больше, то результирующий номер транзакции в целевой/активируемой мета-страницы устанавливается без учета этих мета-страниц и мог быть меньше-или-равным. * В результате, если такие мета-страницы были в статусе слабых/weak, то при закрытии БД после переключения могла срабатывать защита от не-когерентности unified buffer/page cache, а в отладочных сборках могла срабатывать assert-проверка. * Если же такие мета-страницы были в статусе сильных/steady, то переключение на новую мета-страницу могло не давать эффекта либо приводить к появлению двух мета-страниц с одинаковым номером транзакции, что является ошибочной ситуацией.
This commit is contained in:
parent
7aaae2ecd5
commit
d516e903d4
@ -14443,7 +14443,7 @@ __cold int mdbx_env_turn_for_recovery(MDBX_env *env, unsigned target) {
|
||||
for (size_t n = 0; n < NUM_METAS; ++n) {
|
||||
if (n == target)
|
||||
continue;
|
||||
MDBX_meta meta = *METAPAGE(env, target);
|
||||
MDBX_meta meta = *METAPAGE(env, n);
|
||||
if (validate_meta(env, &meta, pgno2page(env, n), (pgno_t)n, nullptr) !=
|
||||
MDBX_SUCCESS) {
|
||||
int err = override_meta(env, n, 0, nullptr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user