From 75922a87b6e5c936f001168f2380d18b58ea8977 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, 23 Mar 2022 00:38:31 +0300 Subject: [PATCH] mdbx: refine `override_meta()` to preserve format-signature for legacy/zero mod_txnid. --- src/core.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/core.c b/src/core.c index da3461d1d..95a826e8a 100644 --- a/src/core.c +++ b/src/core.c @@ -12618,9 +12618,13 @@ __cold static int __must_check_result mdbx_override_meta( meta_set_txnid(env, model, txnid); mdbx_assert(env, meta_checktxnid(env, model, true)); if (shape) { - mdbx_assert(env, meta_checktxnid(env, shape, true)); - if (env->me_stuck_meta >= 0 || - (mdbx_runtime_flags & MDBX_DBG_DONT_UPGRADE) != 0) + if (txnid && unlikely(!meta_checktxnid(env, shape, false))) { + mdbx_error("bailout overriding meta-%u since model failed " + "freedb/maindb %s-check for txnid #%" PRIaTXN, + target, "pre", constmeta_txnid(env, shape)); + return MDBX_PROBLEM; + } + if (mdbx_runtime_flags & MDBX_DBG_DONT_UPGRADE) memcpy(&model->mm_magic_and_version, &shape->mm_magic_and_version, sizeof(model->mm_magic_and_version)); model->mm_extra_flags = shape->mm_extra_flags; @@ -12631,13 +12635,29 @@ __cold static int __must_check_result mdbx_override_meta( memcpy(&model->mm_canary, &shape->mm_canary, sizeof(model->mm_canary)); memcpy(&model->mm_pages_retired, &shape->mm_pages_retired, sizeof(model->mm_pages_retired)); - mdbx_assert(env, meta_checktxnid(env, model, true)); + if (txnid) { + if ((!model->mm_dbs[FREE_DBI].md_mod_txnid && + model->mm_dbs[FREE_DBI].md_root != P_INVALID) || + (!model->mm_dbs[MAIN_DBI].md_mod_txnid && + model->mm_dbs[MAIN_DBI].md_root != P_INVALID)) + memcpy(&model->mm_magic_and_version, &shape->mm_magic_and_version, + sizeof(model->mm_magic_and_version)); + if (unlikely(!meta_checktxnid(env, model, false))) { + mdbx_error("bailout overriding meta-%u since model failed " + "freedb/maindb %s-check for txnid #%" PRIaTXN, + target, "post", txnid); + return MDBX_PROBLEM; + } + } } unaligned_poke_u64(4, model->mm_datasync_sign, meta_sign(model)); rc = mdbx_validate_meta(env, model, page, target, nullptr); if (unlikely(MDBX_IS_ERROR(rc))) return MDBX_PROBLEM; + if (shape && memcmp(model, shape, sizeof(MDBX_meta)) == 0) + return MDBX_SUCCESS; + #if MDBX_ENABLE_PGOP_STAT env->me_lck->mti_pgop_stat.wops.weak += 1; #endif /* MDBX_ENABLE_PGOP_STAT */