mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-01 14:52:57 +08:00
mdbx: устранение регресса при использовании курсоров для DBI=0 в читающих транзакциях.
В результате рефакторинга и ряда оптимизаций для завершения/гашения курсоров в читающих и пишущих транзакций стал использоваться общий код. Причем за основу, был взят соответствующий фрагмент относящийся к пишущим транзакциям, в которых пользователю не позволяется использоваться курсоры для DBI=0 и поэтому эта итераций пропускалась. В результате, при завершении читающих транзакциях, курсоры связанные с DBI=0 не завершались должным образом, а при их повторном использовании или явном закрытии после завершения читающей транзакции происходило обращение к уже освобожденной памяти. Если же такие курсоры отсоединялись или закрывались до завершения читающей транзакции, то ошибка не имела шансов на проявление. Спасибо Илье Михееву (https://github.com/JkLondon) и команде Erigon (https://erigon.tech) за сообщения о проблеме.
This commit is contained in:
parent
4e33bad6e7
commit
021d83b841
@ -9,9 +9,8 @@ __hot txnid_t txn_snapshot_oldest(const MDBX_txn *const txn) {
|
|||||||
|
|
||||||
void txn_done_cursors(MDBX_txn *txn) {
|
void txn_done_cursors(MDBX_txn *txn) {
|
||||||
tASSERT(txn, txn->flags & txn_may_have_cursors);
|
tASSERT(txn, txn->flags & txn_may_have_cursors);
|
||||||
tASSERT(txn, txn->cursors[FREE_DBI] == nullptr);
|
|
||||||
|
|
||||||
TXN_FOREACH_DBI_FROM(txn, i, /* skip FREE_DBI */ 1) {
|
TXN_FOREACH_DBI_ALL(txn, i) {
|
||||||
MDBX_cursor *cursor = txn->cursors[i];
|
MDBX_cursor *cursor = txn->cursors[i];
|
||||||
if (cursor) {
|
if (cursor) {
|
||||||
txn->cursors[i] = nullptr;
|
txn->cursors[i] = nullptr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user