Skip to content

Commit efd599e

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 efd599e

File tree

11 files changed

+262
-183
lines changed

11 files changed

+262
-183
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-g29db3c1c", "git_timestamp": "2026-01-27T01:35:26+03:00", "git_tree": "8d3f1cc8a64638f929e0a74576db5ea8a7c8f720", "git_commit": "29db3c1cd639cbe42394f13681e08303a9c10f75", "semver": "0.14.1.345" }

mdbx.c

Lines changed: 150 additions & 123 deletions
Large diffs are not rendered by default.

mdbx.c++

Lines changed: 21 additions & 11 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 35d50f8f41a42bcd4706e4e134e18c3639c68e07baedf49e507e3d9102ae445e_v0_14_1_345_g29db3c1c
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,19 +2795,22 @@ typedef struct shared_lck {
27922795
osal_ipclock_t wrt_lock;
27932796
#endif /* MDBX_LOCKING > 0 */
27942797

2795-
atomic_txnid_t cached_oldest;
2798+
/* Number un-synced-with-disk pages for auto-sync feature. */
2799+
mdbx_atomic_uint64_t unsynced_pages;
27962800

27972801
/* Timestamp of entering an out-of-sync state. Value is represented in a
27982802
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
27992803
* or clock_gettime(CLOCK_MONOTONIC). */
28002804
mdbx_atomic_uint64_t eoos_timestamp;
28012805

2802-
/* Number un-synced-with-disk pages for auto-sync feature. */
2803-
mdbx_atomic_uint64_t unsynced_pages;
2804-
28052806
/* Timestamp of the last readers check. */
28062807
mdbx_atomic_uint64_t readers_check_timestamp;
28072808

2809+
struct {
2810+
atomic_txnid_t txnid;
2811+
mdbx_atomic_uint64_t retired;
2812+
} cached_oldest;
2813+
28082814
/* Number of page which was discarded last time by madvise(DONTNEED). */
28092815
atomic_pgno_t discarded_tail;
28102816

@@ -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);
@@ -4870,7 +4880,7 @@ MDBX_MAYBE_UNUSED static void static_checks(void) {
48704880
STATIC_ASSERT(offsetof(lck_t, wrt_lock) % MDBX_CACHELINE_SIZE == 0);
48714881
STATIC_ASSERT(offsetof(lck_t, rdt_lock) % MDBX_CACHELINE_SIZE == 0);
48724882
#else
4873-
STATIC_ASSERT(offsetof(lck_t, cached_oldest) % MDBX_CACHELINE_SIZE == 0);
4883+
STATIC_ASSERT(offsetof(lck_t, unsynced_pages) % MDBX_CACHELINE_SIZE == 0);
48744884
STATIC_ASSERT(offsetof(lck_t, rdt_length) % MDBX_CACHELINE_SIZE == 0);
48754885
#endif /* MDBX_LOCKING */
48764886
#if FLEXIBLE_ARRAY_MEMBERS

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: 14 additions & 8 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 35d50f8f41a42bcd4706e4e134e18c3639c68e07baedf49e507e3d9102ae445e_v0_14_1_345_g29db3c1c
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,19 +2811,22 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
/* Number un-synced-with-disk pages for auto-sync feature. */
2815+
mdbx_atomic_uint64_t unsynced_pages;
28122816

28132817
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142818
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
28152819
* or clock_gettime(CLOCK_MONOTONIC). */
28162820
mdbx_atomic_uint64_t eoos_timestamp;
28172821

2818-
/* Number un-synced-with-disk pages for auto-sync feature. */
2819-
mdbx_atomic_uint64_t unsynced_pages;
2820-
28212822
/* Timestamp of the last readers check. */
28222823
mdbx_atomic_uint64_t readers_check_timestamp;
28232824

2825+
struct {
2826+
atomic_txnid_t txnid;
2827+
mdbx_atomic_uint64_t retired;
2828+
} cached_oldest;
2829+
28242830
/* Number of page which was discarded last time by madvise(DONTNEED). */
28252831
atomic_pgno_t discarded_tail;
28262832

mdbx_copy.c

Lines changed: 14 additions & 8 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 35d50f8f41a42bcd4706e4e134e18c3639c68e07baedf49e507e3d9102ae445e_v0_14_1_345_g29db3c1c
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,19 +2811,22 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
/* Number un-synced-with-disk pages for auto-sync feature. */
2815+
mdbx_atomic_uint64_t unsynced_pages;
28122816

28132817
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142818
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
28152819
* or clock_gettime(CLOCK_MONOTONIC). */
28162820
mdbx_atomic_uint64_t eoos_timestamp;
28172821

2818-
/* Number un-synced-with-disk pages for auto-sync feature. */
2819-
mdbx_atomic_uint64_t unsynced_pages;
2820-
28212822
/* Timestamp of the last readers check. */
28222823
mdbx_atomic_uint64_t readers_check_timestamp;
28232824

2825+
struct {
2826+
atomic_txnid_t txnid;
2827+
mdbx_atomic_uint64_t retired;
2828+
} cached_oldest;
2829+
28242830
/* Number of page which was discarded last time by madvise(DONTNEED). */
28252831
atomic_pgno_t discarded_tail;
28262832

mdbx_drop.c

Lines changed: 14 additions & 8 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 35d50f8f41a42bcd4706e4e134e18c3639c68e07baedf49e507e3d9102ae445e_v0_14_1_345_g29db3c1c
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,19 +2811,22 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
/* Number un-synced-with-disk pages for auto-sync feature. */
2815+
mdbx_atomic_uint64_t unsynced_pages;
28122816

28132817
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142818
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
28152819
* or clock_gettime(CLOCK_MONOTONIC). */
28162820
mdbx_atomic_uint64_t eoos_timestamp;
28172821

2818-
/* Number un-synced-with-disk pages for auto-sync feature. */
2819-
mdbx_atomic_uint64_t unsynced_pages;
2820-
28212822
/* Timestamp of the last readers check. */
28222823
mdbx_atomic_uint64_t readers_check_timestamp;
28232824

2825+
struct {
2826+
atomic_txnid_t txnid;
2827+
mdbx_atomic_uint64_t retired;
2828+
} cached_oldest;
2829+
28242830
/* Number of page which was discarded last time by madvise(DONTNEED). */
28252831
atomic_pgno_t discarded_tail;
28262832

mdbx_dump.c

Lines changed: 14 additions & 8 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 35d50f8f41a42bcd4706e4e134e18c3639c68e07baedf49e507e3d9102ae445e_v0_14_1_345_g29db3c1c
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,19 +2811,22 @@ typedef struct shared_lck {
28082811
osal_ipclock_t wrt_lock;
28092812
#endif /* MDBX_LOCKING > 0 */
28102813

2811-
atomic_txnid_t cached_oldest;
2814+
/* Number un-synced-with-disk pages for auto-sync feature. */
2815+
mdbx_atomic_uint64_t unsynced_pages;
28122816

28132817
/* Timestamp of entering an out-of-sync state. Value is represented in a
28142818
* suitable system-dependent form, for example clock_gettime(CLOCK_BOOTTIME)
28152819
* or clock_gettime(CLOCK_MONOTONIC). */
28162820
mdbx_atomic_uint64_t eoos_timestamp;
28172821

2818-
/* Number un-synced-with-disk pages for auto-sync feature. */
2819-
mdbx_atomic_uint64_t unsynced_pages;
2820-
28212822
/* Timestamp of the last readers check. */
28222823
mdbx_atomic_uint64_t readers_check_timestamp;
28232824

2825+
struct {
2826+
atomic_txnid_t txnid;
2827+
mdbx_atomic_uint64_t retired;
2828+
} cached_oldest;
2829+
28242830
/* Number of page which was discarded last time by madvise(DONTNEED). */
28252831
atomic_pgno_t discarded_tail;
28262832

0 commit comments

Comments
 (0)