Публикуван е брой на библиотеката libmdbx 0.13.1 (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).
Основни промени:
- Промяна на лиценза на кода от OpenLDAP Public License на Apache 2.0.
- Разширение на API на курсорите с по-удобни и очевидни операции за позициониране по аналогия с условията <, =, > както за ключове, така и за двойки ключ-стойност. Добавени са функции mdbx_cursor_unbind() и mdbx_txn_release_all_cursors() за гъвкаво управление на курсорите в сценарии на повторно използване за намаляване на разходите. Функции mdbx_cursor_scan() и mdbx_cursor_scan_from() за сканиране на таблици с използване на функционален предикат и намаляване на съпътстващите разходи.
- Преработка на курсорите за унифициране на поведението, по-регулярен код и намаляване на броя на клоновете и машинните операции.
- Преместване на функционалността на утилитата mdbx_chk вътре в библиотеката под формата на функция mdbx_env_chk() за проверка на целостта на структурата на БД, включително с ангажиране на логиката на приложението.
- Опция MDBX_opt_gc_time_limit за по-гъвкаво управление на времето, изразходвано за търсене на последователности от съседни свободни страници в GC.
- Съществено намаляване на разходите при стартиране на транзакции в сценарии с голям брой DBI-хендъри, чрез отложена/ленивa инициализация на елементи от служебните таблици. Включително, механизъм за поддръжка на разредени набори от DBI-хендъри, управляван от опцията за компилация MDBX_ENABLE_DBI_SPARSE, която е включена по подразбиране.
- Намаляване на разходите за отваряне на DBI-хендъри. Включително, механизъм за отложено освобождаване и поддръжка на бърз път за отваряне без използване на блокировки, управляван от опцията за компилация MDBX_ENABLE_DBI_LOCKFREE, която е включена по подразбиране.
- Поддръжка на "паркиране" на четящи транзакции с изтласкване за обработка на стари MVCC-снимки и предотвратяване на проблеми, причинени от спиране на обработката на боклука. Механизмът за паркиране и изтласкване на паркирани транзакции е както допълнение, така и по-прост за използване алтернативен вариант на обратното повикване Handle-Slow-Readers. За удобство, функциите mdbx_txn_park() и mdbx_txn_unpark() имат допълнителни аргументи, позволяващи да се изисква автоматично "разпаркиране" на паркираните и рестартиране на изтласканите транзакции. В утилитата mdbx_copy са добавени съответните опции -d и -p.
- Поддръжка на възстановяване на отворена работна среда с БД в дъщерен процес след разклоняване/разделяне на процеса чрез mdbx_env_resurrect_after_fork().
- Поддръжка на преименуване на таблици чрез mdbx_dbi_rename() и mdbx_dbi_rename2(). Добавена е функция mdbx_enumerate_tables() за получаване на информация за именуваните потребителски таблици.
- Режим на работа MDBX_NOSTICKYTHREADS вместо MDBX_NOTLS за опростяване на интеграцията с леки потоци/нишки и тяхното мультиплексиране заедно с транзакции от операционната система.
- За идентификация на БД е добавен UUID, наличен в полето mi_dxbid на структурата MDBX_envinfo, получавана чрез mdbx_env_info_ex(). Реализирано е получаване на информация за БД без нейното отваряне чрез mdbx_preopen_snapinfo().
- Поддръжка на функции за логиране на обратни повиквания без функционалност vprintf(), което съществено улеснява използването на логиране в свързването с други програмни езици.
- Добавяне в API на функции mdbx_txn_copy2pathname() и mdbx_txn_copy2fd().
- Реструктуриране на изходния код с рефакторинг.
- Използване на термина „таблица“ вместо „subDb“.
- Обявяване за остарели опциите MDBX_COALESCE и MDBX_NOTLS. Замяна на сборната опция MDBX_USE_VALGRIND с общоприетата ENABLE_MEMCHECK.
Източник: opennet.ru
