mdbx: удаление known_continuous аргумента rkl_push().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2025-06-03 16:27:02 +03:00
parent b3329fddf2
commit bb5b6c5823
5 changed files with 24 additions and 23 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;