mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-06 18:54:14 +08:00
mdbx: refine mdbx_meta_ot() and dependents.
Change-Id: I449d501f0c3710fdb906e01931e10300ab3b7c9d
This commit is contained in:
parent
0b07749fba
commit
ab8fa36033
42
src/mdbx.c
42
src/mdbx.c
@ -1402,9 +1402,9 @@ static __inline uint64_t mdbx_meta_sign(const MDBX_meta *meta) {
|
|||||||
|
|
||||||
enum meta_choise_mode { prefer_last, prefer_noweak, prefer_steady };
|
enum meta_choise_mode { prefer_last, prefer_noweak, prefer_steady };
|
||||||
|
|
||||||
static __inline bool mdbx_meta_ot(const MDBX_env *env, const MDBX_meta *a,
|
static __inline bool mdbx_meta_ot(const enum meta_choise_mode mode,
|
||||||
const MDBX_meta *b,
|
const MDBX_env *env, const MDBX_meta *a,
|
||||||
const enum meta_choise_mode mode) {
|
const MDBX_meta *b) {
|
||||||
mdbx_jitter4testing(true);
|
mdbx_jitter4testing(true);
|
||||||
txnid_t txnid_a = mdbx_meta_txnid_fluid(env, a);
|
txnid_t txnid_a = mdbx_meta_txnid_fluid(env, a);
|
||||||
txnid_t txnid_b = mdbx_meta_txnid_fluid(env, b);
|
txnid_t txnid_b = mdbx_meta_txnid_fluid(env, b);
|
||||||
@ -1458,43 +1458,43 @@ static int mdbx_meta_eq_mask(const MDBX_env *env) {
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline MDBX_meta *mdbx_meta_recent(const MDBX_env *env, MDBX_meta *a,
|
static __inline MDBX_meta *mdbx_meta_recent(const enum meta_choise_mode mode,
|
||||||
MDBX_meta *b,
|
const MDBX_env *env, MDBX_meta *a,
|
||||||
const enum meta_choise_mode mode) {
|
MDBX_meta *b) {
|
||||||
const bool a_older_that_b = mdbx_meta_ot(env, a, b, mode);
|
const bool a_older_that_b = mdbx_meta_ot(mode, env, a, b);
|
||||||
mdbx_assert(env, !mdbx_meta_eq(env, a, b));
|
mdbx_assert(env, !mdbx_meta_eq(env, a, b));
|
||||||
return a_older_that_b ? b : a;
|
return a_older_that_b ? b : a;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline MDBX_meta *mdbx_meta_ancient(const MDBX_env *env, MDBX_meta *a,
|
static __inline MDBX_meta *mdbx_meta_ancient(const enum meta_choise_mode mode,
|
||||||
MDBX_meta *b,
|
const MDBX_env *env, MDBX_meta *a,
|
||||||
const enum meta_choise_mode mode) {
|
MDBX_meta *b) {
|
||||||
const bool a_older_that_b = mdbx_meta_ot(env, a, b, mode);
|
const bool a_older_that_b = mdbx_meta_ot(mode, env, a, b);
|
||||||
mdbx_assert(env, !mdbx_meta_eq(env, a, b));
|
mdbx_assert(env, !mdbx_meta_eq(env, a, b));
|
||||||
return a_older_that_b ? a : b;
|
return a_older_that_b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline MDBX_meta *
|
static __inline MDBX_meta *
|
||||||
mdbx_meta_mostrecent(const MDBX_env *env, const enum meta_choise_mode mode) {
|
mdbx_meta_mostrecent(const enum meta_choise_mode mode, const MDBX_env *env) {
|
||||||
MDBX_meta *m0 = METAPAGE(env, 0);
|
MDBX_meta *m0 = METAPAGE(env, 0);
|
||||||
MDBX_meta *m1 = METAPAGE(env, 1);
|
MDBX_meta *m1 = METAPAGE(env, 1);
|
||||||
MDBX_meta *m2 = METAPAGE(env, 2);
|
MDBX_meta *m2 = METAPAGE(env, 2);
|
||||||
|
|
||||||
MDBX_meta *head = mdbx_meta_recent(env, m0, m1, mode);
|
MDBX_meta *head = mdbx_meta_recent(mode, env, m0, m1);
|
||||||
head = mdbx_meta_recent(env, head, m2, mode);
|
head = mdbx_meta_recent(mode, env, head, m2);
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __hot MDBX_meta *mdbx_meta_steady(const MDBX_env *env) {
|
static __hot MDBX_meta *mdbx_meta_steady(const MDBX_env *env) {
|
||||||
return mdbx_meta_mostrecent(env, prefer_steady);
|
return mdbx_meta_mostrecent(prefer_steady, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __hot MDBX_meta *mdbx_meta_head(const MDBX_env *env) {
|
static __hot MDBX_meta *mdbx_meta_head(const MDBX_env *env) {
|
||||||
return mdbx_meta_mostrecent(env, prefer_last);
|
return mdbx_meta_mostrecent(prefer_last, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __hot txnid_t mdbx_reclaiming_detent(const MDBX_env *env) {
|
static __hot txnid_t mdbx_reclaiming_detent(const MDBX_env *env) {
|
||||||
MDBX_meta *meta = mdbx_meta_mostrecent(env, prefer_noweak);
|
MDBX_meta *meta = mdbx_meta_mostrecent(prefer_noweak, env);
|
||||||
return mdbx_meta_txnid_stable(env, meta);
|
return mdbx_meta_txnid_stable(env, meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3784,7 +3784,7 @@ static int __cold mdbx_read_header(MDBX_env *env, MDBX_meta *meta) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mdbx_meta_ot(env, meta, &page.mp_meta, true)) {
|
if (mdbx_meta_ot(prefer_steady, env, meta, &page.mp_meta)) {
|
||||||
*meta = page.mp_meta;
|
*meta = page.mp_meta;
|
||||||
if (META_IS_WEAK(meta))
|
if (META_IS_WEAK(meta))
|
||||||
loop_limit += 1; /* LY: should re-read to hush race with update */
|
loop_limit += 1; /* LY: should re-read to hush race with update */
|
||||||
@ -3947,12 +3947,12 @@ static int mdbx_sync_locked(MDBX_env *env, unsigned flags,
|
|||||||
return MDBX_SUCCESS;
|
return MDBX_SUCCESS;
|
||||||
}
|
}
|
||||||
} else if (head == meta0)
|
} else if (head == meta0)
|
||||||
target = mdbx_meta_ancient(env, meta1, meta2, true);
|
target = mdbx_meta_ancient(prefer_steady, env, meta1, meta2);
|
||||||
else if (head == meta1)
|
else if (head == meta1)
|
||||||
target = mdbx_meta_ancient(env, meta0, meta2, true);
|
target = mdbx_meta_ancient(prefer_steady, env, meta0, meta2);
|
||||||
else {
|
else {
|
||||||
mdbx_assert(env, head == meta2);
|
mdbx_assert(env, head == meta2);
|
||||||
target = mdbx_meta_ancient(env, meta0, meta1, true);
|
target = mdbx_meta_ancient(prefer_steady, env, meta0, meta1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LY: step#2 - update meta-page. */
|
/* LY: step#2 - update meta-page. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user