mirror of
https://github.com/isar/libmdbx.git
synced 2025-03-27 12:36:05 +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) {
|
||||
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];
|
||||
if (cursor) {
|
||||
txn->cursors[i] = nullptr;
|
||||
|
Loading…
x
Reference in New Issue
Block a user