Опубліковано випуск бібліотеки libmdbx 0.13.3 (MDBX) з реалізацією високопродуктивної компактної бази даних класу ключ-значення. Код libmdbx розповсюджується під ліцензією Apache 2.0. Підтримуються всі актуальні операційні системи та архітектури, а також російський Ельбрус 2000. Для libmdbx пропонується розвинене API для C++, а також прив'язки, що підтримуються ентузіастами до мов Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.
Історично libmdbx є глибокою переробкою СУБД LMDB і перевершує свого прабатька за надійністю, набором можливостей та продуктивністю. У порівнянні з LMDB, у libmdbx велика увага приділяється якості коду, стабільній роботі API, тестуванню та автоматичним перевіркам. Постачається утиліта перевірки цілісності структури БД із деякими можливостями відновлення. Технологічно libmdbx пропонує ACID, строгу серіалізацію змін та неблокуюче читання з лінійним масштабуванням по ядрах ЦПУ. Підтримується автокомпактифікація, автоматичне керування розміром БД, оцінка обсягу вибірок діапазонів (range query estimation).
Основні зміни:
- Гілка 0.13.x набула статусу стабільної. Почалася розробка гілки 0.14.
- C API додана функція mdbx_cursor_count_ex(), що дозволяє отримати як кількість мульти-значень відповідних поточному ключу, так і інформацію про вкладене дерево, що зберігає ці значення.
- У C++ API додано метод mdbx::txn::make_broken() аналогічний mdbx_txn_break().
- В утилітах mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat реалізовано логування помилок, попереджень та важливих повідомлень від libmdbx.
- Зміна поведінки:
- При включенні профілювання збирача сміття (складання з опцією MDBX_ENABLE_PROFGC=ON) тепер підраховуються витрати часу CPU злиття списків сторінок, тобто. працювати функції pnl_merge().
- В утиліті тестування значення режиму даних перейменовано з data.dups на data.multi.
- Доопрацьовано контроль довжини ключа всередині cursor_seek().
- Якщо за допомогою mdbx_env_set_option(MDBX_opt_txn_dp_limit) користувач не встановить власне значення, то виконується підстроювання dirty-pages-limit при старті кожної не вкладеної пишучої транзакцій, виходячи з обсягу доступного ОЗУ і розміру БД.
- У режимі MDBX_NOSTICKYTHREADS допускається commit/abort вкладених транзакцій з будь-якого треду/потоку.
- При спробі запуску вкладених транзакцій у режимі MDBX_WRITEMAP здійснюється логування та повернення помилки MDBX_INCOMPATIBLE.
- У C++ API у конструкторах/ініціалізаторах та методах, пов'язаних із формуванням геометрії БД, за замовчуванням використовуються лише default-значення.
- Всередині mdbx_env_set_geometry() допрацьовано евристики для підбору параметрів геометрії БД, які запитують користувач «за замовчуванням».
- Ісправления:
- Усунено регрес нерозблокування м'ютексу при спробі повторного закриття dbi-дескриптора, у тому числі при спробі явно закрити дескриптор після видалення таблиці, пов'язаної з ним.
- Усунено регрес стану вкладеного/dupsort курсору після вставки даних у MDBX_APPEND-режимі.
- Підтримка отримання boot_id під час роботи всередині LXC-контейнера.
- Усунена помилка неправильної обробки спроби запуску вкладеної транзакції, що читає. Тепер у таких ситуаціях повертається помилка MDBX_EINVAL, оскільки вкладеність підтримується лише для транзакцій читання-запису.
- Усунений SIGSEGV-регрес звернення до нульової адреси при роботі в режимі тільки-читання без використання LCK-файлу, наприклад, при розміщенні БД на носії доступному тільки для читання.
Джерело: opennet.ru
