Випуск СУБД libmdbx 0.11.7. Перенесення розробки на GitFlic після блокування у GitHub

Відбувся випуск бібліотеки libmdbx 0.11.7 (MDBX) з реалізацією високопродуктивної компактної бази даних класу ключ-значення. Код libmdbx розповсюджується під ліцензією OpenLDAP Public License. Підтримуються всі актуальні операційні системи та архітектури, а також російський Ельбрус 2000.

Реліз примітний міграцією проекту на сервіс GitFlic після того, як 15 квітня 2022 року адміністрація GitHub без будь-яких попереджень та пояснення причин видалила libmdbx разом з масою інших проектів, одночасно заблокувавши доступ багатьом розробникам, пов'язаним із компаніями, які потрапили під санкції США. З погляду користувачів, всі сторінки, репозиторій та форки проекту раптово перетворилися на сторінку «404», без можливості будь-яких комунікацій та з'ясування причин.

На жаль втрачено майже всі питання, в яких було багато питань з докладними відповідями, а також чимало обговорень. Втрата цієї інформації є єдиною об'єктивною шкодою, яку адміністрацією GitHub вдалося завдати проекту. Частково копії обговорень залишаються доступними в архіві archive.org.

Втрата відбудованих CI-сценаріїв та інфраструктури (доступної для OpenSource-проектів безкоштовно) змусила зайнятися ревізією, уніфікацією та усуненням невеликого техборгу. Зараз CI відновлено майже в колишньому обсязі, за винятком складання та прогон-тестів для всіх варіантів BSD та Solaris. Що характерно, після дій з боку GitHub не надійшло жодних роз'яснень чи повідомлень, не рахуючи нагадування про необхідність оплати та спроб списати гроші.

З моменту минулої новини про реліз libmdbx v0.11.3, крім відновлення після дій GitHub, варто відзначити такі доробки та виправлення:

  • Додано обхід виявленого ефекту/дефекту некогерентності в об'єднаному кеші сторінок та буферів у ядрі Linux. У системах, де кеш сторінок і буферів дійсно об'єднаний, ядру немає сенсу витрачати пам'ять під дві копії даних при записі в файл, що вже відображений у пам'ять. Тому дані, що записуються, стають видимими через відображення в пам'яті до завершення системного виклику write(), навіть якщо дані ще не записані на диск.

    Сумарно інша поведінка не раціональна, бо при відкладеному злитті все одно доведеться захоплювати блокування для списків сторінок, копіювати дані або коригувати PTE. Тому негласне правило когерентності діяло з 1989 року, коли SRV4 з'явився unified buffer cache. Тому виявлення дивних збоїв у навантажених сценаріях експлуатації libmdbx вимагало великої роботи. Спочатку щодо відтворення проблеми, потім щодо верифікації гіпотез та перевірки доробок.

    Зараз можна впевнено сказати, що проблема достовірно ідентифікована, локалізована та надійно усунена, незважаючи на всю складність та специфічність сценарію відтворення. Додатково робота механізму обходу була підтверджена одним із розробників Erigon (Ethereum), у його випадку на складання налагоджувальної спрацьовування захисту проявлялося у вигляді регресу через зайву assert-перевірки.

    Слід зазначити, що в контексті широкого застосування libmdbx у робочих проектах, принципово важливішим є забезпечення надійної роботи, а не з'ясування «помилка це чи особливість» і чи можна покладатися на таку когерентність, тим більше не пошук причин некогерентності всередині ядра Linux. Тому тут йдеться про усунення проблеми, яка могла торкатися користувачів.

  • Усунено регрес виникнення помилки EXDEV (Cross-device link) при гарячому копіюванні БД без компактифікації на іншу файлову систему як через API, так і утилітою mdbx_copy.
  • Kris Zyp реалізував підтримку libmdbx у Deno. Kai Wetlesen оформив пакетування RPM Fedora. David Bouyssié реалізував прив'язки для Scala.
  • Поправлена ​​обробка значення, що задається опцією MDBX_opt_rp_augment_limit при обробці великих транзакцій у великих БД. Раніше через помилку могли проводитися зайві дії, що іноді позначалося на продуктивності в реалізаціях Ethereum (Erigon/Akula/Silkworm) та проектах Binance Chain.
  • Виправлено масу недоліків, зокрема у C++ API. Усунено багато проблем зі складанням у рідкісних та екзотичних конфігураціях. Повний список всіх значних доробок доступний в ChangeLog.
  • Сумарно внесено 185 змін до 89 файлів, додано ≈3300 рядків, видалено ≈4100. Видалено більше в основному через чищення від вже непотрібних технологічних файлів пов'язаних з GitHub та залежних сервісів.

Історично libmdbx є глибокою переробкою СУБД LMDB і перевершує свого прабатька за надійністю, набором можливостей та продуктивністю. У порівнянні з LMDB, у libmdbx велика увага приділяється якості коду, стабільній роботі API, тестуванню та автоматичним перевіркам. Постачається утиліта перевірки цілісності структури БД із деякими можливостями відновлення.

Технологічно libmdbx пропонує ACID, строгу серіалізацію змін та неблокуюче читання з лінійним масштабуванням по ядрах ЦПУ. Підтримується автокомпактифікація, автоматичне керування розміром БД, оцінка обсягу вибірок діапазонів (range query estimation). З 2016 року проект фінансується компанією Positive Technologies та з 2017 року використовується у її продуктах.

Для libmdbx пропонується розвинене C++ API, а також прив'язки, що підтримуються ентузіастами до мов Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.

Джерело: opennet.ru

Додати коментар або відгук