Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wip] mdbx: future 13 version, master build #138

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,5 @@ jobs:
with:
go-version: '1.20'

- run: go env
- run: go test -p 1 ./mdbx
- run: go test -p 1 ./exp/mdbxpool
- run: go test ./mdbx
- run: go test ./exp/mdbxpool
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

Go bindings to the libmdbx: https://libmdbx.dqdkfa.ru

**Notice**: page `./mdbx` contains only `mdbx.h` and `mdbx.c` - to minimize go build time/size.
But full version of libmdbx (produced by it's `make dist` command) is in `./../mdbxdist/`.
License is also there.

Most of articles in internet about LMDB are applicable to MDBX. But mdbx has more features.

For deeper DB understanding please read through [mdbx.h](https://gitflic.ru/project/erthink/libmdbx/blob?file=mdbx.h)
Expand Down
3 changes: 3 additions & 0 deletions mdbx/Notes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This package contains only mdbx.h and mdbx.c - to minimize go build time/size.
But full version of libmdbx (produced by it's `make dist` command) is in `./../mdbxdist/`. License is also there.

4 changes: 2 additions & 2 deletions mdbx/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,10 @@ var CorruptErrorMessage = CorruptErrorHardwareRecommendations + " " + CorruptErr

func (e Errno) Error() string {
if e == Corrupted {
return "MDBX_FATAL: " + CorruptErrorMessage
return fmt.Sprintf("MDBX_FATAL(%d): ", int(e)) + CorruptErrorMessage
}
if e == Panic {
return "MDBX_PANIC: " + CorruptErrorMessage
return fmt.Sprintf("MDBX_PANIC(%d): ", int(e)) + CorruptErrorMessage
}
return C.GoString(C.mdbx_strerror(C.int(e)))
}
Expand Down
7,996 changes: 5,796 additions & 2,200 deletions mdbx/mdbx.c

Large diffs are not rendered by default.

1,019 changes: 914 additions & 105 deletions mdbx/mdbx.h

Large diffs are not rendered by default.

24 changes: 14 additions & 10 deletions mdbx/txn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package mdbx
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"runtime"
"syscall"
Expand Down Expand Up @@ -421,16 +422,19 @@ func TestTxn_OpenDBI_emptyName(t *testing.T) {
func TestTxn_OpenDBI_zero(t *testing.T) {
env, _ := setup(t)

err := env.View(func(txn *Txn) (err error) {
_, err = txn.OpenRoot(0)
if err != nil {
return err
}
_, err = txn.Get(0, []byte("k"))
return err
})
if !IsErrno(err, BadDBI) {
t.Errorf("mdb_dbi_open: %v", err)
txn, err := env.BeginTxn(nil, 0)
if err != nil {
panic(err)
}
defer txn.Abort()

dbi, err := txn.OpenRoot(0)
if err != nil {
panic(err)
}
_, err = txn.Get(dbi, []byte("k"))
if !errors.Is(err, ErrNotFound) {
panic(err)
}
}

Expand Down
8 changes: 5 additions & 3 deletions mdbxdist/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
##
## Copyright 2020-2023 Leonid Yuriev <[email protected]>
## Copyright 2020-2024 Leonid Yuriev <[email protected]>
## and other libmdbx authors: please see AUTHORS file.
## All rights reserved.
##
Expand Down Expand Up @@ -305,7 +305,7 @@ else()
"${CMAKE_CURRENT_SOURCE_DIR}/test/valgrind_suppress.txt"
CACHE FILEPATH "Suppressions file for Valgrind" FORCE)
set(MEMORYCHECK_COMMAND_OPTIONS
"--trace-children=yes --leak-check=full --track-origins=yes --error-exitcode=42 --error-markers=@ --errors-for-leak-kinds=definite --fair-sched=yes --suppressions=${MEMORYCHECK_SUPPRESSIONS_FILE}"
"--trace-children=yes --leak-check=full --track-origins=yes --track-origins=yes --error-exitcode=42 --error-markers=@ --errors-for-leak-kinds=definite --fair-sched=yes --suppressions=${MEMORYCHECK_SUPPRESSIONS_FILE}"
CACHE STRING "Valgrind options" FORCE)
set(VALGRIND_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS}" CACHE STRING "Valgrind options" FORCE)
endif()
Expand Down Expand Up @@ -467,7 +467,7 @@ endif()
# #### # # # #### # # ####
#

set(MDBX_BUILD_OPTIONS ENABLE_UBSAN ENABLE_ASAN MDBX_USE_VALGRIND ENABLE_GPROF ENABLE_GCOV)
set(MDBX_BUILD_OPTIONS ENABLE_UBSAN ENABLE_ASAN ENABLE_MEMCHECK ENABLE_GPROF ENABLE_GCOV)
macro(add_mdbx_option NAME DESCRIPTION DEFAULT)
list(APPEND MDBX_BUILD_OPTIONS ${NAME})
if(NOT ${DEFAULT} STREQUAL "AUTO")
Expand Down Expand Up @@ -531,6 +531,8 @@ add_mdbx_option(MDBX_ENABLE_BIGFOOT "Chunking long list of retired pages during
add_mdbx_option(MDBX_ENABLE_PGOP_STAT "Gathering statistics for page operations" ON)
add_mdbx_option(MDBX_ENABLE_PROFGC "Profiling of GC search and updates" OFF)
mark_as_advanced(MDBX_ENABLE_PROFGC)
add_mdbx_option(MDBX_ENABLE_DBI_SPARSE "FIXME" ON)
add_mdbx_option(MDBX_ENABLE_DBI_LOCKFREE "FIXME" ON)

if(NOT MDBX_AMALGAMATED_SOURCE)
if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE_UPPERCASE STREQUAL "DEBUG")
Expand Down
148 changes: 140 additions & 8 deletions mdbxdist/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,143 @@ ChangeLog
English version [by Google](https://gitflic-ru.translate.goog/project/erthink/libmdbx/blob?file=ChangeLog.md&_x_tr_sl=ru&_x_tr_tl=en)
and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic.ru/project/erthink/libmdbx/blob?file=ChangeLog.md).

## v0.12.10 (подготовка к выпуску)
## v0.13.1 (в процессе подготовки выпуска)

Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов.
Новая версия с существенным расширением API и добавлением функционала.
В том числе, с незначительным нарушением обратной совместимости API
библиотеки.

Новое:

- Перенос функционала утилиты `mdbx_chk` внутрь библиотеки в виде
функции `mdbx_env_chk() `для проверка целостности структуры БД, в том
числе с вовлечением логики приложения.

- Опция `MDBX_opt_gc_time_limit` для более гибкого контроля времени
расходуемого на поиск последовательностей соседствующих свободных
страниц в GC.

- Снижение накладных расходов на запуск транзакций в сценариях с
большим количеством DBI-хендов, за счет отложенной/ленивой инициализации
элементов служебных таблиц. В том числе, механизм поддержки разреженных
наборов DBI-хендов, управляемый опцией сборки `MDBX_ENABLE_DBI_SPARSE`,
которая включена по-умолчанию.

- Снижение накладных расходов на открытие DBI-хендов. В том числе,
механизм отложенного освобождения и поддержки быстрого пути открытия без
использования блокировок, управляемый опцией сборки
`MDBX_ENABLE_DBI_LOCKFREE`, которая включена по-умолчанию.

- Расширение API позиционирования курсоров более удобными и очевидными
операциями по аналогии условиям `<`, `<=`, `==`, `>=`, `>` как для
ключей, так и для пар ключ-значение.

- Функции `mdbx_dbi_rename()` и `mdbx_dbi_rename2()` для переименования таблиц.

- Функции `mdbx_cursor_unbind()` и `mdbx_txn_release_all_cursors()` для
гибкого управления курсорами в сценариях повторного использования для
уменьшения накладных расходов.

- Функция `mdbx_env_resurrect_after_fork()` для восстановление открытой
среды работы с БД в дочернем процессе после ветвления/расщепления
процесса.

- Функция `mdbx_cursor_compare()` для сравнения позиций курсоров
аналогично оператору `<=>`.

- Функции `mdbx_cursor_scan()` и `mdbx_cursor_scan_from()` для
сканирования таблиц с использованием функционального предиката и
уменьшением сопутствующих накладных расходов.

- Функции `mdbx_cursor_on_first_dup()` и `mdbx_cursor_on_last_dup()`
для оценки позиции курсора.

- Функция `mdbx_preopen_snapinfo()` для получения информации о БД без
её открытия.

- Поддержка функций логирования обратного вызова без функционала
`vprintf()`, что существенно облегчает использование логирования в
привязках к другим языкам программирования.

- Режим работы `MDBX_NOSTICKYTHREADS` вместо `MDBX_NOTLS` для упрощения
интеграции с легковесными потоками/нитями их мультиплексирования вместе
с транзакциями по потокам операционной системы.

- TODO: Опция `MDBX_opt_prefer_waf_insteadof_balance`.

- TODO: Опции `MDBX_opt_subpage_limit`, `MDBX_opt_subpage_room_threshold`, `MDBX_opt_subpage_reserve_prereq`, `MDBX_opt_subpage_reserve_limit`.

- Управление основной блокировкой lock/unlock/upgrade/downgrade для координации пишущих транзакций.

- Функции `mdbx_limits_keysize_min()` и `mdbx_limits_valsize_min()` для
получения нижней границы длины ключей и значений.

- Расширение и доработка C++ API:

- добавлен тип `mdbx::cursor::estimation_result`, а поведение методов
`cursor::estimate()` унифицировано с `cursor::move()`;
- для предотвращения незаметного неверного использования API, для инициализации
возвращаемых по ссылке срезов, вместо пустых срезов задействован `slice::invalid()`;
- добавлены дополнительные C++ операторы преобразования к типам C API;
- для совместимости со старыми стандартами C++ и старыми версиями STL перенесены
в public классы `buffer::move_assign_alloc` и `buffer::copy_assign_alloc`;
- добавлен тип `mdbx::default_buffer`;
- для срезов и буферов добавлены методы `hex_decode()`, `base64_decode()`, `base58_decode()`;
- добавлен тип `mdbx::comparator` и функций `mdbx::default_comparator()`;
- добавлены статические методы `buffer::hex()`, `base64()`, `base58()`;
- для транзакций и курсоров добавлены методы `get_/set_context`;
- добавлен метод `cursor::clone()`;
- поддержка base58 переработана и приведена в соответствии с черновиком RFC, в текущем понимании теперь это одна из самых высокопроизводительных реализаций;
- переработка `to_hex()` и `from_hex()`.

Нарушение совместимости:
- Опция `MDBX_COALESCE` объявлена устаревшей, так как соответствующий функционал всегда включен начиная с предыдущей версии 0.12.
- Опция `MDBX_NOTLS` объявлена устаревшей и заменена на `MDBX_NOSTICKYTHREADS`.
- Опция сборки `MDBX_USE_VALGRIND` заменена на общепринятую `ENABLE_MEMCHECK`.
- В структуре `MDBX_envinfo` серии полей вида `meta1`, `meta2` и `meta3` заменены на массивы вида `meta[3]`.
- В шаблонных классах и функциях С++ API по-умолчанию вместо `mdbx::legacy_buffer` использован тип `mdbx::default_buffer` использующий полиморфные аллокаторы С++ 17.


## v0.13.0 от 2023-04-23

Не выпуск, а начало ветки `0.13` с новым функционалом и изменением API.

Новое:

- Расширение API функционалом проверки целостности структуры БД, с
переработкой и переноса функционала утилиты `mdbx_chk` внутрь библиотеки.

- Расширение API функциями lock/unlock/upgrade/downgrade основной блокировки.

- Добавление в API функций `mdbx_cursor_unbind()` и `mdbx_txn_release_all_cursors()`.

- Возвращение `MDBX_TXN_INVALID` (`INT32_MIN`) вместо `-1`
из `mdbx_txn_flags()` при передаче невалидной транзакции.

Мелочи:

- Обновление конфигурации Doxygen до 1.9.6.
- Добавление `--read-var-info=yes` для Valgrind.
- Вывод из `mdbx_chk` информации об уровне детализации/verbosity.


********************************************************************************


## v0.12.10 "СЭМ" от 2024-03-12

Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов
в память Героя России гвардии майора Дмитрия Семёнова с позывным "СЭМ".

```
git diff' stat: 16 commits, 10 files changed, 665 insertions(+), 238 deletions(-)
git diff' stat: 19 commits, 57 files changed, 751 insertions(+), 331 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <[email protected]>
```

Благодарности:

- [Dvir H](https://t.me/Dvirsw) за [сообщение](https://t.me/libmdbx/5368)
об ошибке `MDBX_CORRUPTED` в сценарии работы в режиме `MDBX_DUPFIXED` и нечетной длинной
об ошибке `MDBX_CORRUPTED` в сценарии работы в режиме `MDBX_DUPFIXED` и нечетной длиной
мульти-значений, с предоставлением точного минимального сценария воспроизведения.

Значимые исправления и доработки:
Expand All @@ -34,18 +158,18 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <[email protected]>
вероятность проявления близка к нулю, а сценарий такого проявления найти не удалось.

В MDBX ошибка присутствовала с момента отделения проекта от LMDB,
где эта ошибка присутствует более 11 лети, по настоящее время.
где эта ошибка присутствует более 11 лет, по настоящее время.

- Исправление ложной ошибки `MDBX_CORRUPTED (-30796)` в сценарии работы
в режиме `MDBX_DUPFIXED` и нечетной длинной мульти-значений.
в режиме `MDBX_DUPFIXED` и нечетной длиной мульти-значений.

- Исправление недочета корректировки сопутствующих курсоров при разделении страницы
по сценарию добавления пустой страницы слева.

- Доработка `rebalance()` ради уменьшения WAF. Новый функционал, включая
контролируемую пользователем опцию `enum MDBX_option_t`, будет доступен
в выпусках ветки `0.13.x`, а в этом выпуске доработка сводится к тактике
не-вовленичения чистой страницы при нехватке запаса страниц в ходе обновления GC,
не-вовлечения чистой страницы при нехватке запаса страниц в ходе обновления GC,
за счет ухудшения баланса дерева страниц.

- Устранение упущения приводящего к нелогичной ситуации
Expand All @@ -62,6 +186,13 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <[email protected]>
- Исправление assert-проверки внутри `check_txn()` для случая завершенных транзакций в режиме `MDBX_NO_TLS`.
Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет.

- Устранение ошибки при открытии БД на файловой системе только-для-чтения.

- Удалены излишне строгие проверки в утилите `mdbx_chk`, которые
приводили к ложно-позитивным ошибкам при проверке БД после серии
последних доработок. Подробности см в комментариях к коммитам [781b3f64d52b73cbaeb00a55811d1247c25624a8](https://gitflic.ru/project/erthink/libmdbx/commit/781b3f64d52b73cbaeb00a55811d1247c25624a8)
и [0741c81cfd8dc0864fcf55e04192b2207c8f68f7](https://gitflic.ru/project/erthink/libmdbx/commit/0741c81cfd8dc0864fcf55e04192b2207c8f68f7).

Прочее:

- Расширение стохастического теста dupfixed-сценариями.
Expand Down Expand Up @@ -144,6 +275,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <[email protected]>

## v0.12.8 "Владимир Уткин" от 2023-10-17


Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов,
в день 100-летия со дня рождения выдающегося советского и российского ученого и конструктора [Влади́мира Фёдоровича У́ткина](https://ru.wikipedia.org/wiki/Уткин,_Владимир_Фёдорович).

Expand All @@ -161,7 +293,7 @@ Signed-off-by: Леонид Юрьев (Leonid Yuriev) <[email protected]>

- Устранение регресса/ошибки в пути обработки `put(MDBX_MULTIPLE)` при пакетном/оптовом
помещении в БД множественных значений одного ключа (aka multi-value или dupsort).
Проявление проблемы зависит от компилятора и опций оптимизации/кодогенерации, но с большой вероятностью возвращется
Проявление проблемы зависит от компилятора и опций оптимизации/кодогенерации, но с большой вероятностью возвращается
ошибка `MDBX_BAD_VALSIZE` (`-30781`), а в отладочных сборках срабатывает проверка `cASSERT(mc, !"Invalid key-size")`.
Сценарии приводящие к другим проявлениям на данный момент не известны.

Expand Down
Loading
Loading