From fa0cd4d8b37dd82b08d06055d2040df6f06a181d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Thu, 19 Jun 2025 21:46:37 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B4=D0=BE=D0=BF=D1=83=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D1=85=D0=B2=D0=B0=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D1=80=D0=B0=D0=BD=D0=BD=D0=B5=D0=B9/=D0=BD?= =?UTF-8?q?=D0=B5-=D0=BE=D1=82=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B5=20GC=20(?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gc-get.c | 13 +++++++++---- src/page-ops.c | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gc-get.c b/src/gc-get.c index 27c47174..4d52a907 100644 --- a/src/gc-get.c +++ b/src/gc-get.c @@ -1096,10 +1096,15 @@ next_gc: txn->cursors[FREE_DBI] = gc; ret.err = cursor_del(gc, 0); txn->cursors[FREE_DBI] = gc->next; - if (unlikely(ret.err != MDBX_SUCCESS)) - goto fail; - rkl = &txn->wr.gc.ready4reuse; - rkl_name = "ready4reuse"; + if (likely(ret.err == MDBX_SUCCESS)) { + rkl = &txn->wr.gc.ready4reuse; + rkl_name = "ready4reuse"; + } else { + VERBOSE("gc-early-clean: err %d, repnl %zu, gc-height %u (%u branch, %u leafs)", ret.err, + MDBX_PNL_GETSIZE(txn->wr.repnl), gc->tree->height, gc->tree->branch_pages, gc->tree->leaf_pages); + if (unlikely(txn->flags & MDBX_TXN_ERROR)) + goto fail; + } } ret.err = rkl_push(rkl, id); TRACE("%" PRIaTXN " len %zu pushed to rkl-%s, err %d", id, gc_len, rkl_name, ret.err); diff --git a/src/page-ops.c b/src/page-ops.c index 3aa869ec..81cba636 100644 --- a/src/page-ops.c +++ b/src/page-ops.c @@ -182,8 +182,11 @@ __hot int page_touch_unmodifable(MDBX_txn *txn, MDBX_cursor *mc, const page_t *c const pgr_t par = gc_alloc_single(mc); rc = par.err; np = par.page; - if (unlikely(rc != MDBX_SUCCESS)) - goto fail; + if (unlikely(rc != MDBX_SUCCESS)) { + if (likely(mc->dbi_state != txn->dbi_state) || (rc != MDBX_MAP_FULL && rc != MDBX_BACKLOG_DEPLETED)) + goto fail; + return rc; + } rc = pnl_append(&txn->wr.retired_pages, mp->pgno); if (unlikely(rc != MDBX_SUCCESS))