mdbx: refine mdbx_meta_ot() and dependents.

Change-Id: I449d501f0c3710fdb906e01931e10300ab3b7c9d
This commit is contained in:
Leo Yuriev 2017-07-24 11:23:09 +03:00
parent 0b07749fba
commit ab8fa36033

View File

@ -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. */