From de63041b7d4a165fb82a9261aec9331393164e56 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: Tue, 22 Mar 2022 20:40:30 +0300 Subject: [PATCH] mdbx: add `MDBX_DBG_DONT_UPGRADE` flag. --- mdbx.h | 11 ++++++++--- src/core.c | 9 ++++++--- src/mdbx_chk.c | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mdbx.h b/mdbx.h index 3844afc5..1e71f1ad 100644 --- a/mdbx.h +++ b/mdbx.h @@ -864,18 +864,23 @@ enum MDBX_debug_flags_t { MDBX_DBG_JITTER = 4, /** Include or not meta-pages in coredump files. - * May affect performance in \ref MDBX_WRITEMAP mode */ + * \note May affect performance in \ref MDBX_WRITEMAP mode */ MDBX_DBG_DUMP = 8, /** Allow multi-opening environment(s) */ MDBX_DBG_LEGACY_MULTIOPEN = 16, - /** Allow read and write transactions overlapping for the same thread */ + /** Allow read and write transactions overlapping for the same thread. */ MDBX_DBG_LEGACY_OVERLAP = 32, + /** Don't auto-upgrade format signature. + * \note However a new write transactions will use and store + * the last signature regardless this flag */ + MDBX_DBG_DONT_UPGRADE = 64, + #ifdef ENABLE_UBSAN MDBX_DBG_MAX = ((unsigned)MDBX_LOG_MAX) << 16 | - 63 /* avoid UBSAN false-positive trap by a tests */, + 127 /* avoid UBSAN false-positive trap by a tests */, #endif /* ENABLE_UBSAN */ /** for mdbx_setup_debug() only: Don't change current settings */ diff --git a/src/core.c b/src/core.c index 3fb5d0fb..8a6866fb 100644 --- a/src/core.c +++ b/src/core.c @@ -12278,7 +12278,8 @@ __cold static int mdbx_setup_dxb(MDBX_env *env, const int lck_rc, atomic_store32(&env->me_lck->mti_discarded_tail, bytes2pgno(env, used_aligned2os_bytes), mo_Relaxed); - if ((env->me_flags & MDBX_RDONLY) == 0 && env->me_stuck_meta < 0) { + if ((env->me_flags & MDBX_RDONLY) == 0 && env->me_stuck_meta < 0 && + (mdbx_runtime_flags & MDBX_DBG_DONT_UPGRADE) == 0) { for (int n = 0; n < NUM_METAS; ++n) { MDBX_meta *const pmeta = METAPAGE(env, n); if (unlikely(unaligned_peek_u64(4, &pmeta->mm_magic_and_version) != @@ -12618,7 +12619,8 @@ __cold static int __must_check_result mdbx_override_meta( mdbx_assert(env, meta_checktxnid(env, model, true)); if (shape) { mdbx_assert(env, meta_checktxnid(env, shape, true)); - if (env->me_stuck_meta >= 0) + if (env->me_stuck_meta >= 0 || + (mdbx_runtime_flags & MDBX_DBG_DONT_UPGRADE) != 0) 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; @@ -20877,7 +20879,8 @@ __cold int mdbx_setup_debug(int loglevel, int flags, MDBX_debug_func *logger) { #if MDBX_DEBUG MDBX_DBG_ASSERT | MDBX_DBG_AUDIT | MDBX_DBG_JITTER | #endif - MDBX_DBG_DUMP | MDBX_DBG_LEGACY_MULTIOPEN | MDBX_DBG_LEGACY_OVERLAP; + MDBX_DBG_DUMP | MDBX_DBG_LEGACY_MULTIOPEN | MDBX_DBG_LEGACY_OVERLAP | + MDBX_DBG_DONT_UPGRADE; mdbx_runtime_flags = (uint8_t)flags; } diff --git a/src/mdbx_chk.c b/src/mdbx_chk.c index 455acb8c..62dfcd24 100644 --- a/src/mdbx_chk.c +++ b/src/mdbx_chk.c @@ -1226,7 +1226,7 @@ int main(int argc, char *argv[]) { mdbx_setup_debug((verbose < MDBX_LOG_TRACE - 1) ? (MDBX_log_level_t)(verbose + 1) : MDBX_LOG_TRACE, - MDBX_DBG_LEGACY_OVERLAP, logger); + MDBX_DBG_LEGACY_OVERLAP | MDBX_DBG_DONT_UPGRADE, logger); rc = mdbx_env_create(&env); if (rc) {