libmdbx (2021-01-29 ... 2021-06-08)
Send
, то бишь все структуры внутри неё можно двигать между потоками), или запустить прибитой к треду от начала и до конца (но можно даже если `!Send`). Динамически прикрепить и открепить нельзя, потому что это риск UB из безопасного кода.libgcc_s.so
may contain long division functions, support for C11 atomics, etc...libgcc_s.so
.
mdbx_env_set_maxreaders
. Не знаю проблема это или нет.
devel
на github завершен ряд доработок, см. https://github.com/erthink/libmdbx/blob/devel/ChangeLog.md./test/long_stochastic.sh
находясь в корне git repo.git
is necessary to avoid human error when generating version information.mdbx_dbi_stat
(FREE_DBI
)?
space_dirty
, space_retire
d) сразу перед коммитом.
mdbx_chk
и/или mdbx_stat
;mdbx_stat -r
.
retained
нули, то значит читатели не мешают переработки мусора.
mdbx_env_set_hsr()
, см https://erthink.github.io/libmdbx/group__c__err.html#gaedc09dd7e0634163be8aafdf00d7db77.MDBX_COALESCE
в вашем случае особо не влияет, поскольку при поиске места движок будет читать и объединять записи из GC пока не найдет последовательности достаточной длинны, т.е. MDBX_COALESCE
как-бы включается вынужденно.
MDBX_opt_rp_augment_limit
, см https://erthink.github.io/libmdbx/group__c__api.html#gga671855605968c3b1f89a72e2d7b71eb3a9fe64bcad43752eac6596cbb49a2be2d.
/dev/shm/
.MDBX_MAP_FULL = -30792
с хвостом в консоли:db_value.iov_len = 15149103
, т.е. (15149103 + 4096 - 1) / 4096 = 3699
страниц../mdbx_chk -cvvvv /dev/shm/
, среди прочего вижу:mdbx_env_set_geometry(env, -1, 0, cache_size * 2, -1, 0, 65536)
вместо mdbx_env_set_mapsize()
.MDBX_APPEND
.
MDBX_NODUPDATA
) - to drop sub-db - how it works now? (I don't understand from source code).dupsort
sub-tree for the key - this is done by current API.
abc_*
, хочу выбрать все ключи со значениями, по этой бинарной маске?
MDBX_APPEND
и MDBX_APPENDDUP
.mdbx_copy -c
или mdbx_env_copy()
), а также сделав дамп-восстановление утилитами mdbx_dump
+ mdbx_load
).
MDBX_ENABLE_REFUND=0
, по крайней мере в production.mdb_stat -aef
и mdbx_stat -aef
./usr/bin/time -v
(лучше не путать с time встроенной в bash).madvise()
, сейчас я добавлю соответствующую опцию сборки.getrusage()
(за вычетом не поддерживаемых на Linux, см. man getrusage
), а также основные параметры "геометрии БД": backed, allocated, used, gc (mdbx_stat -ef
) и соответствующие им для LMDB (mdb_stat -ef
, но там меньше информации и я не помню подробностей).MDBX_RDONLY
?
-a
).txSenders
.MADVISE
mdbx_cursor_bind()
.
iovec
through mdbx_get
also should not be used after dbi drop?
mdbx_is_dirty()
= https://erthink.github.io/libmdbx/group__c__statinfo.html#ga32a2b4d341edf438c7d050fb911bfce9
mdbx_get
, then run mdbx_del
for the same key? will an iovec remain valid?
Env
^
|
Txn
^
|
Database <-------\
^ |
| |
Cursor Values (&[u8])
struct data_preserver
внутри template<> class buffer
в https://github.com/erthink/libmdbx/blob/master/mdbx.h%2B%2B#L828 mdbx_is_dirty()
внутри libfpta, например https://github.com/erthink/libfpta/blob/master/src/data.cxx#L690-L694
Database::get
отдаёт слайс байтов, который "захватывает" ссылку на экземпляр Database
Database::del
нужно взять эксклюзивную ссылку на Database
- это невозможно пока живы любые ссылки на этот же экземпляр
Database::
del/put
, который захватит только dbi, или мне нужно делать Transaction::
del/put
и блокировать всю write-транзакцию
@MAIN
(pre-defined DBI == 1) и прочитать эту запись;@MAIN
, что может вызвать изменение страницы с данными добавленными и прочитанными на первом шаге.
world
может "поломаться".
@MAIN
(установка актуальных ссылок на nested b+tree для subDB) происходит только при коммите транзакции.
Database
(`mdbx_dbi_open`) и сделать get/put/del в произвольном порядкеget
проверять is_dirty, и если да - копировать данные
close
вместо drop
.
MDBX_RESERVE
, в нём будут случайные данные?
mdbx_cursor_get
вернул ENODATA, хотя в доке этой ошибки нет
struct MyTxnChart
либо не возможно, либо только в виде struct MyTxnChart { array[10000]: Database }
.
mdbx_env_info_ex
on an env that was created successfully immediately before by using mdbx_env_create
crashes the program?
5118 MDBX_meta *head = mdbx_meta_recent(mode, env, m0, m1);
operate_parameters
contains more options that could defined by flags.
mdbx_env_create()
create just a "handle" without binding to the some DB.mdbx_env_info()
.-g
option should be used, and symbols will be inside an executables by default.
O_APPEND
flag.MDBX_EXCLUSIVE
). При этом с БД сможет работать только один процесс с любым кол-вом тредов внутри. mdbx_dbi_stat()
, https://erthink.github.io/libmdbx/group__c__statinfo.html#ga7582460beceb078cec8b515a5280d568.dupsort
feature is when building (secondary or non-clustered) indexes for low-cardinality data.DUPFIXED
will save a few bytes per item, since length of data is fixed and will not be stored internally.
mdbx_cursor_count()
and mdbx_get_ex()
may be useful, since return number of duplicates/multivalues.
mdbx_env_pgwalk
is some low-level primitive - but it's not enough for replication.
MDBX_WRITEMAP
flag - then "writes" are actually "reads+copy in RAM" - so totally same rules of page size, page eviction, ...
What’s wrong with mdbx_env_set_syncperiod
method?
mdbx_cursor_get
ops set data
? which of those set not just data
, but key
as well?
MDBX_GET_BOTH
key и data являются входными аргументами.MDBX_GET_CURRENT
и операции из второго пункта для которых прописан возврат результатов в key и/или data.SafeNoSync
is 250 times slower than Durable (on big amount of small write transactions, on macbook). So, i don't know.
MDBX_LIFORECLAIM
option.MDBX_LIFORECLAIM
.mdbx_env_set_syncperiod
- this option must be used with MDBX_SAFE_NOSYNC only or with MDBX_NOMETASYNC
+MDBX_SAFE_NOSYNC?
MDBX_LOCKING
не смогут работать с одной БД одновременно, а только по-очередно.
mdbx_copy
will make a consistently copy of the MVCC snapshot.mdbx_env_set_syncperiod
does. "Doesn't write to disk at tx.Commit, but write to disk periodically".strace
tool).DUPSORT - stands for Sorted Duplicates
root, err := tx.OpenDBI(0)
if err != nil {
return nil, err
}
c, err :=
tx.OpenCursor(root)
if err != nil {
return nil, err
}
for k, _, _ := c.Get(nil, nil, mdbx.First); k != nil; k, _, _ = c.Get(nil, nil, mdbx.Next) {
tableNames = append(tableNames, string(k))
}
return tableNames, nil
mmap()
the entire DB into the RAM.DB_SIZE / 2 / ITEM_SIZE
and DB_SIZE / 4 / ITEM_SIZE
.
libmdbx
, since (theoretically) this sanctions do not apply to individuals, and I personally (yet) do not enter any sanctions lists.devel
branch.devel
branch for now) in own use cases.
mdb.master3
).devel
branch and will be ready soon.MDBX_WRITEMAP
mode;master
) для более плотного заполнения страниц, показывают улучшение в большинстве сценариев использования. Как минимум пока где-либо не видно ухудшения. Но для ledgerwatch/turbo-geth они не дали эффекта:MDBX_APPEND
и/или MDBX_APPEND_DUP
режимах.MADV_RANDOM
is enabled for the entire DB and this was enough to fix "the trouble".
MDBX_WRITEMAP
is very-very-much useful for TG usecase (1Tb DB, large transactions,16 Gb RAM).devel
branch, but for now you need to manually increase the MDBX_opt_txn_dp_limit
to the DB size.devel
branch) a dirty page(s) will ousted to DB file by the OS kernel with LRU policy, without requiring any further actions until a such page(s) would be read or changes/altered again.
make dist
).
mdbx_copy
utility and the mdbx_env_copy()
, mdbx_env_copy2fd()
function(s).devel
branch.mdbx_copy
utility, the mdb_new_copy()
and mdx_copy2fd()
functions.
mdbx.h
completely once.
mdbx_new_stat()
and `mdbx_new_info()
values, including pgop_stat
, which will reflect the changes made.proc_start.split
and other stats.pgop_stat.merge
and other stats.geo.shrink_threshold
.
mdbx_env_stat_ex()
and struct MDBX_stat
.mdbx_dbi_stat()
, mdbx_env_stat_ex()
, mdbx_env_info_ex()
.mdbx_env_stat_ex
returns stats of Main DBI instead of stats of whole db. and lmdb does the same. make V=1
for verbose.make options
to listing available build options.make help
to listing available targets.MDBX_opt_txn_dp_limit
2 times. And see if it helped or not.
mdbx_chk -V
./usr/bin/time
util and show it's output.
LDFLAGS
need use on Win to link with mdbx?
LDFLAGS
but just add mdbx
(or mdbx-static
) to you exe/lib CMake's targets.LDFLAGS
which depends from toolchain you are using.
__MAC_OS_X_VERSION_MAIN_REQUIRED
in the C++ library for iOS, support for ::std::filesystem::path
is implemented ?
fprintf()
this value for an app built for iOS 13.
_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH
# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \
_Pragma("clang attribute push(__attribute__((availability(macosx,strict,introduced=10.15))), apply_to=any(function,record))") \
_Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \
_Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \
_Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))")
__IPHONE_OS_VERSION_MIN_REQUIRED
130100
__MAC_OS_X_VERSION_MIN_REQUIRED
is undefined
#if defined(DOXYGEN) || \
(defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L && \
((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500) || \
(defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 130100)))
__TVOS_VERSION_MIN_REQUIRED
and __WATCHOS_VERSION_MIN_REQUIRED
?
acquire-lock
read-write copy DB
mv new old
release-lock
mdbx_env_copy()
and mdbx_env_copy2fd()
are allows to copy the database with compactification/defragmentatioin.
mdbx_cursor_open
на одном MDBX_txn
из нескольких потоков одновременно?
make test
ломается если задать =5 через MDBX_OPTIONS
?
make check
, а уже потом остальное.dispatch_semaphore_t
- это внутри-процессный семафор, т.е. для синхронизации потоков внутри _одного_ процесса.sem_t
не годятся.
MDBX_env
, которая позволит понять нужно ли делать спецпоток или нетMDBX_TXN_CHECKOWNER
?
MDBX_TXN_CHECKOWNER
- это опция сборки, а флажок будет делать тоже самое (отключать контроль), но не везде (get/put будет без контроля, а commit/abort с контролем).
1950
bytes - will mdbx able place 2 such records on 1 page?