Skip to content

Commit

Permalink
mdbx: fix assertion regression.
Browse files Browse the repository at this point in the history
Fixes erigontech/erigon#3874.

This was a minor regression after the c4a5325
that affects only debug builgs (with enabled assertions) and only when the added
code catch a incoherency of unified page/buffer cache.
  • Loading branch information
erthink committed Apr 11, 2022
1 parent 3872c0a commit 9fa4e21
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions src/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -5046,13 +5046,21 @@ static int mdbx_iov_write(MDBX_txn *const txn, struct mdbx_iov_ctx *ctx) {
ctx->iov_bytes);
}

unsigned iov_items = ctx->iov_items;
#if MDBX_ENABLE_PGOP_STAT
txn->mt_env->me_lck->mti_pgop_stat.wops.weak += iov_items;
#endif /* MDBX_ENABLE_PGOP_STAT */
ctx->iov_items = 0;
ctx->iov_bytes = 0;

uint64_t timestamp = 0;
for (unsigned i = 0; i < ctx->iov_items; i++) {
for (unsigned i = 0; i < iov_items; i++) {
MDBX_page *wp = (MDBX_page *)ctx->iov[i].iov_base;
const MDBX_page *rp = pgno2page(txn->mt_env, wp->mp_pgno);
/* check with timeout as the workaround
* for https://github.com/erthink/libmdbx/issues/269 */
while (unlikely(memcmp(wp, rp, ctx->iov[i].iov_len) != 0)) {
while (likely(rc == MDBX_SUCCESS) &&
unlikely(memcmp(wp, rp, ctx->iov[i].iov_len) != 0)) {
if (!timestamp) {
timestamp = mdbx_osal_monotime();
mdbx_iov_done(txn, ctx);
Expand All @@ -5063,7 +5071,7 @@ static int mdbx_iov_write(MDBX_txn *const txn, struct mdbx_iov_ctx *ctx) {
mdbx_error(
"bailout waiting for %" PRIaPGNO " page arrival %s", wp->mp_pgno,
"(workaround for incoherent flaw of unified page/buffer cache)");
return MDBX_CORRUPTED;
rc = MDBX_CORRUPTED;
}
#if defined(_WIN32) || defined(_WIN64)
SwitchToThread();
Expand All @@ -5077,12 +5085,6 @@ static int mdbx_iov_write(MDBX_txn *const txn, struct mdbx_iov_ctx *ctx) {
}
mdbx_dpage_free(env, wp, bytes2pgno(env, ctx->iov[i].iov_len));
}

#if MDBX_ENABLE_PGOP_STAT
txn->mt_env->me_lck->mti_pgop_stat.wops.weak += ctx->iov_items;
#endif /* MDBX_ENABLE_PGOP_STAT */
ctx->iov_items = 0;
ctx->iov_bytes = 0;
return rc;
}

Expand Down

0 comments on commit 9fa4e21

Please sign in to comment.