mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-22 15:49:34 -05:00
ITS#7961,#7987 Re-fix txn init.
More fallout from 4d02c741b1:
Don't modify another thread's write txn. Reinit me_txn0 fully.
This commit is contained in:
parent
3ce002fd13
commit
17bf75b12e
1 changed files with 9 additions and 8 deletions
|
|
@ -2542,6 +2542,10 @@ mdb_txn_renew0(MDB_txn *txn)
|
||||||
if (txn->mt_txnid == mdb_debug_start)
|
if (txn->mt_txnid == mdb_debug_start)
|
||||||
mdb_debug = 1;
|
mdb_debug = 1;
|
||||||
#endif
|
#endif
|
||||||
|
txn->mt_flags = 0;
|
||||||
|
txn->mt_child = NULL;
|
||||||
|
txn->mt_loose_pgs = NULL;
|
||||||
|
txn->mt_loose_count = 0;
|
||||||
txn->mt_dirty_room = MDB_IDL_UM_MAX;
|
txn->mt_dirty_room = MDB_IDL_UM_MAX;
|
||||||
txn->mt_u.dirty_list = env->me_dirty_list;
|
txn->mt_u.dirty_list = env->me_dirty_list;
|
||||||
txn->mt_u.dirty_list[0].mid = 0;
|
txn->mt_u.dirty_list[0].mid = 0;
|
||||||
|
|
@ -2627,7 +2631,6 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
|
||||||
if (!(flags & MDB_RDONLY)) {
|
if (!(flags & MDB_RDONLY)) {
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
txn = env->me_txn0; /* just reuse preallocated write txn */
|
txn = env->me_txn0; /* just reuse preallocated write txn */
|
||||||
txn->mt_flags = 0;
|
|
||||||
goto ok;
|
goto ok;
|
||||||
}
|
}
|
||||||
/* child txns use own copy of cursors */
|
/* child txns use own copy of cursors */
|
||||||
|
|
@ -2778,6 +2781,8 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
|
||||||
env->me_pghead = NULL;
|
env->me_pghead = NULL;
|
||||||
env->me_pglast = 0;
|
env->me_pglast = 0;
|
||||||
|
|
||||||
|
mdb_cursors_close(txn, 0);
|
||||||
|
|
||||||
if (!(env->me_flags & MDB_WRITEMAP)) {
|
if (!(env->me_flags & MDB_WRITEMAP)) {
|
||||||
mdb_dlist_free(txn);
|
mdb_dlist_free(txn);
|
||||||
}
|
}
|
||||||
|
|
@ -2790,19 +2795,15 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
|
||||||
/* The writer mutex was locked in mdb_txn_begin. */
|
/* The writer mutex was locked in mdb_txn_begin. */
|
||||||
if (env->me_txns)
|
if (env->me_txns)
|
||||||
UNLOCK_MUTEX_W(env);
|
UNLOCK_MUTEX_W(env);
|
||||||
}
|
} else {
|
||||||
|
|
||||||
mdb_cursors_close(txn, 0);
|
|
||||||
|
|
||||||
mdb_midl_free(pghead);
|
|
||||||
|
|
||||||
if (txn->mt_parent) {
|
|
||||||
txn->mt_parent->mt_child = NULL;
|
txn->mt_parent->mt_child = NULL;
|
||||||
env->me_pgstate = ((MDB_ntxn *)txn)->mnt_pgstate;
|
env->me_pgstate = ((MDB_ntxn *)txn)->mnt_pgstate;
|
||||||
mdb_midl_free(txn->mt_free_pgs);
|
mdb_midl_free(txn->mt_free_pgs);
|
||||||
mdb_midl_free(txn->mt_spill_pgs);
|
mdb_midl_free(txn->mt_spill_pgs);
|
||||||
free(txn->mt_u.dirty_list);
|
free(txn->mt_u.dirty_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mdb_midl_free(pghead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue