Публикувана версия на библиотеката libmdbx 0.13.7 (MDBX) с реализация на високо производителна компактна вградена база данни от клас ключ-стойност. Кодът на libmdbx се разпространява под лицензия Apache 2.0. Поддържат се всички актуални операционни системи и архитектури, включително и руския Елбрус 2000. За libmdbx се предлага развита API за C++, а също така и поддържани от ентусиасти връзки с езици Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala. Сред проектите, използващи libmdbx, могат да бъдат отбелязани Isar, Erigon и Reth, както и разработки на компаниите StarkWare и Positive Technologies.
Исторически, libmdbx е дълбока преработка на СУБД LMDB и превъзхожда своя родител по надеждност, набор от възможности и производителност. В сравнение с LMDB, в libmdbx се обръща голямо внимание на качеството на кода, стабилната работа на API, тестването и автоматичните проверки. Предоставя се инструмент за проверка на целостта на структурата на БД с някои възможности за възстановяване. Технологично libmdbx предлага ACID, строга сериализация на промените и не-блокиращо четене с линейно мащабиране по ядра на ЦПУ. Поддържа автоуплътняване, автоматично управление на размера на БД, оценка на обема на селекциите по диапазони (range query estimation).
Основни промени:
- Премахната е критична грешка във функционалността mdbx_env_resurrect_after_fork() при използване на SysV семафори. Грешката се проявяваше само след създаване на дъщерен процес чрез fork() на фона на изпълняваща се записваща транзакция, което водеше до неправилна работа на семафорите и по-нататък до множество различни грешки, включително до повреждане на базата данни. Проблемът съществуваше от появата на mdbx_env_resurrect_after_fork() и засяга macOS, както и POSIX платформи при компилация с опцията MDBX_LOCKING=5.
- Решен е проблем в API за копиране на бази данни, който се проявяваше на системи различни от Linux в POSIX (основно в macOS), а също така и в някои случаи при разполагане на целевия файл на не-локална файлова система. Проблемът водеше до връщане на грешка EWOULDBLOCK/EAGAIN, поради недочет/конфликт на блокировките fcntl(F_SETLK) и flock() в ядрото на ОС. Преработена е обработката на грешки при захващане на файлови блокировки в API за копиране на системи POSIX.
- Разрешена е грешка, водеща до неочаквано връщане на MDBX_BAD_DBI при едновременно стартиране на множество транзакции в един процес след отваряне на базата данни.
- Решен е проблем, водещ до неочаквано връщане на MDBX_DBS_FULL при повторно отваряне на вече отворени таблици и вече достигнат лимит на отворените DBI дескриптори.
- Поправена е грешка в компилацията за платформата Android при явно определяне на _FILE_OFFSET_BITS.
- Поправена е грешка при използване на ENOMEM вместо MDBX_ENOMEM. Това можеше да счупи компилацията на не-POSIX/Windows платформи, в зависимост от конфигурацията и/или версията на SDK.
- Коригирани или премахнати са няколко неверни assert проверки, поради които се случваха сривове на отладъчни компилации в специфични ситуации. Главно, в кода на функциите txn_end(), txn_lock() и txn_unlock() както на Windows, така и на POSIX.
- Премахнати са незначителни предупреждения MSVC. Изключени са предупреждения C5286 и C5287.
- Коригирана е логиката за отказ от използването на OFD-блокировки на POSIX платформи. Сега, освен EINVAL, се вземат предвид и допълнителни кодове за грешки (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), което ще позволи на събраната библиотека да работи в някои случаи, когато актуалното ядро/контейнер/емулатор не поддържа необходимите системни извиквания.
- В тестовия фреймворк е добавена поддръжка на опцията «—numa » за привързване на стохастичен тест към NUMA-възел. В battery/tmux скрипта е добавено изрично разпределение по NUMA-възли, което значително увеличи ефективността при тестване на NUMA машини.
- В стохастичния скрипт е реализиран случаен ред на стартиране на отделни тестове.
Източник: opennet.ru
