From a600c2a7a23021a4bc1d065773a1468ea63f4ef3 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: Wed, 25 Jun 2025 12:27:39 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D1=83=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D0=BE=D1=8F=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B8=20`MDBX=5FENODATA`=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B5=20=D0=B2=20GC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gc-get.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gc-get.c b/src/gc-get.c index 8ae8d1dd..1760590b 100644 --- a/src/gc-get.c +++ b/src/gc-get.c @@ -1086,6 +1086,7 @@ next_gc: } eASSERT(env, pnl_check_allocated(txn->wr.repnl, txn->geo.first_unallocated - MDBX_ENABLE_REFUND)); + eASSERT(env, op == MDBX_PREV || op == MDBX_NEXT); rkl_t *rkl = &txn->wr.gc.reclaimed; const char *rkl_name = "reclaimed"; if (mc->dbi_state != txn->dbi_state && @@ -1095,6 +1096,11 @@ next_gc: ret.err = cursor_del(gc, 0); txn->cursors[FREE_DBI] = gc->next; if (likely(ret.err == MDBX_SUCCESS)) { + if (unlikely(txn->dbs[FREE_DBI].items == 0)) { + flags &= ~ALLOC_COALESCE; + txn->flags |= txn_gc_drained; + op = MDBX_FIRST; /* для предотвращения ошибок из-за относительного перемещения курсора */ + } rkl = &txn->wr.gc.ready4reuse; rkl_name = "ready4reuse"; } else { @@ -1109,8 +1115,8 @@ next_gc: if (unlikely(ret.err != MDBX_SUCCESS)) goto fail; - eASSERT(env, op == MDBX_PREV || op == MDBX_NEXT); if (flags & ALLOC_COALESCE) { + eASSERT(env, op == MDBX_PREV || op == MDBX_NEXT); if (pnl_size(txn->wr.repnl) < env->maxgc_large1page / 2) { TRACE("%s: last id #%" PRIaTXN ", re-len %zu", "coalesce-continue", id, pnl_size(txn->wr.repnl)); goto next_gc;