Skip to content

Commit 5fb620c

Browse files
committed
mdbx: add max_reader_lag and max_retained_pages to GC-profiling information.
2026-01-27 mdbx: add `max_reader_lag` and `max_retained_pages` to GC-profiling information. 2026-01-26 mdbx: fix page-age histogram for `xMDBX_TXNID_STEP > 1`. 2026-01-25 mdbx: update ChangeLog.
1 parent 8333413 commit 5fb620c

File tree

11 files changed

+236
-157
lines changed

11 files changed

+236
-157
lines changed

ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ BTC `bc1qzvl9uegf2ea6cwlytnanrscyv8snwsvrc0xfsu`, SOL `FTCTgbHajoLVZGr8aEFWMzx3N
4141

4242
- добавлена функция `mdbx_txn_refresh()` для быстрого обновления читающей транзакции, и `mdbx_txn_checkpoint()` для фиксации пишущих транзакций без освобождения блокировок.
4343

44+
- добавлена поддержка вложенных транзакций только для чтения.
45+
4446
- Поддержка Harmony OS (OHOS).
4547

4648
- Операции с плавающей точкой больше не используются как внутри библиотеки, так и в утилитах, а из сценариев сборки удалено связывание c `libm`.

VERSION.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "git_describe": "v0.14.1-342-g630b73ee", "git_timestamp": "2026-01-25T01:41:08+03:00", "git_tree": "b089c2d8bc73633c3be446f12b6bffb9eba9f35a", "git_commit": "630b73eed683e2ede5c8620b23671afc772da335", "semver": "0.14.1.342" }
1+
{ "git_describe": "v0.14.1-345-g707f4dc6", "git_timestamp": "2026-01-27T00:53:52+03:00", "git_tree": "1185476dd3e1c3b39adae1c09109d7bac9854583", "git_commit": "707f4dc6ee8f66f8f42dd7e4ec7b3377ac6b0687", "semver": "0.14.1.345" }

mdbx.c

Lines changed: 146 additions & 119 deletions
Large diffs are not rendered by default.

mdbx.c++

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
33
/* clang-format off */
44

5-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
5+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
66

77
#define LIBMDBX_INTERNALS
88
#define MDBX_DEPRECATED
@@ -2566,7 +2566,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25662566
}
25672567

25682568
/* The version number for a database's lockfile format. */
2569-
#define MDBX_LOCK_VERSION 6
2569+
#define MDBX_LOCK_VERSION 7
25702570

25712571
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25722572

@@ -2646,8 +2646,7 @@ typedef struct pgops {
26462646
gc_prof_stat_t work;
26472647
/* Затраты на поддержку и обновления самой GC */
26482648
gc_prof_stat_t self;
2649-
/* Итераций обновления GC,
2650-
* больше 1 если были повторы/перезапуски */
2649+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26512650
uint32_t wloops;
26522651
/* Итерации слияния записей GC */
26532652
uint32_t coalescences;
@@ -2657,6 +2656,10 @@ typedef struct pgops {
26572656
uint32_t flushes;
26582657
/* Попытки пнуть тормозящих читателей */
26592658
uint32_t kicks;
2659+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2660+
uint32_t max_reader_lag;
2661+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2662+
uint32_t max_retained_pages;
26602663
} gc_prof;
26612664
} pgop_stat_t;
26622665

@@ -2792,7 +2795,10 @@ typedef struct shared_lck {
27922795
osal_ipclock_t wrt_lock;
27932796
#endif /* MDBX_LOCKING > 0 */
27942797

2795-
atomic_txnid_t cached_oldest;
2798+
struct {
2799+
atomic_txnid_t txnid;
2800+
mdbx_atomic_uint64_t retired;
2801+
} cached_oldest;
27962802

27972803
/* Timestamp of entering an out-of-sync state. Value is represented in a
27982804
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
@@ -3825,10 +3831,14 @@ MDBX_INTERNAL int audit_ex(MDBX_txn *txn, size_t retired_stored, bool dont_filte
38253831
/* mvcc-readers.c */
38263832
MDBX_INTERNAL bsr_t mvcc_bind_slot(MDBX_env *env);
38273833
MDBX_MAYBE_UNUSED MDBX_INTERNAL pgno_t mvcc_largest_this(MDBX_env *env, pgno_t largest);
3828-
MDBX_INTERNAL txnid_t mvcc_shapshot_oldest(MDBX_env *const env, const txnid_t steady);
38293834
MDBX_INTERNAL pgno_t mvcc_snapshot_largest(const MDBX_env *env, pgno_t last_used_page);
38303835
MDBX_INTERNAL int mvcc_cleanup_dead(MDBX_env *env, int rlocked, int *dead);
3831-
MDBX_INTERNAL bool mvcc_kick_laggards(MDBX_env *env, const txnid_t laggard);
3836+
MDBX_INTERNAL bool mvcc_kick_laggards(MDBX_txn *txn, const txnid_t laggard);
3837+
typedef struct oldest_readed_shapshot_into {
3838+
txnid_t oldest_txnid, steady_txnid;
3839+
} orsi_t;
3840+
3841+
MDBX_INTERNAL orsi_t mvcc_shapshot_oldest(const MDBX_txn *const txn);
38323842

38333843
/* dxb.c */
38343844
MDBX_INTERNAL int dxb_setup(MDBX_env *env, const int lck_rc, const mdbx_mode_t mode_bits);

mdbx.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4235,6 +4235,10 @@ struct MDBX_commit_latency {
42354235
uint64_t volume;
42364236
uint32_t calls;
42374237
} pnl_merge_work, pnl_merge_self;
4238+
/** \brief The maximum observed difference between the latest and oldest readed MVCC-snapshots. */
4239+
uint32_t max_reader_lag;
4240+
/** \brief The maximum noticed number of pages withheld from reclaimed due to reading old MVCC-snapshots. */
4241+
uint32_t max_retained_pages;
42384242
} gc_prof;
42394243
};
42404244
#ifndef __cplusplus

mdbx_chk.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// \copyright SPDX-License-Identifier: Apache-2.0
1919
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
2020

21-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
21+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
2222

2323
#define LIBMDBX_INTERNALS
2424
#define MDBX_DEPRECATED
@@ -2582,7 +2582,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25822582
}
25832583

25842584
/* The version number for a database's lockfile format. */
2585-
#define MDBX_LOCK_VERSION 6
2585+
#define MDBX_LOCK_VERSION 7
25862586

25872587
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25882588

@@ -2662,8 +2662,7 @@ typedef struct pgops {
26622662
gc_prof_stat_t work;
26632663
/* Затраты на поддержку и обновления самой GC */
26642664
gc_prof_stat_t self;
2665-
/* Итераций обновления GC,
2666-
* больше 1 если были повторы/перезапуски */
2665+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26672666
uint32_t wloops;
26682667
/* Итерации слияния записей GC */
26692668
uint32_t coalescences;
@@ -2673,6 +2672,10 @@ typedef struct pgops {
26732672
uint32_t flushes;
26742673
/* Попытки пнуть тормозящих читателей */
26752674
uint32_t kicks;
2675+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2676+
uint32_t max_reader_lag;
2677+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2678+
uint32_t max_retained_pages;
26762679
} gc_prof;
26772680
} pgop_stat_t;
26782681

@@ -2808,7 +2811,10 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
struct {
2815+
atomic_txnid_t txnid;
2816+
mdbx_atomic_uint64_t retired;
2817+
} cached_oldest;
28122818

28132819
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142820
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)

mdbx_copy.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// \copyright SPDX-License-Identifier: Apache-2.0
1919
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
2020

21-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
21+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
2222

2323
#define LIBMDBX_INTERNALS
2424
#define MDBX_DEPRECATED
@@ -2582,7 +2582,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25822582
}
25832583

25842584
/* The version number for a database's lockfile format. */
2585-
#define MDBX_LOCK_VERSION 6
2585+
#define MDBX_LOCK_VERSION 7
25862586

25872587
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25882588

@@ -2662,8 +2662,7 @@ typedef struct pgops {
26622662
gc_prof_stat_t work;
26632663
/* Затраты на поддержку и обновления самой GC */
26642664
gc_prof_stat_t self;
2665-
/* Итераций обновления GC,
2666-
* больше 1 если были повторы/перезапуски */
2665+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26672666
uint32_t wloops;
26682667
/* Итерации слияния записей GC */
26692668
uint32_t coalescences;
@@ -2673,6 +2672,10 @@ typedef struct pgops {
26732672
uint32_t flushes;
26742673
/* Попытки пнуть тормозящих читателей */
26752674
uint32_t kicks;
2675+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2676+
uint32_t max_reader_lag;
2677+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2678+
uint32_t max_retained_pages;
26762679
} gc_prof;
26772680
} pgop_stat_t;
26782681

@@ -2808,7 +2811,10 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
struct {
2815+
atomic_txnid_t txnid;
2816+
mdbx_atomic_uint64_t retired;
2817+
} cached_oldest;
28122818

28132819
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142820
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)

mdbx_drop.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// \copyright SPDX-License-Identifier: Apache-2.0
1919
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
2020

21-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
21+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
2222

2323
#define LIBMDBX_INTERNALS
2424
#define MDBX_DEPRECATED
@@ -2582,7 +2582,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25822582
}
25832583

25842584
/* The version number for a database's lockfile format. */
2585-
#define MDBX_LOCK_VERSION 6
2585+
#define MDBX_LOCK_VERSION 7
25862586

25872587
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25882588

@@ -2662,8 +2662,7 @@ typedef struct pgops {
26622662
gc_prof_stat_t work;
26632663
/* Затраты на поддержку и обновления самой GC */
26642664
gc_prof_stat_t self;
2665-
/* Итераций обновления GC,
2666-
* больше 1 если были повторы/перезапуски */
2665+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26672666
uint32_t wloops;
26682667
/* Итерации слияния записей GC */
26692668
uint32_t coalescences;
@@ -2673,6 +2672,10 @@ typedef struct pgops {
26732672
uint32_t flushes;
26742673
/* Попытки пнуть тормозящих читателей */
26752674
uint32_t kicks;
2675+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2676+
uint32_t max_reader_lag;
2677+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2678+
uint32_t max_retained_pages;
26762679
} gc_prof;
26772680
} pgop_stat_t;
26782681

@@ -2808,7 +2811,10 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
struct {
2815+
atomic_txnid_t txnid;
2816+
mdbx_atomic_uint64_t retired;
2817+
} cached_oldest;
28122818

28132819
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142820
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)

mdbx_dump.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// \copyright SPDX-License-Identifier: Apache-2.0
1919
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
2020

21-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
21+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
2222

2323
#define LIBMDBX_INTERNALS
2424
#define MDBX_DEPRECATED
@@ -2582,7 +2582,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25822582
}
25832583

25842584
/* The version number for a database's lockfile format. */
2585-
#define MDBX_LOCK_VERSION 6
2585+
#define MDBX_LOCK_VERSION 7
25862586

25872587
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25882588

@@ -2662,8 +2662,7 @@ typedef struct pgops {
26622662
gc_prof_stat_t work;
26632663
/* Затраты на поддержку и обновления самой GC */
26642664
gc_prof_stat_t self;
2665-
/* Итераций обновления GC,
2666-
* больше 1 если были повторы/перезапуски */
2665+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26672666
uint32_t wloops;
26682667
/* Итерации слияния записей GC */
26692668
uint32_t coalescences;
@@ -2673,6 +2672,10 @@ typedef struct pgops {
26732672
uint32_t flushes;
26742673
/* Попытки пнуть тормозящих читателей */
26752674
uint32_t kicks;
2675+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2676+
uint32_t max_reader_lag;
2677+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2678+
uint32_t max_retained_pages;
26762679
} gc_prof;
26772680
} pgop_stat_t;
26782681

@@ -2808,7 +2811,10 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
struct {
2815+
atomic_txnid_t txnid;
2816+
mdbx_atomic_uint64_t retired;
2817+
} cached_oldest;
28122818

28132819
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142820
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)

mdbx_load.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// \copyright SPDX-License-Identifier: Apache-2.0
1919
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2026
2020

21-
#define MDBX_BUILD_SOURCERY bceb4cffb452beb8b344b66517dbfcc12ae8e80220a05240377f9d076620e4d6_v0_14_1_342_g630b73ee
21+
#define MDBX_BUILD_SOURCERY 90442fbc8e7602d2b45d22420ca2e2ae53a109415daaa0d2d2e6447193175766_v0_14_1_345_g707f4dc6
2222

2323
#define LIBMDBX_INTERNALS
2424
#define MDBX_DEPRECATED
@@ -2582,7 +2582,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline bool is_subpage(const
25822582
}
25832583

25842584
/* The version number for a database's lockfile format. */
2585-
#define MDBX_LOCK_VERSION 6
2585+
#define MDBX_LOCK_VERSION 7
25862586

25872587
#if MDBX_LOCKING == MDBX_LOCKING_WIN32FILES
25882588

@@ -2662,8 +2662,7 @@ typedef struct pgops {
26622662
gc_prof_stat_t work;
26632663
/* Затраты на поддержку и обновления самой GC */
26642664
gc_prof_stat_t self;
2665-
/* Итераций обновления GC,
2666-
* больше 1 если были повторы/перезапуски */
2665+
/* Итераций обновления GC, больше 1 если были повторы/перезапуски */
26672666
uint32_t wloops;
26682667
/* Итерации слияния записей GC */
26692668
uint32_t coalescences;
@@ -2673,6 +2672,10 @@ typedef struct pgops {
26732672
uint32_t flushes;
26742673
/* Попытки пнуть тормозящих читателей */
26752674
uint32_t kicks;
2675+
/* Максимальная замеченная разница между последним и самым старым читаемым MVCC-снимками */
2676+
uint32_t max_reader_lag;
2677+
/* Максимальное замеченное количество страниц удерживаемых от переработки из-за чтения старых MVCC-снимков */
2678+
uint32_t max_retained_pages;
26762679
} gc_prof;
26772680
} pgop_stat_t;
26782681

@@ -2808,7 +2811,10 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
struct {
2815+
atomic_txnid_t txnid;
2816+
mdbx_atomic_uint64_t retired;
2817+
} cached_oldest;
28122818

28132819
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142820
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)

0 commit comments

Comments
 (0)