mirror of
https://github.com/isar/libmdbx.git
synced 2024-12-29 09:18:50 +08:00
mdbx: освобождение памяти сброшенных/прерванных читающих транзакций передаваемых в mdbx_txn_commit()
.
Исторически в API была слабость/неоднозначность в жизненном цикле читающих транзакций: - В простейших сценариях читающие транзакции запускались посредством mdbx_txn_begin() и завершались посредством mdbx_txn_abort(), либо mdbx_txn_commit(); - Для экономии накладных расходов были предусмотрены функции mdbx_txn_reset() и mdbx_txn_renew(), которые сбрасывали/прерывали читающую транзакцию без её освобождения/разрушения и затем перезапускали её. При этом транзакции сброшенные посредством mdbx_txn_reset() должны были быть либо перезапущены, либо освобождены посредством mdbx_txn_abort(); - Заминка возникала при вызове mdbx_txn_commit() для читающих транзакций сброшенных/прерванных посредством mdbx_txn_reset(). В таких ситуациях возвращалась ошибка MDBX_BAD_TXN, а транзакция не освобождалась. Такое поведение вносило лишнюю асимметрию в API и способствовало появлению ошибок утечки ресурсов, но поддерживалось для совместимости. Этот коммит изменяет историческое поведение с нарушением совместимости, но делает API более регулярным и уменьшает вероятность ошибок утечки ресурсов. Теперь mdbx_txn_commit() освобождает/разрушает читающие транзакции сброшенные/прерванные посредством mdbx_txn_reset() возвращая при этом MDBX_RESULT_TRUE вместо MDBX_SUCCESS, по аналогии обработки фиксации аварийных пишущих транзакций.
This commit is contained in:
parent
efaa46d7cd
commit
ddea36c54a
14
src/txn.c
14
src/txn.c
@ -460,20 +460,22 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) {
|
|||||||
|
|
||||||
int rc = check_txn(txn, MDBX_TXN_FINISHED);
|
int rc = check_txn(txn, MDBX_TXN_FINISHED);
|
||||||
if (unlikely(rc != MDBX_SUCCESS)) {
|
if (unlikely(rc != MDBX_SUCCESS)) {
|
||||||
|
if (rc == MDBX_BAD_TXN && (txn->flags & MDBX_TXN_RDONLY)) {
|
||||||
|
rc = MDBX_RESULT_TRUE;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
bailout:
|
||||||
if (latency)
|
if (latency)
|
||||||
memset(latency, 0, sizeof(*latency));
|
memset(latency, 0, sizeof(*latency));
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDBX_env *const env = txn->env;
|
MDBX_env *const env = txn->env;
|
||||||
#if MDBX_ENV_CHECKPID
|
if (MDBX_ENV_CHECKPID && unlikely(env->pid != osal_getpid())) {
|
||||||
if (unlikely(env->pid != osal_getpid())) {
|
|
||||||
env->flags |= ENV_FATAL_ERROR;
|
env->flags |= ENV_FATAL_ERROR;
|
||||||
if (latency)
|
rc = MDBX_PANIC;
|
||||||
memset(latency, 0, sizeof(*latency));
|
goto bailout;
|
||||||
return MDBX_PANIC;
|
|
||||||
}
|
}
|
||||||
#endif /* MDBX_ENV_CHECKPID */
|
|
||||||
|
|
||||||
if (unlikely(txn->flags & MDBX_TXN_ERROR)) {
|
if (unlikely(txn->flags & MDBX_TXN_ERROR)) {
|
||||||
rc = MDBX_RESULT_TRUE;
|
rc = MDBX_RESULT_TRUE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user