mdbx: add poor_page().

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2022-07-07 16:44:01 +03:00
parent 19c5e4d424
commit c95143f41b

View File

@ -706,7 +706,7 @@ __cold static const char *pagetype_caption(const uint8_t type,
} }
} }
__cold static int MDBX_PRINTF_ARGS(2, 3) __cold static __must_check_result int MDBX_PRINTF_ARGS(2, 3)
bad_page(const MDBX_page *mp, const char *fmt, ...) { bad_page(const MDBX_page *mp, const char *fmt, ...) {
if (mdbx_log_enabled(MDBX_LOG_ERROR)) { if (mdbx_log_enabled(MDBX_LOG_ERROR)) {
static const MDBX_page *prev; static const MDBX_page *prev;
@ -727,6 +727,26 @@ __cold static int MDBX_PRINTF_ARGS(2, 3)
return MDBX_CORRUPTED; return MDBX_CORRUPTED;
} }
__cold static void MDBX_PRINTF_ARGS(2, 3)
poor_page(const MDBX_page *mp, const char *fmt, ...) {
if (mdbx_log_enabled(MDBX_LOG_NOTICE)) {
static const MDBX_page *prev;
if (prev != mp) {
char buf4unknown[16];
prev = mp;
mdbx_debug_log(MDBX_LOG_NOTICE, "poorpage", 0,
"suboptimal %s-page #%u, mod-txnid %" PRIaTXN "\n",
pagetype_caption(PAGETYPE_WHOLE(mp), buf4unknown),
mp->mp_pgno, mp->mp_txnid);
}
va_list args;
va_start(args, fmt);
mdbx_debug_log_va(MDBX_LOG_NOTICE, "poorpage", 0, fmt, args);
va_end(args);
}
}
/* Address of node i in page p */ /* Address of node i in page p */
MDBX_NOTHROW_PURE_FUNCTION static __always_inline MDBX_node * MDBX_NOTHROW_PURE_FUNCTION static __always_inline MDBX_node *
page_node(const MDBX_page *mp, unsigned i) { page_node(const MDBX_page *mp, unsigned i) {
@ -13957,8 +13977,8 @@ __hot static __always_inline pgr_t page_get_inline(const uint16_t ILL,
mdbx_assert(env, ((txn->mt_flags ^ env->me_flags) & MDBX_WRITEMAP) == 0); mdbx_assert(env, ((txn->mt_flags ^ env->me_flags) & MDBX_WRITEMAP) == 0);
if (unlikely(r.page->mp_pgno != pgno)) { if (unlikely(r.page->mp_pgno != pgno)) {
bad_page(r.page, r.err = bad_page(
"pgno mismatch (%" PRIaPGNO ") != expected (%" PRIaPGNO ")\n", r.page, "pgno mismatch (%" PRIaPGNO ") != expected (%" PRIaPGNO ")\n",
r.page->mp_pgno, pgno); r.page->mp_pgno, pgno);
goto notfound; goto notfound;
} }
@ -14333,7 +14353,7 @@ static __noinline int node_read_bigdata(MDBX_cursor *mc, const MDBX_node *node,
const MDBX_env *env = mc->mc_txn->mt_env; const MDBX_env *env = mc->mc_txn->mt_env;
const size_t dsize = data->iov_len; const size_t dsize = data->iov_len;
if (unlikely(node_size_len(node_ks(node), dsize) <= env->me_leaf_nodemax)) if (unlikely(node_size_len(node_ks(node), dsize) <= env->me_leaf_nodemax))
bad_page(mp, "too small data (%zu bytes) for bigdata-node", dsize); poor_page(mp, "too small data (%zu bytes) for bigdata-node", dsize);
const unsigned npages = number_of_ovpages(env, dsize); const unsigned npages = number_of_ovpages(env, dsize);
if (unlikely(lp.page->mp_pages != npages)) { if (unlikely(lp.page->mp_pages != npages)) {
if (lp.page->mp_pages < npages) if (lp.page->mp_pages < npages)
@ -14341,7 +14361,7 @@ static __noinline int node_read_bigdata(MDBX_cursor *mc, const MDBX_node *node,
"too less n-pages %u for bigdata-node (%zu bytes)", "too less n-pages %u for bigdata-node (%zu bytes)",
lp.page->mp_pages, dsize); lp.page->mp_pages, dsize);
else else
bad_page(lp.page, "extra n-pages %u for bigdata-node (%zu bytes)", poor_page(lp.page, "extra n-pages %u for bigdata-node (%zu bytes)",
lp.page->mp_pages, dsize); lp.page->mp_pages, dsize);
} }
} }
@ -18360,7 +18380,7 @@ __cold static int mdbx_page_check(MDBX_cursor *const mc,
dsize, mc->mc_dbx->md_vlen_min, mc->mc_dbx->md_vlen_max); dsize, mc->mc_dbx->md_vlen_min, mc->mc_dbx->md_vlen_max);
if (unlikely(node_size_len(node_ks(node), dsize) <= if (unlikely(node_size_len(node_ks(node), dsize) <=
mc->mc_txn->mt_env->me_leaf_nodemax)) mc->mc_txn->mt_env->me_leaf_nodemax))
bad_page(mp, "too small data (%zu bytes) for bigdata-node", dsize); poor_page(mp, "too small data (%zu bytes) for bigdata-node", dsize);
if ((mc->mc_checking & CC_RETIRING) == 0) { if ((mc->mc_checking & CC_RETIRING) == 0) {
const pgr_t lp = const pgr_t lp =
@ -18375,7 +18395,8 @@ __cold static int mdbx_page_check(MDBX_cursor *const mc,
"too less n-pages %u for bigdata-node (%zu bytes)", "too less n-pages %u for bigdata-node (%zu bytes)",
lp.page->mp_pages, dsize); lp.page->mp_pages, dsize);
else else
bad_page(lp.page, "extra n-pages %u for bigdata-node (%zu bytes)", poor_page(lp.page,
"extra n-pages %u for bigdata-node (%zu bytes)",
lp.page->mp_pages, dsize); lp.page->mp_pages, dsize);
} }
} }