libmdbx (2024-09-27 ... 2025-01-16)
MDBX_INTEGERKEY
the keys compared as an octet-strings, i.e. by the memcmp()
.MDBX_APPEND
requires (and checks) insertions comes with the keys sort/comparison order.MDBX_INTEGERKEY
and with MDBX_APPEND
insertions must be comes in ascending order for octet-strings, and this will be done if integer-like keys will be big-endian encoded.
DUPSORT
is also limited as key size? I can understand the key and subkey should be limited but why does values also have this limitation?
DUPSORT
less useful
mdbx_get_sysraminfo()
.
DUPSORT
dont_sync
is forced to true
here?SAFE_NOSYNC
?
dont_sync = true
(i.e. the flag to not-perform sync-to-disk on closing) executed in the following cases:env->dxb_mmap.base == nullptr
)(env->flags & MDBX_RDONLY) != 0
)(env->flags & ENV_FATAL_ERROR) != 0
)master
branch for any development, the last release for staging/testing (and then for production), and later a stable
branch when the hive of used release get out to stable
phase (i.e. got rid of any feature development but bugfix only).git diff' stat: 6 commits, 5 files changed, 239 insertions(+), 6 deletions(-)
mdbx_dump
to double-check. I observed that the values inserted afterwhile are not sorted when traversing with MDBX_NEXT_DUP
. For instance, I inserted 1, 2, 4, 3 and iterating gives exactly 1, 2, 4, 3 but not 1, 2, 3, 4. The key is the same of course.
MDBX_PROBLEM
при фиксации транзакций.devel
branch), but it just works (on the devel and stable branches both).if (mc->mc_flags & C_UNTRACK)
.stable
and/or the master
branches.txn_begin
calls with parent
always NULL, it returned MDBX_BAD_RSLOT: Invalid reuse of reader locktable slot, e.g. read-transaction already run for current thread
txn_begin
with parent
is the last successful txn, it returned MDBX_BAD_TXN: Transaction is not valid for requested operation, e.g. had errored and be must aborted, has a child, or is invalid
09:42:45.371 [blocking-thread--p3-t2] ::: TRACE o.i.persistence.mdbx.MdbxDbStore - Closing cursor Cursor[Id:1570174338, db:Database [id=21, name=datasegmentdb_19], txn:Transaction [ThreadId=259, Id=836]
09:42:45.371 [blocking-thread--p3-t2] ::: TRACE o.i.persistence.mdbx.MdbxDbStore - Closing transaction Transaction [ThreadId=259, Id=836]
09:42:45.389 [non-blocking-thread--p2-t12] ::: TRACE o.i.persistence.mdbx.MdbxDbStore - Closing cursor Cursor[Id:1324656279, db:Database [id=22, name=datasegmentdb_20], txn:Transaction [ThreadId=259, Id=836]
-D
пробрасывается.
add_subdirectory
подключаю, то всё ок. Пока там оставлю.
cmake —trace --trace-expand
вы точно сможете найти причину появления -D
.
-fvisibility
.
check_c_compiler_flag()
для проверки -fvisibility
ошибочно используется что-то другое.
master
на Gitflic готова для выпуска версии 0.13.2
.make dist
).conan create
пока не работает в Windows, но последующая сборка при использовании пакета конечно работает.
conan create .
conan create .
, затем conan upload -r SERVER 'libmdbx/*'
0xD104d8f8B2dC312aaD74899F83EBf3EEBDC1EA3A
.mdbx_stat version 0.13.1.0
- source: v0.13.1-0-g5fc7a6b1 2024-08-30T00:01:07+03:00, commit 5fc7a6b1077794789b97bb2a56f5a4eb541a0bc0, tree 4ad05c5f867a963162def46b68eff5f7130b81ca
- anchor: 4ef6bfc2012bedf4af0bcd644ec87ace207f395c5d5e103573649032ec2cb6e8_v0_13_1_0_g5fc7a6b1
- build: 2024-12-07T18:39:55+0300 for x86_64-linux-gnu by cc (Debian 12.2.0-14) 12.2.0
- flags: MDBX_BUILD_CXX=YES -DNDEBUG=1 -std=gnu++23 -O2 -g -Wall -Werror -Wextra -Wpedantic -ffunction-sections -fPIC -fvisibility=hidden -pthread -Wno-error=attributes -fno-semantic-interposition -Wno-unused-command-line-argument -Wno-tautological-compare -Wl,--gc-sections,-z,relro,-O1 -Wl,--allow-multiple-definition -lstdc++fs -lm -lrt
- options: MDBX_DEBUG=0 MDBX_WORDBITS=64 BYTE_ORDER=LITTLE_ENDIAN MDBX_ENABLE_BIGFOOT=1 MDBX_ENV_CHECKPID=AUTO=0 MDBX_TXN_CHECKOWNER=AUTO=1 MDBX_64BIT_ATOMIC=AUTO=1 MDBX_64BIT_CAS=AUTO=1 MDBX_TRUST_RTC=AUTO=0 MDBX_AVOID_MSYNC=0 MDBX_ENABLE_REFUND=1 MDBX_ENABLE_MADVISE=1 MDBX_ENABLE_MINCORE=1 MDBX_ENABLE_PGOP_STAT=1 MDBX_ENABLE_PROFGC=0 _GNU_SOURCE=YES MDBX_LOCKING=AUTO=2008 MDBX_USE_OFDLOCKS=AUTO=1 MDBX_CACHELINE_SIZE=64 MDBX_CPU_WRITEBACK_INCOHERENT=0 MDBX_MMAP_INCOHERENT_CPU_CACHE=0 MDBX_MMAP_INCOHERENT_FILE_WRITE=0 MDBX_UNALIGNED_OK=8 MDBX_PNL_ASCENDING=0
memset()
.devel
, чуть позже пролью в master
.
evex512
optimizations? I can't seem to be able to find any build flag for this. This is really needed as a lot of my users don't have avx512 CPUs.build.zig
(this has the advantage of easy cross-compilation).exev512
support results in a cascade of errors, such as the attached screenshot
evex512
target, but then it doesn't work on any older x86_64 cpu)
MDBX_HAVE_BUILTIN_CPU_SUPPORTS=0
.MDBX_HAVE_BUILTIN_CPU_SUPPORTS=0
, the build seems to work! But drawback seems that on x86/x64 the optimizations will be disabled. If I compile with evex512
in build.zig with this flag, will AVX512 optimizations work on a supported device?build.zig
MDBX_Txn::MDBX_Txn(const Napi::CallbackInfo &info) : Napi::ObjectWrap<MDBX_Txn>(info) {
unsigned int envFlags;
unsigned int txnFlags = MDBX_TXN_READWRITE;
int rc;
MDBX_txn *parentTxn = nullptr;
MDBX_env *env = info[0].As<Napi::External<MDBX_env>>().Data();
// MDBX_Txn parentTxn = info[1].As<Napi::External<MDBX_Txn>>().Data();
rc = mdbx_env_get_flags(env, &envFlags);
if (rc) {
Utils::throwMdbxError(info.Env(), rc);
return;
}
if (envFlags & MDBX_RDONLY) {
txnFlags = MDBX_TXN_RDONLY;
}
if (info[1].IsObject()) {
Napi::Object options = info[1].ToObject();
Utils::setFromObject(&txnFlags, MDBX_TXN_RDONLY, options, "readOnly");
Utils::setFromObject(&txnFlags, MDBX_TXN_RDONLY_PREPARE, options, "prepare");
Utils::setFromObject(&txnFlags, MDBX_TXN_TRY, options, "try");
Utils::setFromObject(&txnFlags, MDBX_TXN_NOMETASYNC, options, "noMetaSync");
Utils::setFromObject(&txnFlags, MDBX_TXN_NOSYNC, options, "noSync");
Napi::Value parentTxnValue = options.Get("parentTxn");
if (parentTxnValue.IsObject()) {
Napi::Object parentTxnObj = parentTxnValue.ToObject();
if (parentTxnObj.InstanceOf(MDBX_Txn::constructor.Value())) {
// MDBX_Txn *parentTxnClass = parentTxnValue.As<Napi::External<MDBX_Txn>>().Data();
MDBX_Txn *parentTxnClass = Napi::ObjectWrap<MDBX_Txn>::Unwrap(parentTxnObj);
parentTxn = parentTxnClass->txn;
} else {
Napi::TypeError::New(info.Env(), "Invalid parentTxn: not an instance of Txn").ThrowAsJavaScriptException();
return;
}
}
}
rc = mdbx_txn_begin(env, parentTxn, static_cast<MDBX_txn_flags>(txnFlags), &this->txn);
if (rc) {
Utils::throwMdbxError(info.Env(), rc);
return;
}
}
const txn1 = env.getTxn();
const txn2 = env.getTxn({
parentTxn: txn1
});
console.log(txn2.info())
txn1.abort();
__builtin_cpu_supports()
.__builtin_cpu_supports()
feature requires support both from compiler and libc.
MDB_NOTLS
которая во многом аналогична MDBX_NOSTICKYTHREADS
.
151 files changed, 10647 insertions(+), 14952 deletions(-)
MDBX_DISABLE_SSE2=1
?
__AVX512BW__
, __ AVX2__
, __SSE2__
, __ARM_NEON__
).export CC=/usr/bin/clang
before compiling?
clang
and gcc
don't have this problem, only zig
since 0.13 (even though zig internally uses clang)
-U__AVX512BW__ -U__AVX2__ -U__SSE2__ -U__ARM_NEON__
to zig compiler.
MDBX_WRITEMAP
mode,MDBX_opt_txn_dp_limit
.mdbx_txn_info()
, а для получения объема GC не следует её читать — это может быть очень накладно в экстремальных случаях.mdbx_stat -ef
/ mdbx_chk -vvv
и соответствующий исходный код.
mdbx_chk -vvv
и/или mdbx_stat -efa
.
MDBX_WRITEMAP
enabled, then OS will be responsible for swapping which is not accurate as libmdbx itself; and that's why the performance may suffer. But as long as DB can fit in memory, swapping out is minimal so WRITEMAP
reduces overhead of tracking pages, etc and hence improves performance.FlushViewOfFile()
;/proc/sys/kernel/random/boot_id
.
mdbx_chk -vv
?
mdbx_chk v0.13.2-0-gb687e835 (2024-12-11T21:51:56+03:00, T-5c7ffd4bbdaaf3578a64afed16bac16f06db2837)
Running for /newhdd/mdbx/0-main/ in 'read-only' mode with verbosity level 2 (of 0..9)...
open-MADV_DONTNEED 290802734..536870912
readahead OFF 0..290802734
- Taking lock... done
dxb-id bfc32c6395f7b13d-2c98e0cf3b384021
current boot-id is unavailable
- Peek the meta-pages...
pagesize 4096 (4096 system), max keysize 1980..2022, max readers 114
mapsize 2199023255552 (2.00 TiB)
fixed datafile: 2199023255552 (2.00 TiB), 536870912 pages
= transactions: recent 1726, latter reader 1726, lag 0
- Traversal B-Trees by txn#1726...
"current boot-id is unavailable"
./proc/sys/kernel/random/boot_id
не доступен пользователю от имени которого работает софт ?
src/global.c
есть __attribute__((__constructor__)) mdbx_global_constructor()
, оттуда вызывается mdbx_init()
и далее osal_ctor()
.osal_ctor()
находится в src/osal.c
и в её конце есть globals.bootid = osal_bootid();
.osal_bootid()
относительно проста для случая Linux, и вот желательно понять доходит ли до неё управление, а если доходит то почему не отрабатывает.fstatfs(fd, &fs) == 0 && fs.f_type == /* procfs */ 0x9FA0
.fstatfs()
или значение fs.f_type
, если вызов fstatfs успешен.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/vfs.h>
int main(int argc, char *argv[]) {
const int fd = open("/proc/sys/kernel/random/boot_id", O_RDONLY | O_NOFOLLOW);
if (fd == -1) {
perror("open(/proc/sys/kernel/random/boot_id)");
return EXIT_FAILURE;
}
struct statfs fs;
if (fstatfs(fd, &fs) != 0) {
perror("fstatfs()");
return EXIT_FAILURE;
}
printf("fs.f_type = 0x%lX\n", fs.f_type);
return EXIT_SUCCESS;
}
O_NOFOLLOW
определен в fcntl.h уже лет 25
mount
и lsblk -f
в контейнере ?
devel
, т.е. собрать и запустить mdbx_chk -vv
devel
.master
как подтвердите что у вас всё хорошо, включая bootid внутри LXC.cursor.next()
.cursor.bind()
полностью сбрасывает состояние курсора, т.е. его позицию т.д.,next()
с продолжением уже не возможен.cursor.next()
сразу после cursor.bind()
аналогичен вызову cursor.first()
.root@srv1:/home/admin/keller-node-mdbx/libmdbx# ./mdbx_chk -vv /newhdd/mdbx/0-main/
mdbx_chk v0.13.2-4-gccdb6255 (2024-12-13T08:26:55+03:00, T-d5724ae9078d590b13d807bd628aae9f762d6e13)
Running for /newhdd/mdbx/0-main/ in 'read-only' mode with verbosity level 2 (of 0..9)...
open-MADV_DONTNEED 290802734..536870912
readahead OFF 0..290802734
- Taking lock... done
dxb-id bfc32c6395f7b13d-2c98e0cf3b384021
current boot-id is unavailable
- Peek the meta-pages...
pagesize 4096 (4096 system), max keysize 1980..2022, max readers 114
mapsize 2199023255552 (2.00 TiB)
fixed datafile: 2199023255552 (2.00 TiB), 536870912 pages
= transactions: recent 2434, latter reader 2434, lag 0
- Traversal B-Trees by txn#2434...^C
- Processing @GC by txn#2434...
! used pages mismatch (40792(walked) != 290802734(allocated - GC))
! GC pages mismatch (290761942(expected) != 0(GC))
- Page allocation:
backed by file: 536870912 pages (100.0%), 0 left to boundary (0.0%)
used: 40792 page(s), 0.0% of backed, 0.0% of boundary
remained: 246068178 page(s) (45.8%) of backed, 246068178 to boundary (45.8% of boundary)
reclaimable: 0 (0.0% of backed, 0.0% of boundary), GC 0 (0.0% of backed, 0.0% of boundary)
detained by reader(s): 0 (0.0% of backed, 0.0% of boundary), 1 reader(s), lag 0
allocated: 290802734 page(s), 54.2% of backed, 54.2% of boundary
available: 246068178 page(s) (45.8%) of backed, 246068178 to boundary (45.8% of boundary)
= total 536870912 pages, backed 536870912 (100.0%), allocated 290802734 (54.2%), available 246068178 (45.8%)
- Processing @MAIN... summary: 0 records, 0 tables, 0 key's bytes, 0 data's bytes, 0 problem(s)
No table(s)
v0.13.2-6-ga845522d
mdbx_chk v0.13.2-6-ga845522d (2024-12-15T22:17:12+03:00, T-0456e64ae0a85075d41430caf7e9c9a26a7b4d26)
Running for /newhdd/mdbx/0-main/ in 'read-only' mode with verbosity level 2 (of 0..9)...
open-MADV_DONTNEED 290802734..536870912
readahead OFF 0..290802734
- Taking lock... done
dxb-id bfc32c6395f7b13d-2c98e0cf3b384021
current boot-id b8998f38b295dcd2-748320f5b4174451
- Peek the meta-pages...
pagesize 4096 (4096 system), max keysize 1980..2022, max readers 114
mapsize 2199023255552 (2.00 TiB)
fixed datafile: 2199023255552 (2.00 TiB), 536870912 pages
= transactions: recent 2434, latter reader 2434, lag 0
- Traversal B-Trees by txn#2434...^C
- Processing @GC by txn#2434...
! used pages mismatch (10974(walked) != 290802734(allocated - GC))
! GC pages mismatch (290791760(expected) != 0(GC))
- Page allocation:
backed by file: 536870912 pages (100.0%), 0 left to boundary (0.0%)
used: 10974 page(s), 0.0% of backed, 0.0% of boundary
remained: 246068178 page(s) (45.8%) of backed, 246068178 to boundary (45.8% of boundary)
reclaimable: 0 (0.0% of backed, 0.0% of boundary), GC 0 (0.0% of backed, 0.0% of boundary)
detained by reader(s): 0 (0.0% of backed, 0.0% of boundary), 1 reader(s), lag 0
allocated: 290802734 page(s), 54.2% of backed, 54.2% of boundary
available: 246068178 page(s) (45.8%) of backed, 246068178 to boundary (45.8% of boundary)
= total 536870912 pages, backed 536870912 (100.0%), allocated 290802734 (54.2%), available 246068178 (45.8%)
- Processing @MAIN... summary: 0 records, 0 tables, 0 key's bytes, 0 data's bytes, 0 problem(s)
No table(s)
mdbx_cursor_count()
прочитать просуммировать pages-счетчики структуры mc->subcur->nested_tree
go test ./test -run=Nothing -bench=MDBX -benchmem
(yes, I forgot to mention it is using the golang bindings)
v0_12_9_16_gfff3fbd8
.
MDB_NOLOCK
mode, which is available in LMDB.src/lck-posix.c
line 827: const int err = osal_ipclock_lock(env, &env->lck->wrt_lock, dont_wait)
src/lck-posix.c
line 844: int err = osal_ipclock_unlock(env, &env->lck->wrt_lock);
lck_txn_lock()
and lck_txn_unlock()
inside src/lck-windows.c
go test ./test -run=Nothing -bench=MDBX -benchmem
master
:-bench=LMDB
does nil-ptr-bench=MDBX
no such bench
mdbx_env_open
is returning a non-zero integer 11
, which doesn't match with any defined error.EAGAIN
.mdbx_env_open
throwing this error.
mdbx_env_close
so the lock file is not "unlocked"
mdbx_env_close
)
mdbx_txn_release_all_cursors()
is for such cases).malloc
and free
function for use by mdbx?#define MDBX_malloc mi_malloc
(mimalloc)
#define osal_malloc malloc
#define osal_calloc calloc
#define osal_realloc realloc
#define osal_free free
malloc_usable_size()
too.
osal_
defines, instead used mimalloc-overrides.h
which overrides the platform malloc
functions
mi_decl_nodiscard mi_decl_export size_t mi_usable_size(const void* p) mi_attr_noexcept;
mi_decl_nodiscard mi_decl_export size_t mi_usable_size(void* p) mi_attr_noexcept;
error: conflicting types for 'malloc_usable_size'
c_allocator
to mimalloc, and don't want MDBX to be using a different allocator (glibc).
mimalloc
for MDBX, as my benchmark also indicates no improvement (like you said)mimalloc
in Zig
MDB_NOLOCK
) удален.EAGAIN=11
.I've found the .so and .dll libraries for LMDB in decent versions on the internet. I haven't found this library for libmdbx. There is an old version found in an .Net binding, but it seems to be obsolete.
Should you compile the latest version of lmdx for each platform, or at least Windows and Linux, and add it to a repository somewhere ?
Do you use it in production ?
Which platforms have you deeply tested ?
MDBX_NOSTICKYTHREADS
при первом использовании _инстанции_ читающей транзакции (сам объект транзакции связан со слотом в таблице читателей, но может быть переиспользован без блокировок).mpack
C library) because it supports JSON-like documents and is pretty fast (few microseconds to parse and encode).mdbx_env_resurrect_after_fork()
в качестве аргумента принимает указатель на экземпляр MDBX_env
, который необходимо "воскресить" в дочернем процессе после вызова fork()
. Но это не имеет никакого отношения ни к повторному открытию БД, ни к использованию БД из нескольких потоков.
mdbx_env_copy()
and friends functions to make online backup/copy with optional compactification.boost::spirit
или что-то мутят на wave...mdbx_env_close()
) уже после того как отработал глобальный деструктор libmdbx, вызываемый системой на уровне ABI разделяемых библиотек. Другими словами, скорее всего у вас mdbx_env_close()
вызывается как-бы после выгрузки libmdbx.dll, т.е. после отработки вызова DllMain(DLL_PROCESS_DETACH)
и отработки`mdbx_fini()`.
with Env(...) as env
etcmaster
branch for development, rather that stable
(which is for support already-in-production project).Да, k6 в основном предназначен для нагрузочного тестирования веб-приложений и API, то есть для сетевых тестов. Он оптимизирован для симуляции большого количества HTTP-запросов к веб-серверам и оценки их производительности под нагрузкой. K6 позволяет анализировать такие аспекты, как время отклика, пропускная способность и стабильность системы при определенном объеме трафика.
mdbx_chk -vvv
для domain_reverse, там много чего подсчитывается (заполнение страницы, средняя длина клюей/значнений и т.п.) ?#include "src/mitata.hpp"
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main() {
mitata::runner runner;
runner.bench("noop", []() { });
runner.summary([&]() {
runner.bench("empty fn", []() { });
runner.bench("fibonacci", []() { fibonacci(20); });
});
auto stats = runner.run();
}
mdbx_dump | lz4 | nc | lz4 -d | mdbx_load
.MDBX_GET_MULTUPLE
currently works.global_version
at all (
mdbx_page_count()
— OK, since it is the mdbx_dbi_stat()
actually.mdbx_page_get(id)
— NO, since this means getting the page not by its linear number in the database file, but by its ordinal number in the b-tree, which requires traversing the tree (at least to build such a map).page-id
at all in such manner.
LIBMDBX_API int mdbx_env_pgwalk(MDBX_txn *txn, MDBX_pgvisitor_func *visitor,
void *ctx, bool dont_check_keys_ordering);
page_content
pointer is impossible, but an array/vector of a pair of MDBX_val
for key-values pairs.mdbx_copy -c
), or restoring from a database backup on the master breaks everything.CMake -D MDBX_FORCE_ASSERTIONS=ON
-DMDBX_FORCE_ASSERTIONS=1
) ?
size_t reasonable_dpl_limit = (size_t)(total_ram_pages + avail_ram_pages) / 42;
int err = mdbx_get_sysraminfo(&page_size, &total_ram_pages, &avail_ram_pages);
0.13.3
планируется через 10 дней.master
уже готова к этому (см. ChangeLog).архив/0.12
;stable
;devel
на Gitflic пролита предварительная версия запрошенной вами доработки.master
подготовлена версия для выпуска 0.13.3, а сам выпуск запланирован на завтра.devel
подготовлено больше изменений, включая рефакторинг необходимый для реализации запланированных новых возможностей 0.14.x
:stable
пойдет в архив как архив/0.12
;master
станет stable
, где будет продолжена поддержка линейки 0.13.x;devel
будет влита в master
, а дальше в devel
будет продолжена разработка 0.14.x.
mdbx_dump
и восстановить посредством mdbx_load -a
.
devel
-ветке я переписываю историю, и достаточно часто (особенно при рефакторинге и сортировке коммитов перед релизами).
/tmp
, windows: t:\
), то выстреливает ошибка выше. Если всё копирую на c:\
и оттуда запускаю - всё ок. osal_check_fs_local()
добавить проверку этого случая (замапленый в винду диск linux) и возвращать ошибку при открытии БД.osal_check_fs_local()
, посмотреть какие есть системные функции и что они возвращают.0.14.x
, т.е. оставлю в минимальных требованиях 7-ку или даже 10-ку.
67 files changed, 3514 insertions(+), 3004 deletions(-)
master
и в текущем понимании не приводят к заметному снижению производительность.0.13.3
, всё отлично. Отдельное спасибо за "Если посредством mdbx_env_set_option(MDBX_opt_txn_dp_limit) пользователем не задано собственно значение, то выполняется подстройка dirty-pages-limit" - огонь опция. Для end-user GUI приложений, самое то!