mdbx-chk: не считаем ошибочными/проблемными записи нулевой длины в GC.
Технически такие записи не являются проблемными, а образовываются в случае когда внутри update_gc() резервируется больше места, чем реально остается номеров свободных страниц для возврата в GC. Изначально такое избыточное резервирование считалось алгоритмическим недостатком update_gc(). Поэтому утилита mdbx_chk была временно доработана для выявления таких случаев в ходе стохастических тестов. Постепенно все реальные недочеты update_gc() (если не считать запутанности и неочевидности кода) были устранены, формирование пустых записей в GC не наблюдалось и излишне строгий контроль в mdbx_chk не создавал проблем. В ходе же последних точечных доработок была предпринята попытка еще немного уменьшить затраты ЦПУ внутри update_gc(), в частности уменьшить кол-во циклов/повторов посредством улучшения сходимости, а также уменьшить WAF. При этом образование пустых записей в GC стало возможным в достаточно редких ситуациях, когда (например) для возврата в GC остается только одна страница и добавление записи единичной длины приводит к перебалансировке или разделению листовой страницы по легковесному пути, без вовлечения других страниц дерева и без переработки дополнительных записей GC, но с поглощением остававшейся на возврат страницы. Проще говоря, в актуальная версии MDBX пустые записи в GC могут образовываться, когда это энергетически выгодно. Тогда как в предыдущих выпусках в таких ситуациях выполнялось более дорогое обновление GC с переработкой и возвратом дополнительных записей.
This commit is contained in:
parent
446d6c9421
commit
781b3f64d5
|
@ -611,7 +611,7 @@ static int handle_freedb(const uint64_t record_number, const MDBX_val *key,
|
|||
problem_add("entry", txnid, "wrong idl size", "%" PRIuPTR,
|
||||
data->iov_len);
|
||||
size_t number = (data->iov_len >= sizeof(pgno_t)) ? *iptr++ : 0;
|
||||
if (number < 1 || number > MDBX_PGL_LIMIT)
|
||||
if (number > MDBX_PGL_LIMIT)
|
||||
problem_add("entry", txnid, "wrong idl length", "%" PRIuPTR, number);
|
||||
else if ((number + 1) * sizeof(pgno_t) > data->iov_len) {
|
||||
problem_add("entry", txnid, "trimmed idl",
|
||||
|
|
Loading…
Reference in New Issue