Выпуск встраиваСмой Π‘Π£Π‘Π” libmdbx 0.13

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ выпуск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 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-Ρ…Π΅Π½Π΄ΠΎΠ², Π·Π° счёт ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ/Π»Π΅Π½ΠΈΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ элСмСнтов слуТСбных Ρ‚Π°Π±Π»ΠΈΡ†. Π’ Ρ‚ΠΎΠΌ числС, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ€Π°Π·Ρ€Π΅ΠΆΡ‘Π½Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² 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