diff --git a/src/gc-get.c b/src/gc-get.c index cfff49db..d03091f7 100644 --- a/src/gc-get.c +++ b/src/gc-get.c @@ -1047,14 +1047,15 @@ next_gc: } /* Remember ID of readed GC record */ - ret.err = rkl_push(&txn->wr.gc.reclaimed, id, - false /* Вместо false, тут можно передавать/использовать (flags & ALLOC_LIFO) == 0, тогда - * дыры/пропуски в идентификаторах GC будут образовывать непрерывные интервалы в wr.gc.reclaimed, - * что обеспечит больше свободных идентификаторов/слотов для возврата страниц. Однако, это - * также приведёт к пустым попыткам удаления отсутствующих записей в gc_clear_reclaimed(), - * а далее к перекладыванию этих сплошных интервалов поэлементно в ready4reuse. - * Поэтому смысла в этом решительно нет. Следует либо формировать сплошные интервалы при - * работе gc_clear_reclaimed(), особенно в FIFO-режиме, либо искать их только в gc_provide_ids() */); + ret.err = rkl_push( + &txn->wr.gc.reclaimed, id + /* Вместо known_continuous=false, тут можно передавать/использовать (flags & ALLOC_LIFO) == 0, тогда дыры/пропуски + * в идентификаторах GC будут образовывать непрерывные интервалы в wr.gc.reclaimed, что обеспечит больше свободных + * идентификаторов/слотов для возврата страниц. Однако, это также приведёт к пустым попыткам удаления + * отсутствующих записей в gc_clear_reclaimed(), а далее к перекладыванию этих сплошных интервалов поэлементно в + * ready4reuse. Поэтому смысла в этом решительно нет. Следует либо формировать сплошные интервалы при работе + * gc_clear_reclaimed(), особенно в FIFO-режиме, либо искать их только в gc_provide_ids() */ + ); TRACE("%" PRIaTXN " len %zu pushed to txn-rkl, err %d", id, gc_len, ret.err); if (unlikely(ret.err != MDBX_SUCCESS)) goto fail; diff --git a/src/gc-put.c b/src/gc-put.c index a6c3a1ed..fa141968 100644 --- a/src/gc-put.c +++ b/src/gc-put.c @@ -485,7 +485,7 @@ static int gc_remove_rkl(MDBX_txn *txn, gcu_t *ctx, rkl_t *rkl) { int err = cursor_seek(&ctx->cursor, &key, nullptr, MDBX_SET).err; tASSERT(txn, id == rkl_edge(rkl, is_lifo(txn))); if (err == MDBX_NOTFOUND) { - err = rkl_push(&ctx->ready4reuse, rkl_pop(rkl, is_lifo(txn)), false); + err = rkl_push(&ctx->ready4reuse, rkl_pop(rkl, is_lifo(txn))); WARNING("unexpected %s for gc-id %" PRIaTXN ", ignore and continue, push-err %d", "MDBX_NOTFOUND", id, err); if (unlikely(MDBX_IS_ERROR(err))) return err; @@ -506,7 +506,7 @@ static int gc_remove_rkl(MDBX_txn *txn, gcu_t *ctx, rkl_t *rkl) { return err; ENSURE(txn->env, id == rkl_pop(rkl, is_lifo(txn))); tASSERT(txn, id <= txn->env->lck->cached_oldest.weak); - err = rkl_push(&ctx->ready4reuse, id, false); + err = rkl_push(&ctx->ready4reuse, id); if (unlikely(err != MDBX_SUCCESS)) return err; TRACE("id %" PRIaTXN " cleared and moved to ready4reuse", id); @@ -528,7 +528,7 @@ static int gc_push_sequel(MDBX_txn *txn, gcu_t *ctx, txnid_t id) { tASSERT(txn, id > 0 && id < txn->env->gc.detent); tASSERT(txn, !rkl_contain(&txn->wr.gc.comeback, id) && !rkl_contain(&ctx->ready4reuse, id)); TRACE("id %" PRIaTXN ", return-left %zi", id, ctx->return_left); - int err = rkl_push(&ctx->sequel, id, false); + int err = rkl_push(&ctx->sequel, id); if (unlikely(err != MDBX_SUCCESS)) { if (err == MDBX_RESULT_TRUE) { ERROR("%s/%d: %s", "MDBX_PROBLEM", MDBX_PROBLEM, "unexpected duplicate(s) during rkl-push"); @@ -959,7 +959,7 @@ static inline int gc_reserve4return(MDBX_txn *txn, gcu_t *ctx, const size_t chun return MDBX_PROBLEM; } - int err = rkl_push(&txn->wr.gc.comeback, reservation_id, false); + int err = rkl_push(&txn->wr.gc.comeback, reservation_id); if (unlikely(err != MDBX_SUCCESS)) return err; diff --git a/src/rkl.c b/src/rkl.c index 09ef607a..1a0fd84b 100644 --- a/src/rkl.c +++ b/src/rkl.c @@ -218,9 +218,10 @@ static int extend_solid(rkl_t *rkl, txnid_t solid_begin, txnid_t solid_end, cons return MDBX_SUCCESS; } -int rkl_push(rkl_t *rkl, const txnid_t id, const bool known_continuous) { +int rkl_push(rkl_t *rkl, const txnid_t id) { assert(id >= MIN_TXNID && id < INVALID_TXNID); assert(rkl_check(rkl)); + const bool known_continuous = false; if (rkl->solid_begin >= rkl->solid_end) { /* непрерывный интервал пуст */ @@ -396,7 +397,7 @@ int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates) { if (src->list_length) { size_t i = src->list_length; do { - int err = rkl_push(dst, src->list[i - 1], false); + int err = rkl_push(dst, src->list[i - 1]); if (unlikely(err != MDBX_SUCCESS) && (!ignore_duplicates || err != MDBX_RESULT_TRUE)) return err; } while (--i); @@ -404,7 +405,7 @@ int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates) { txnid_t id = src->solid_begin; while (id < src->solid_end) { - int err = rkl_push(dst, id, false); + int err = rkl_push(dst, id); if (unlikely(err != MDBX_SUCCESS) && (!ignore_duplicates || err != MDBX_RESULT_TRUE)) return err; ++id; diff --git a/src/rkl.h b/src/rkl.h index efd6dd95..e982d8c8 100644 --- a/src/rkl.h +++ b/src/rkl.h @@ -48,8 +48,7 @@ MDBX_MAYBE_UNUSED MDBX_NOTHROW_PURE_FUNCTION static inline txnid_t rkl_edge(cons const bool highest_not_lowest) { return highest_not_lowest ? rkl_highest(rkl) : rkl_lowest(rkl); } -MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_push(rkl_t *rkl, const txnid_t id, - const bool known_continuous); +MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_push(rkl_t *rkl, const txnid_t id); MDBX_MAYBE_UNUSED MDBX_INTERNAL txnid_t rkl_pop(rkl_t *rkl, const bool highest_not_lowest); MDBX_MAYBE_UNUSED MDBX_INTERNAL __must_check_result int rkl_merge(rkl_t *dst, const rkl_t *src, bool ignore_duplicates); diff --git a/test/extra/details_rkl.c b/test/extra/details_rkl.c index a47f4280..ade9f6f7 100644 --- a/test/extra/details_rkl.c +++ b/test/extra/details_rkl.c @@ -86,12 +86,12 @@ void trivia(void) { CHECK_EQ(hole.begin, 1); CHECK_EQ(hole.end, MAX_TXNID); - CHECK_EQ((uint64_t)rkl_push(&x, 42, false), (uint64_t)MDBX_SUCCESS); + CHECK_EQ((uint64_t)rkl_push(&x, 42), (uint64_t)MDBX_SUCCESS); CHECK_TRUE(rkl_check(&x)); CHECK_FALSE(rkl_empty(&x)); CHECK_EQ(rkl_len(&x), 1); - CHECK_EQ((uint64_t)rkl_push(&x, 42, true), (uint64_t)MDBX_RESULT_TRUE); - CHECK_TRUE(rkl_check(&x)); + // CHECK_EQ((uint64_t)rkl_push(&x, 42, true), (uint64_t)MDBX_RESULT_TRUE); + // CHECK_TRUE(rkl_check(&x)); f = rkl_iterator(&x, false); r = rkl_iterator(&x, true); @@ -188,7 +188,7 @@ static bool stochastic_pass(const unsigned start, const unsigned width, const un if (id < MIN_TXNID || id >= INVALID_TXNID) continue; if (txl_contain(l, id)) { - if (CHECK_TRUE(rkl_contain(&k, id)) && CHECK_EQ((uint64_t)rkl_push(&k, id, false), (uint64_t)MDBX_RESULT_TRUE)) + if (CHECK_TRUE(rkl_contain(&k, id)) && CHECK_EQ((uint64_t)rkl_push(&k, id), (uint64_t)MDBX_RESULT_TRUE)) continue; break; } @@ -208,7 +208,7 @@ static bool stochastic_pass(const unsigned start, const unsigned width, const un } #endif - if (!CHECK_EQ(rkl_push(&k, id, false), MDBX_SUCCESS)) + if (!CHECK_EQ(rkl_push(&k, id), MDBX_SUCCESS)) break; if (!CHECK_TRUE(rkl_check(&k))) break; @@ -416,7 +416,7 @@ static bool stochastic_pass_hole(size_t set, size_t trims) { rkl_init(&rkl); for (size_t n = 1; n < CHAR_BIT * sizeof(set); ++n) if (bit(set, n)) - CHECK_EQ(rkl_push(&rkl, n, false), MDBX_SUCCESS); + CHECK_EQ(rkl_push(&rkl, n), MDBX_SUCCESS); if (!check_holes_fourways(set, &rkl)) return false;