From d516e903d4dfd18c26a7d9871f1617e5d3b5a54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Wed, 7 Jun 2023 14:48:56 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=87=D0=B5=D0=BF=D1=8F?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=B2=20`mdbx=5Fenv=5Fturn=5Ffor=5Frecove?= =?UTF-8?q?ry()`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправление опечатки в имени переменной внутри `mdbx_env_turn_for_recovery()`, что приводило к неверному поведению в некоторых ситуациях. С точки зрения пользователя, с учетом актуальных сценариев использования утилиты `mdbx_chk`, был только один специфический/редкий сценарий проявления ошибки/проблемы - когда выполнялась проверка и активация слабой/weak мета-страницы с НЕ-последней транзакцией после системной аварии машины, где БД использовалась в хрупком/небезопасном режиме. В сценарии, при успешной проверке целевой страницы и её последующей активации выводилось сообщение об ошибке, связанной со срабатыванием механизма контроля не-когерентности кэша файловой системы и отображенных в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было каких-либо негативных последствия, кроме самого сообщения об ошибке. Технически же ошибка проявлялась при "переключении" на мета-страницу, когда у хотя-бы одной из двух других мета-страниц номер транзакции был больше: * Если содержимое других мета-страниц было корректным, а номера связанных транзакций были больше, то результирующий номер транзакции в целевой/активируемой мета-страницы устанавливается без учета этих мета-страниц и мог быть меньше-или-равным. * В результате, если такие мета-страницы были в статусе слабых/weak, то при закрытии БД после переключения могла срабатывать защита от не-когерентности unified buffer/page cache, а в отладочных сборках могла срабатывать assert-проверка. * Если же такие мета-страницы были в статусе сильных/steady, то переключение на новую мета-страницу могло не давать эффекта либо приводить к появлению двух мета-страниц с одинаковым номером транзакции, что является ошибочной ситуацией. --- src/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.c b/src/core.c index 24120404..9b3cb61a 100644 --- a/src/core.c +++ b/src/core.c @@ -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);