From cd27aa017f84efcf8d4e1f092e15f7329d98ad1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Sun, 7 Sep 2025 00:04:01 +0300 Subject: [PATCH] mdbx: add internal `txn_basis_snapshot()`. --- src/api-txn-data.c | 2 +- src/cogs.h | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/api-txn-data.c b/src/api-txn-data.c index d5efe74a..a46a8d81 100644 --- a/src/api-txn-data.c +++ b/src/api-txn-data.c @@ -191,7 +191,7 @@ int mdbx_is_dirty(const MDBX_txn *txn, const void *ptr) { * not to the beginning of a data. */ return LOG_IFERR(MDBX_EINVAL); } - return ((txn->flags & MDBX_TXN_RDONLY) || !is_modifable(txn, page)) ? MDBX_RESULT_FALSE : MDBX_RESULT_TRUE; + return (page->txnid > txn_basis_snapshot(txn)) ? MDBX_RESULT_TRUE : MDBX_RESULT_FALSE; } if ((size_t)offset < env->dxb_mmap.limit) { /* Указатель адресует что-то в пределах mmap, но за границей diff --git a/src/cogs.h b/src/cogs.h index 2565afce..bd8c98f5 100644 --- a/src/cogs.h +++ b/src/cogs.h @@ -503,6 +503,14 @@ static inline int check_txn_rw(const MDBX_txn *txn, int bad_bits) { return check_txn(txn, (bad_bits | MDBX_TXN_RDONLY) & ~MDBX_TXN_PARKED); } +MDBX_NOTHROW_CONST_FUNCTION static inline txnid_t txn_basis_snapshot(const MDBX_txn *txn) { + STATIC_ASSERT((MDBX_TXN_RDONLY >> 17) == 1); + STATIC_ASSERT((xMDBX_TXNID_STEP >> (xMDBX_TXNID_STEP == 2)) == 1); + const txnid_t committed_txnid = txn->txnid + (xMDBX_TXNID_STEP >> (xMDBX_TXNID_STEP == 2)) - ((txn->flags >> 17) & 1); + tASSERT(txn, committed_txnid == ((txn->flags & MDBX_TXN_RDONLY) ? txn->txnid : txn->txnid - xMDBX_TXNID_STEP)); + return committed_txnid; +} + /*----------------------------------------------------------------------------*/ MDBX_INTERNAL void mincore_clean_cache(const MDBX_env *const env);