From 78170a575030f78e34c68d9d7efb2cedf8abd7f3 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: Thu, 10 Feb 2022 00:24:32 +0300 Subject: [PATCH 1/6] mdbx: minor reduce/lowering debug "update oldest" logging. --- src/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core.c b/src/core.c index 3d5a6064..97ad98e9 100644 --- a/src/core.c +++ b/src/core.c @@ -5791,7 +5791,8 @@ static txnid_t mdbx_find_oldest(const MDBX_txn *txn) { } if (oldest != last_oldest) { - mdbx_notice("update oldest %" PRIaTXN " -> %" PRIaTXN, last_oldest, oldest); + mdbx_verbose("update oldest %" PRIaTXN " -> %" PRIaTXN, last_oldest, + oldest); mdbx_tassert(txn, oldest >= lck->mti_oldest_reader.weak); atomic_store64(&lck->mti_oldest_reader, oldest, mo_Relaxed); } From fb25648b9c27f3b4e431ace1d1540f6cdf6bd049 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: Thu, 10 Feb 2022 11:03:15 +0300 Subject: [PATCH 2/6] mdbx: force `mdbx_page_get()` to inline. --- src/core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core.c b/src/core.c index 97ad98e9..620540ec 100644 --- a/src/core.c +++ b/src/core.c @@ -3733,10 +3733,10 @@ static int mdbx_txn_end(MDBX_txn *txn, const unsigned mode); __hot static struct page_result __must_check_result mdbx_page_get_ex(MDBX_cursor *const mc, const pgno_t pgno, txnid_t front); -static __inline int __must_check_result mdbx_page_get(MDBX_cursor *mc, - pgno_t pgno, - MDBX_page **mp, - txnid_t front) { +static __always_inline int __must_check_result mdbx_page_get(MDBX_cursor *mc, + pgno_t pgno, + MDBX_page **mp, + txnid_t front) { struct page_result ret = mdbx_page_get_ex(mc, pgno, front); *mp = ret.page; From 110cf09cf80e38e7131806ca6864de44aa8347a4 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: Fri, 11 Feb 2022 15:12:31 +0300 Subject: [PATCH 3/6] mdbx: simplify core-dbs update inside `mdbx_txn_commit_ex()`. --- src/core.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/core.c b/src/core.c index 620540ec..cdd88e56 100644 --- a/src/core.c +++ b/src/core.c @@ -10157,9 +10157,7 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) { /* Update parent's DBs array */ memcpy(parent->mt_dbs, txn->mt_dbs, txn->mt_numdbs * sizeof(MDBX_db)); parent->mt_numdbs = txn->mt_numdbs; - parent->mt_dbistate[FREE_DBI] = txn->mt_dbistate[FREE_DBI]; - parent->mt_dbistate[MAIN_DBI] = txn->mt_dbistate[MAIN_DBI]; - for (unsigned i = CORE_DBS; i < txn->mt_numdbs; i++) { + for (unsigned i = 0; i < txn->mt_numdbs; i++) { /* preserve parent's status */ const uint8_t state = txn->mt_dbistate[i] | @@ -10254,6 +10252,14 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) { if (unlikely(rc != MDBX_SUCCESS)) goto fail; + txn->mt_dbs[FREE_DBI].md_mod_txnid = (txn->mt_dbistate[FREE_DBI] & DBI_DIRTY) + ? txn->mt_txnid + : txn->mt_dbs[FREE_DBI].md_mod_txnid; + + txn->mt_dbs[MAIN_DBI].md_mod_txnid = (txn->mt_dbistate[MAIN_DBI] & DBI_DIRTY) + ? txn->mt_txnid + : txn->mt_dbs[MAIN_DBI].md_mod_txnid; + ts_2 = latency ? mdbx_osal_monotime() : 0; if (mdbx_audit_enabled()) { rc = mdbx_audit_ex(txn, MDBX_PNL_SIZE(txn->tw.retired_pages), true); @@ -10273,7 +10279,6 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) { ts_3 = latency ? mdbx_osal_monotime() : 0; if (likely(rc == MDBX_SUCCESS)) { - const MDBX_meta *head = constmeta_prefer_last(env); MDBX_meta meta; memcpy(meta.mm_magic_and_version, head->mm_magic_and_version, 8); @@ -10283,18 +10288,9 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) { unaligned_poke_u64(4, meta.mm_pages_retired, unaligned_peek_u64(4, head->mm_pages_retired) + MDBX_PNL_SIZE(txn->tw.retired_pages)); - meta.mm_geo = txn->mt_geo; meta.mm_dbs[FREE_DBI] = txn->mt_dbs[FREE_DBI]; - meta.mm_dbs[FREE_DBI].md_mod_txnid = - (txn->mt_dbistate[FREE_DBI] & DBI_DIRTY) - ? txn->mt_txnid - : txn->mt_dbs[FREE_DBI].md_mod_txnid; meta.mm_dbs[MAIN_DBI] = txn->mt_dbs[MAIN_DBI]; - meta.mm_dbs[MAIN_DBI].md_mod_txnid = - (txn->mt_dbistate[MAIN_DBI] & DBI_DIRTY) - ? txn->mt_txnid - : txn->mt_dbs[MAIN_DBI].md_mod_txnid; meta.mm_canary = txn->mt_canary; meta_set_txnid(env, &meta, txn->mt_txnid); From 4adc7aa58da8c82516b392412a457f4b8a6f3713 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: Sat, 12 Feb 2022 01:26:17 +0300 Subject: [PATCH 4/6] mdbx: add few checks to `mdbx_validate_meta()`. --- src/core.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/core.c b/src/core.c index cdd88e56..ac50d64e 100644 --- a/src/core.c +++ b/src/core.c @@ -10542,12 +10542,12 @@ static int mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, meta->mm_dbs[FREE_DBI].md_entries || meta->mm_dbs[FREE_DBI].md_leaf_pages || meta->mm_dbs[FREE_DBI].md_overflow_pages)) { - mdbx_warning("meta[%u] has false-empty GC, skip it", meta_number); + mdbx_warning("meta[%u] has false-empty %s, skip it", meta_number, "GC"); return MDBX_CORRUPTED; } } else if (unlikely(meta->mm_dbs[FREE_DBI].md_root >= meta->mm_geo.next)) { - mdbx_warning("meta[%u] has invalid GC-root %" PRIaPGNO ", skip it", - meta_number, meta->mm_dbs[FREE_DBI].md_root); + mdbx_warning("meta[%u] has invalid %s-root %" PRIaPGNO ", skip it", + meta_number, "GC", meta->mm_dbs[FREE_DBI].md_root); return MDBX_CORRUPTED; } @@ -10558,12 +10558,24 @@ static int mdbx_validate_meta(MDBX_env *env, MDBX_meta *const meta, meta->mm_dbs[MAIN_DBI].md_entries || meta->mm_dbs[MAIN_DBI].md_leaf_pages || meta->mm_dbs[MAIN_DBI].md_overflow_pages)) { - mdbx_warning("meta[%u] has false-empty maindb", meta_number); + mdbx_warning("meta[%u] has false-empty %s", meta_number, "MainDB"); return MDBX_CORRUPTED; } } else if (unlikely(meta->mm_dbs[MAIN_DBI].md_root >= meta->mm_geo.next)) { - mdbx_warning("meta[%u] has invalid maindb-root %" PRIaPGNO ", skip it", - meta_number, meta->mm_dbs[MAIN_DBI].md_root); + mdbx_warning("meta[%u] has invalid %s-root %" PRIaPGNO ", skip it", + meta_number, "MainDB", meta->mm_dbs[MAIN_DBI].md_root); + return MDBX_CORRUPTED; + } + + if (unlikely(meta->mm_dbs[FREE_DBI].md_mod_txnid > txnid)) { + mdbx_warning("meta[%u] has wrong md_mod_txnid %" PRIaTXN " for %s, skip it", + meta_number, meta->mm_dbs[FREE_DBI].md_mod_txnid, "GC"); + return MDBX_CORRUPTED; + } + + if (unlikely(meta->mm_dbs[MAIN_DBI].md_mod_txnid > txnid)) { + mdbx_warning("meta[%u] has wrong md_mod_txnid %" PRIaTXN " for %s, skip it", + meta_number, meta->mm_dbs[MAIN_DBI].md_mod_txnid, "MainDB"); return MDBX_CORRUPTED; } From 7ade182d64e7923c9f841bb66f8e3bbeea7cbb22 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: Sat, 12 Feb 2022 18:59:41 +0300 Subject: [PATCH 5/6] mdbx: minor simplify/refine `mdbx_env_set_geometry()` internals. --- src/core.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/core.c b/src/core.c index ac50d64e..4ce06ee0 100644 --- a/src/core.c +++ b/src/core.c @@ -11536,14 +11536,22 @@ mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t size_now, /* apply new params to opened environment */ mdbx_ensure(env, pagesize == (intptr_t)env->me_psize); MDBX_meta meta; - const MDBX_meta *head = nullptr; + memset(&meta, 0, sizeof(meta)); const MDBX_geo *current_geo; - if (inside_txn) { - current_geo = &env->me_txn->mt_geo; - } else { - head = constmeta_prefer_last(env); + if (!inside_txn) { + mdbx_assert(env, need_unlock); + const MDBX_meta *head = constmeta_prefer_last(env); meta = *head; + const txnid_t txnid = safe64_txnid_next(constmeta_txnid(env, &meta)); + if (unlikely(txnid > MAX_TXNID)) { + rc = MDBX_TXN_FULL; + mdbx_error("txnid overflow, raise %d", rc); + goto bailout; + } + meta_set_txnid(env, &meta, txnid); current_geo = &meta.mm_geo; + } else { + current_geo = &env->me_txn->mt_geo; } MDBX_geo new_geo; @@ -11614,23 +11622,13 @@ mdbx_env_set_geometry(MDBX_env *env, intptr_t size_lower, intptr_t size_now, false); if (unlikely(rc != MDBX_SUCCESS)) goto bailout; - mdbx_assert(env, (head == nullptr) == inside_txn); - if (head) - head = /* base address could be changed */ constmeta_prefer_last(env); } if (inside_txn) { env->me_txn->mt_geo = new_geo; env->me_txn->mt_flags |= MDBX_TXN_DIRTY; } else { meta.mm_geo = new_geo; - const txnid_t txnid = safe64_txnid_next(constmeta_txnid(env, head)); - if (unlikely(txnid > MAX_TXNID)) { - rc = MDBX_TXN_FULL; - mdbx_error("txnid overflow, raise %d", rc); - } else { - meta_set_txnid(env, &meta, txnid); - rc = mdbx_sync_locked(env, env->me_flags, &meta); - } + rc = mdbx_sync_locked(env, env->me_flags, &meta); } if (likely(rc == MDBX_SUCCESS)) { From bfea3ca9fb7e2a3078746ee16ab600fa1b15e367 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: Sat, 19 Feb 2022 13:18:03 +0300 Subject: [PATCH 6/6] mdbx: minor refine `mdbx_page_search()` internals. --- src/core.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/core.c b/src/core.c index 4ce06ee0..86784f5a 100644 --- a/src/core.c +++ b/src/core.c @@ -13682,15 +13682,17 @@ __hot static int mdbx_page_search(MDBX_cursor *mc, const MDBX_val *key, pp_txnid = /* mc->mc_db->md_mod_txnid maybe zero in a legacy DB */ pp_txnid ? pp_txnid : mc->mc_txn->mt_txnid; - MDBX_txn *scan = mc->mc_txn; - do - if ((scan->mt_flags & MDBX_TXN_DIRTY) && - (mc->mc_dbi == MAIN_DBI || - (scan->mt_dbistate[mc->mc_dbi] & DBI_DIRTY))) { - pp_txnid = scan->mt_front; - break; - } - while (unlikely((scan = scan->mt_parent) != nullptr)); + if ((mc->mc_txn->mt_flags & MDBX_TXN_RDONLY) == 0) { + MDBX_txn *scan = mc->mc_txn; + do + if ((scan->mt_flags & MDBX_TXN_DIRTY) && + (mc->mc_dbi == MAIN_DBI || + (scan->mt_dbistate[mc->mc_dbi] & DBI_DIRTY))) { + pp_txnid = scan->mt_front; + break; + } + while (unlikely((scan = scan->mt_parent) != nullptr)); + } if (unlikely((rc = mdbx_page_get(mc, root, &mc->mc_pg[0], pp_txnid)) != 0)) return rc; }