mdbx: исправление затенения курсоров во вложенных транзакциях (backport).

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-03-20 01:46:13 +03:00
parent 6c036add8b
commit c457804fad
2 changed files with 12 additions and 7 deletions

View File

@ -690,11 +690,9 @@ MDBX_txn *mdbx_cursor_txn(const MDBX_cursor *mc) {
if (unlikely(!mc || mc->signature != cur_signature_live)) if (unlikely(!mc || mc->signature != cur_signature_live))
return nullptr; return nullptr;
MDBX_txn *txn = mc->txn; MDBX_txn *txn = mc->txn;
if (unlikely(!txn || txn->signature != txn_signature)) if (unlikely(!txn || txn->signature != txn_signature || (txn->flags & MDBX_TXN_FINISHED)))
return nullptr; return nullptr;
if (unlikely(txn->flags & MDBX_TXN_FINISHED)) return (txn->flags & MDBX_TXN_HAS_CHILD) ? txn->env->txn : txn;
return nullptr;
return txn;
} }
MDBX_dbi mdbx_cursor_dbi(const MDBX_cursor *mc) { MDBX_dbi mdbx_cursor_dbi(const MDBX_cursor *mc) {

View File

@ -2347,14 +2347,21 @@ int cursor_check(const MDBX_cursor *mc, int txn_bad_bits) {
(char *)mc - stack_top < (ptrdiff_t)globals.sys_pagesize * 4)); (char *)mc - stack_top < (ptrdiff_t)globals.sys_pagesize * 4));
if (txn_bad_bits) { if (txn_bad_bits) {
int rc = check_txn(mc->txn, txn_bad_bits); int rc = check_txn(mc->txn, txn_bad_bits & ~MDBX_TXN_HAS_CHILD);
if (unlikely(rc != MDBX_SUCCESS)) { if (unlikely(rc != MDBX_SUCCESS)) {
cASSERT(mc, rc != MDBX_RESULT_TRUE); cASSERT(mc, rc != MDBX_RESULT_TRUE);
return rc; return rc;
} }
if (unlikely(cursor_dbi_changed(mc))) if (likely((mc->txn->flags & MDBX_TXN_HAS_CHILD) == 0))
return MDBX_BAD_DBI; return likely(!cursor_dbi_changed(mc)) ? MDBX_SUCCESS : MDBX_BAD_DBI;
cASSERT(mc, (mc->txn->flags & MDBX_TXN_RDONLY) == 0 && mc->txn != mc->txn->env->txn && mc->txn->env->txn);
rc = dbi_check(mc->txn->env->txn, cursor_dbi(mc));
if (unlikely(rc != MDBX_SUCCESS))
return rc;
cASSERT(mc, (mc->txn->flags & MDBX_TXN_RDONLY) == 0 && mc->txn == mc->txn->env->txn);
} }
return MDBX_SUCCESS; return MDBX_SUCCESS;