mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-04 19:44:13 +08:00
mdbx: add meta_xyz_dump()
.
This commit is contained in:
parent
b617f25eaa
commit
ceba040e32
33
src/core.c
33
src/core.c
@ -5192,6 +5192,26 @@ static const char *durable_caption(const volatile MDBX_meta *const meta) {
|
|||||||
return "Weak";
|
return "Weak";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__cold static void meta_troika_dump(const MDBX_env *env,
|
||||||
|
const meta_troika_t *troika) {
|
||||||
|
const meta_ptr_t recent = meta_recent(env, troika);
|
||||||
|
const meta_ptr_t prefer_steady = meta_prefer_steady(env, troika);
|
||||||
|
const meta_ptr_t tail = meta_tail(env, troika);
|
||||||
|
NOTICE("%" PRIaTXN ".%c:%" PRIaTXN ".%c:%" PRIaTXN ".%c, fsm=0x%02x, "
|
||||||
|
"head=%d-%" PRIaTXN ".%c, "
|
||||||
|
"base=%d-%" PRIaTXN ".%c, "
|
||||||
|
"tail=%d-%" PRIaTXN ".%c, "
|
||||||
|
"valid %c, strict %c",
|
||||||
|
troika->txnid[0], (troika->fsm & 1) ? 's' : 'w', troika->txnid[1],
|
||||||
|
(troika->fsm & 2) ? 's' : 'w', troika->txnid[2],
|
||||||
|
(troika->fsm & 4) ? 's' : 'w', troika->fsm, troika->recent,
|
||||||
|
recent.txnid, recent.is_steady ? 's' : 'w', troika->prefer_steady,
|
||||||
|
prefer_steady.txnid, prefer_steady.is_steady ? 's' : 'w',
|
||||||
|
troika->tail_and_flags % NUM_METAS, tail.txnid,
|
||||||
|
tail.is_steady ? 's' : 'w', TROIKA_VALID(troika) ? 'Y' : 'N',
|
||||||
|
TROIKA_STRICT_VALID(troika) ? 'Y' : 'N');
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* Find oldest txnid still referenced. */
|
/* Find oldest txnid still referenced. */
|
||||||
@ -12198,6 +12218,9 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */
|
#endif /* MDBX_USE_VALGRIND || __SANITIZE_ADDRESS__ */
|
||||||
|
|
||||||
meta_troika_t troika = meta_tap(env);
|
meta_troika_t troika = meta_tap(env);
|
||||||
|
#if MDBX_DEBUG
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
|
#endif
|
||||||
eASSERT(env, !env->me_txn && !env->me_txn0);
|
eASSERT(env, !env->me_txn && !env->me_txn0);
|
||||||
//-------------------------------- validate/rollback head & steady meta-pages
|
//-------------------------------- validate/rollback head & steady meta-pages
|
||||||
if (unlikely(env->me_stuck_meta >= 0)) {
|
if (unlikely(env->me_stuck_meta >= 0)) {
|
||||||
@ -12208,6 +12231,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
if (unlikely(err != MDBX_SUCCESS)) {
|
if (unlikely(err != MDBX_SUCCESS)) {
|
||||||
ERROR("target meta[%u] is corrupted",
|
ERROR("target meta[%u] is corrupted",
|
||||||
bytes2pgno(env, (uint8_t *)data_page(target) - env->me_map));
|
bytes2pgno(env, (uint8_t *)data_page(target) - env->me_map));
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_CORRUPTED;
|
return MDBX_CORRUPTED;
|
||||||
}
|
}
|
||||||
} else /* not recovery mode */
|
} else /* not recovery mode */
|
||||||
@ -12215,6 +12239,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
const unsigned meta_clash_mask = meta_eq_mask(&troika);
|
const unsigned meta_clash_mask = meta_eq_mask(&troika);
|
||||||
if (unlikely(meta_clash_mask)) {
|
if (unlikely(meta_clash_mask)) {
|
||||||
ERROR("meta-pages are clashed: mask 0x%d", meta_clash_mask);
|
ERROR("meta-pages are clashed: mask 0x%d", meta_clash_mask);
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_CORRUPTED;
|
return MDBX_CORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12228,6 +12253,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
/* LY: without-lck (read-only) mode, so it is impossible that other
|
/* LY: without-lck (read-only) mode, so it is impossible that other
|
||||||
* process made weak checkpoint. */
|
* process made weak checkpoint. */
|
||||||
ERROR("%s", "without-lck, unable recovery/rollback");
|
ERROR("%s", "without-lck, unable recovery/rollback");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_WANNA_RECOVERY;
|
return MDBX_WANNA_RECOVERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12248,6 +12274,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
ERROR("meta[%u] with %s txnid %" PRIaTXN " is corrupted, %s needed",
|
ERROR("meta[%u] with %s txnid %" PRIaTXN " is corrupted, %s needed",
|
||||||
bytes2pgno(env, (uint8_t *)prefer_steady.ptr_c - env->me_map),
|
bytes2pgno(env, (uint8_t *)prefer_steady.ptr_c - env->me_map),
|
||||||
"steady", prefer_steady.txnid, "manual recovery");
|
"steady", prefer_steady.txnid, "manual recovery");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_CORRUPTED;
|
return MDBX_CORRUPTED;
|
||||||
}
|
}
|
||||||
if (prefer_steady.ptr_c == recent.ptr_c)
|
if (prefer_steady.ptr_c == recent.ptr_c)
|
||||||
@ -12265,11 +12292,13 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
ERROR("%s for open or automatic rollback, %s",
|
ERROR("%s for open or automatic rollback, %s",
|
||||||
"there are no suitable meta-pages",
|
"there are no suitable meta-pages",
|
||||||
"manual recovery is required");
|
"manual recovery is required");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_CORRUPTED;
|
return MDBX_CORRUPTED;
|
||||||
}
|
}
|
||||||
WARNING("meta[%u] with last txnid %" PRIaTXN
|
WARNING("meta[%u] with last txnid %" PRIaTXN
|
||||||
" is corrupted, rollback needed",
|
" is corrupted, rollback needed",
|
||||||
pgno, recent.txnid);
|
pgno, recent.txnid);
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
goto purge_meta_head;
|
goto purge_meta_head;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12279,6 +12308,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
"rollback NOT needed, steady-sync NEEDED%s",
|
"rollback NOT needed, steady-sync NEEDED%s",
|
||||||
"opening after an unclean shutdown", bootid.x, bootid.y,
|
"opening after an unclean shutdown", bootid.x, bootid.y,
|
||||||
", but unable in read-only mode");
|
", but unable in read-only mode");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_WANNA_RECOVERY;
|
return MDBX_WANNA_RECOVERY;
|
||||||
}
|
}
|
||||||
WARNING("%s, but boot-id(%016" PRIx64 "-%016" PRIx64 ") is MATCH: "
|
WARNING("%s, but boot-id(%016" PRIx64 "-%016" PRIx64 ") is MATCH: "
|
||||||
@ -12294,6 +12324,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
"opening after an unclean shutdown",
|
"opening after an unclean shutdown",
|
||||||
"there are no suitable meta-pages",
|
"there are no suitable meta-pages",
|
||||||
"manual recovery is required");
|
"manual recovery is required");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_CORRUPTED;
|
return MDBX_CORRUPTED;
|
||||||
}
|
}
|
||||||
if (env->me_flags & MDBX_RDONLY) {
|
if (env->me_flags & MDBX_RDONLY) {
|
||||||
@ -12301,6 +12332,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
" to steady %" PRIaTXN ")%s",
|
" to steady %" PRIaTXN ")%s",
|
||||||
"opening after an unclean shutdown", recent.txnid,
|
"opening after an unclean shutdown", recent.txnid,
|
||||||
prefer_steady.txnid, ", but unable in read-only mode");
|
prefer_steady.txnid, ", but unable in read-only mode");
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
return MDBX_WANNA_RECOVERY;
|
return MDBX_WANNA_RECOVERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12309,6 +12341,7 @@ __cold static int setup_dxb(MDBX_env *env, const int lck_rc,
|
|||||||
"purge%s meta[%u] with%s txnid %" PRIaTXN,
|
"purge%s meta[%u] with%s txnid %" PRIaTXN,
|
||||||
"opening after an unclean shutdown", last_valid ? "" : " invalid",
|
"opening after an unclean shutdown", last_valid ? "" : " invalid",
|
||||||
pgno, last_valid ? " weak" : "", recent.txnid);
|
pgno, last_valid ? " weak" : "", recent.txnid);
|
||||||
|
meta_troika_dump(env, &troika);
|
||||||
ENSURE(env, prefer_steady.is_steady);
|
ENSURE(env, prefer_steady.is_steady);
|
||||||
err = override_meta(env, pgno, 0,
|
err = override_meta(env, pgno, 0,
|
||||||
last_valid ? recent.ptr_c : prefer_steady.ptr_c);
|
last_valid ? recent.ptr_c : prefer_steady.ptr_c);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user