mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-01 02:32:57 +08:00
mdbx: исправление затенения курсоров во вложенных транзакциях.
This commit is contained in:
parent
aeac971f0b
commit
dcf35e5306
@ -691,11 +691,9 @@ MDBX_txn *mdbx_cursor_txn(const MDBX_cursor *mc) {
|
||||
if (unlikely(!mc || mc->signature != cur_signature_live))
|
||||
return nullptr;
|
||||
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;
|
||||
if (unlikely(txn->flags & MDBX_TXN_FINISHED))
|
||||
return nullptr;
|
||||
return txn;
|
||||
return (txn->flags & MDBX_TXN_HAS_CHILD) ? txn->env->txn : txn;
|
||||
}
|
||||
|
||||
MDBX_dbi mdbx_cursor_dbi(const MDBX_cursor *mc) {
|
||||
|
13
src/cursor.c
13
src/cursor.c
@ -2349,14 +2349,21 @@ int cursor_check(const MDBX_cursor *mc, int txn_bad_bits) {
|
||||
(char *)mc - stack_top < (ptrdiff_t)globals.sys_pagesize * 4));
|
||||
|
||||
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)) {
|
||||
cASSERT(mc, rc != MDBX_RESULT_TRUE);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (unlikely(cursor_dbi_changed(mc)))
|
||||
return MDBX_BAD_DBI;
|
||||
if (likely((mc->txn->flags & MDBX_TXN_HAS_CHILD) == 0))
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user