mdbx: refine internal debug facilities.

Change-Id: I934cb8587f07c59268b16a0dd99daeb7ac440e62
This commit is contained in:
Leonid Yuriev
2019-09-24 02:07:00 +03:00
parent a0025d84fd
commit 40ee895aae
11 changed files with 305 additions and 282 deletions

View File

@@ -812,7 +812,7 @@ __cold static int uniq_check(const mdbx_mmap_t *pending, MDBX_env **found) {
if (err == MDBX_RESULT_TRUE) {
err = uniq_poke(pending, &scan->me_lck_mmap, &salt);
*found = scan;
mdbx_info("<< uniq-probe: found %p", *found);
mdbx_verbose("<< uniq-probe: found %p", *found);
return MDBX_RESULT_FALSE;
}
if (unlikely(err != MDBX_SUCCESS)) {
@@ -821,7 +821,7 @@ __cold static int uniq_check(const mdbx_mmap_t *pending, MDBX_env **found) {
}
}
mdbx_info("<< uniq-probe: unique");
mdbx_verbose("<< uniq-probe: unique");
return MDBX_RESULT_TRUE;
}
@@ -1489,7 +1489,8 @@ static __inline void mdbx_dpl_clear(MDBX_DPL dl) {
/*----------------------------------------------------------------------------*/
#ifndef MDBX_ALLOY
int mdbx_runtime_flags = MDBX_RUNTIME_FLAGS_INIT;
uint8_t mdbx_runtime_flags = MDBX_RUNTIME_FLAGS_INIT;
uint8_t mdbx_loglevel = MDBX_DEBUG;
MDBX_debug_func *mdbx_debug_logger;
#endif /* MDBX_ALLOY */
@@ -1750,13 +1751,13 @@ const char *mdbx_strerror_ANSI2OEM(int errnum) {
static txnid_t mdbx_oomkick(MDBX_env *env, const txnid_t laggard);
void __cold mdbx_debug_log(int type, const char *function, int line,
void __cold mdbx_debug_log(int level, const char *function, int line,
const char *fmt, ...) {
va_list args;
va_start(args, fmt);
if (mdbx_debug_logger)
mdbx_debug_logger(type, function, line, fmt, args);
mdbx_debug_logger(level, function, line, fmt, args);
else {
#if defined(_WIN32) || defined(_WIN64)
if (IsDebuggerPresent()) {
@@ -1794,7 +1795,8 @@ void __cold mdbx_debug_log(int type, const char *function, int line,
}
/* Dump a key in ascii or hexadecimal. */
char *mdbx_dkey(const MDBX_val *key, char *const buf, const size_t bufsize) {
char *mdbx_dump_val(const MDBX_val *key, char *const buf,
const size_t bufsize) {
if (!key)
return "<null>";
if (!buf || bufsize < 4)
@@ -1835,7 +1837,9 @@ char *mdbx_dkey(const MDBX_val *key, char *const buf, const size_t bufsize) {
return buf;
}
#if 0 /* LY: debug stuff */
/*------------------------------------------------------------------------------
LY: debug stuff */
static const char *mdbx_leafnode_type(MDBX_node *n) {
static char *const tp[2][2] = {{"", ": DB"}, {": sub-page", ": sub-DB"}};
return F_ISSET(n->mn_flags, F_BIGDATA) ? ": overflow page"
@@ -1844,7 +1848,7 @@ static const char *mdbx_leafnode_type(MDBX_node *n) {
}
/* Display all the keys in the page. */
static void mdbx_page_list(MDBX_page *mp) {
static __maybe_unused void mdbx_page_list(MDBX_page *mp) {
pgno_t pgno = mp->mp_pgno;
const char *type, *state = IS_DIRTY(mp) ? ", dirty" : "";
MDBX_node *node;
@@ -1870,55 +1874,55 @@ static void mdbx_page_list(MDBX_page *mp) {
type = "Leaf2 sub-page";
break;
case P_OVERFLOW:
mdbx_print("Overflow page %" PRIu64 " pages %u%s\n", pgno, mp->mp_pages,
state);
mdbx_verbose("Overflow page %" PRIaPGNO " pages %u%s\n", pgno, mp->mp_pages,
state);
return;
case P_META:
mdbx_print("Meta-page %" PRIaPGNO " txnid %" PRIu64 "\n", pgno,
((MDBX_meta *)PAGEDATA(mp))->mm_txnid_a.inconsistent);
mdbx_verbose("Meta-page %" PRIaPGNO " txnid %" PRIu64 "\n", pgno,
((MDBX_meta *)PAGEDATA(mp))->mm_txnid_a.inconsistent);
return;
default:
mdbx_print("Bad page %" PRIu64 " flags 0x%X\n", pgno, mp->mp_flags);
mdbx_verbose("Bad page %" PRIaPGNO " flags 0x%X\n", pgno, mp->mp_flags);
return;
}
nkeys = NUMKEYS(mp);
mdbx_print("%s %" PRIu64 " numkeys %u%s\n", type, pgno, nkeys, state);
mdbx_verbose("%s %" PRIaPGNO " numkeys %u%s\n", type, pgno, nkeys, state);
for (i = 0; i < nkeys; i++) {
if (IS_LEAF2(mp)) { /* LEAF2 pages have no mp_ptrs[] or node headers */
key.iov_len = nsize = mp->mp_leaf2_ksize;
key.iov_base = LEAF2KEY(mp, i, nsize);
total += nsize;
mdbx_print("key %u: nsize %u, %s\n", i, nsize, DKEY(&key));
mdbx_verbose("key %u: nsize %u, %s\n", i, nsize, DKEY(&key));
continue;
}
node = NODEPTR(mp, i);
key.iov_len = node->mn_ksize;
key.iov_base = node->mn_data;
nsize = NODESIZE + key.iov_len;
nsize = (unsigned)(NODESIZE + key.iov_len);
if (IS_BRANCH(mp)) {
mdbx_print("key %u: page %" PRIu64 ", %s\n", i, NODEPGNO(node),
DKEY(&key));
mdbx_verbose("key %u: page %" PRIaPGNO ", %s\n", i, NODEPGNO(node),
DKEY(&key));
total += nsize;
} else {
if (F_ISSET(node->mn_flags, F_BIGDATA))
nsize += sizeof(pgno_t);
else
nsize += NODEDSZ(node);
nsize += (unsigned)NODEDSZ(node);
total += nsize;
nsize += sizeof(indx_t);
mdbx_print("key %u: nsize %u, %s%s\n", i, nsize, DKEY(&key),
mdbx_leafnode_type(node));
mdbx_verbose("key %u: nsize %u, %s%s\n", i, nsize, DKEY(&key),
mdbx_leafnode_type(node));
}
total = EVEN(total);
}
mdbx_print("Total: header %u + contents %u + unused %u\n",
IS_LEAF2(mp) ? PAGEHDRSZ : PAGEHDRSZ + mp->mp_lower, total,
SIZELEFT(mp));
mdbx_verbose("Total: header %u + contents %u + unused %u\n",
IS_LEAF2(mp) ? PAGEHDRSZ : PAGEHDRSZ + mp->mp_lower, total,
SIZELEFT(mp));
}
static void mdbx_cursor_chk(MDBX_cursor *mc) {
static __maybe_unused void mdbx_cursor_chk(MDBX_cursor *mc) {
unsigned i;
MDBX_node *node;
MDBX_page *mp;
@@ -1929,19 +1933,20 @@ static void mdbx_cursor_chk(MDBX_cursor *mc) {
mp = mc->mc_pg[i];
node = NODEPTR(mp, mc->mc_ki[i]);
if (unlikely(NODEPGNO(node) != mc->mc_pg[i + 1]->mp_pgno))
mdbx_print("oops!\n");
mdbx_verbose("oops!\n");
}
if (unlikely(mc->mc_ki[i] >= NUMKEYS(mc->mc_pg[i])))
mdbx_print("ack!\n");
mdbx_verbose("ack!\n");
if (XCURSOR_INITED(mc)) {
node = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
if (((node->mn_flags & (F_DUPDATA | F_SUBDATA)) == F_DUPDATA) &&
mc->mc_xcursor->mx_cursor.mc_pg[0] != NODEDATA(node)) {
mdbx_print("blah!\n");
mdbx_verbose("blah!\n");
}
}
}
#endif /* 0 */
/*----------------------------------------------------------------------------*/
int mdbx_cmp(MDBX_txn *txn, MDBX_dbi dbi, const MDBX_val *a,
const MDBX_val *b) {
@@ -2080,8 +2085,8 @@ static __must_check_result int mdbx_refund_loose(MDBX_txn *txn) {
link = &NEXT_LOOSE_PAGE(*link);
} else {
*link = NEXT_LOOSE_PAGE(mp);
mdbx_info("refund loose-page: %" PRIaPGNO " -> %" PRIaPGNO,
txn->mt_next_pgno, mp->mp_pgno);
mdbx_verbose("refund loose-page: %" PRIaPGNO " -> %" PRIaPGNO,
txn->mt_next_pgno, mp->mp_pgno);
txn->mt_next_pgno = mp->mp_pgno;
if (txn->mt_rw_dirtylist) {
MDBX_page *dp = mdbx_dpl_remove(txn->mt_rw_dirtylist, mp->mp_pgno);
@@ -2659,10 +2664,10 @@ __cold static int mdbx_mapresize(MDBX_env *env, const pgno_t size_pgno,
const size_t limit_bytes = pgno_align2os_bytes(env, limit_pgno);
const size_t size_bytes = pgno_align2os_bytes(env, size_pgno);
mdbx_info("resize datafile/mapping: "
"present %" PRIuPTR " -> %" PRIuPTR ", "
"limit %" PRIuPTR " -> %" PRIuPTR,
env->me_dbgeo.now, size_bytes, env->me_dbgeo.upper, limit_bytes);
mdbx_verbose("resize datafile/mapping: "
"present %" PRIuPTR " -> %" PRIuPTR ", "
"limit %" PRIuPTR " -> %" PRIuPTR,
env->me_dbgeo.now, size_bytes, env->me_dbgeo.upper, limit_bytes);
mdbx_assert(env, limit_bytes >= size_bytes);
mdbx_assert(env, bytes2pgno(env, size_bytes) == size_pgno);
@@ -2990,7 +2995,7 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
}
env->me_last_reclaimed = last;
if (mdbx_debug_enabled(MDBX_DBG_EXTRA)) {
if (mdbx_log_enabled(MDBX_LOG_EXTRA)) {
mdbx_debug_extra("PNL read txn %" PRIaTXN " root %" PRIaPGNO
" num %u, PNL",
last, txn->mt_dbs[FREE_DBI].md_root, repg_pos);
@@ -3035,8 +3040,9 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
*move = *higest;
#endif /* MDBX_PNL sort-order */
MDBX_PNL_SIZE(repg_list) = repg_len;
mdbx_info("refunded %" PRIaPGNO " pages: %" PRIaPGNO " -> %" PRIaPGNO,
tail - txn->mt_next_pgno, tail, txn->mt_next_pgno);
mdbx_verbose("refunded %" PRIaPGNO " pages: %" PRIaPGNO
" -> %" PRIaPGNO,
tail - txn->mt_next_pgno, tail, txn->mt_next_pgno);
txn->mt_next_pgno = tail;
mdbx_tassert(txn, mdbx_pnl_check(env->me_reclaimed_pglist, true));
}
@@ -3130,8 +3136,9 @@ static int mdbx_page_alloc(MDBX_cursor *mc, unsigned num, MDBX_page **mp,
aligned = head->mm_geo.upper;
mdbx_assert(env, aligned > txn->mt_end_pgno);
mdbx_info("try growth datafile to %" PRIaPGNO " pages (+%" PRIaPGNO ")",
aligned, aligned - txn->mt_end_pgno);
mdbx_verbose("try growth datafile to %" PRIaPGNO " pages (+%" PRIaPGNO
")",
aligned, aligned - txn->mt_end_pgno);
rc = mdbx_mapresize(env, aligned, head->mm_geo.upper);
if (rc == MDBX_SUCCESS) {
mdbx_tassert(env->me_txn, txn->mt_end_pgno >= next);
@@ -4724,7 +4731,7 @@ retry:
for (pgno_t *move = begin; higest < end; ++move, ++higest)
*move = *higest;
#endif /* MDBX_PNL sort-order */
mdbx_info(
mdbx_verbose(
"%s.refunded %" PRIaPGNO " pages: %" PRIaPGNO " -> %" PRIaPGNO,
dbg_prefix_mode, txn->mt_next_pgno - tail, tail, txn->mt_next_pgno);
txn->mt_next_pgno = tail;
@@ -4767,7 +4774,7 @@ retry:
mdbx_trace("%s.put-retired #%u @ %" PRIaTXN, dbg_prefix_mode,
retired_stored, txn->mt_txnid);
if (mdbx_debug_enabled(MDBX_DBG_EXTRA)) {
if (mdbx_log_enabled(MDBX_LOG_EXTRA)) {
unsigned i = retired_stored;
mdbx_debug_extra("PNL write txn %" PRIaTXN " root %" PRIaPGNO
" num %u, PNL",
@@ -5619,7 +5626,7 @@ static int __cold mdbx_read_header(MDBX_env *env, MDBX_meta *meta,
if (memcmp(&page, &again, sizeof(page)) == 0 || --retryleft == 0)
break;
mdbx_info("meta[%u] was updated, re-read it", meta_number);
mdbx_verbose("meta[%u] was updated, re-read it", meta_number);
}
if (page.mp_meta.mm_magic_and_version != MDBX_DATA_MAGIC &&
@@ -5660,8 +5667,8 @@ static int __cold mdbx_read_header(MDBX_env *env, MDBX_meta *meta,
if (meta_number == 0 && guess_pagesize != page.mp_meta.mm_psize) {
meta->mm_psize = page.mp_meta.mm_psize;
mdbx_info("meta[%u] took pagesize %u", meta_number,
page.mp_meta.mm_psize);
mdbx_verbose("meta[%u] took pagesize %u", meta_number,
page.mp_meta.mm_psize);
}
if (safe64_read(&page.mp_meta.mm_txnid_a) !=
@@ -5836,7 +5843,7 @@ static int __cold mdbx_read_header(MDBX_env *env, MDBX_meta *meta,
*meta = page.mp_meta;
if (META_IS_WEAK(meta))
loop_limit += 1; /* LY: should re-read to hush race with update */
mdbx_info("latch meta[%u]", meta_number);
mdbx_verbose("latch meta[%u]", meta_number);
}
}
@@ -6167,8 +6174,8 @@ static int mdbx_sync_locked(MDBX_env *env, unsigned flags,
/* LY: shrink datafile if needed */
if (unlikely(shrink)) {
mdbx_info("shrink to %" PRIaPGNO " pages (-%" PRIaPGNO ")",
pending->mm_geo.now, shrink);
mdbx_verbose("shrink to %" PRIaPGNO " pages (-%" PRIaPGNO ")",
pending->mm_geo.now, shrink);
rc = mdbx_mapresize(env, pending->mm_geo.now, pending->mm_geo.upper);
if (MDBX_IS_ERROR(rc))
goto fail;
@@ -6302,9 +6309,9 @@ static int __cold mdbx_env_map(MDBX_env *env, const int is_exclusive,
#if defined(MADV_DODUMP) && defined(MADV_DONTDUMP)
const size_t meta_length = pgno2bytes(env, NUM_METAS);
(void)madvise(env->me_map, meta_length, MADV_DODUMP);
if ((env->me_flags & MDBX_PAGEPERTURB) == 0)
(void)madvise(env->me_map + meta_length, env->me_mapsize - meta_length,
MADV_DONTDUMP);
(void)madvise(env->me_map + meta_length, env->me_mapsize - meta_length,
(mdbx_runtime_flags & MDBX_DBG_DUMP) ? MADV_DODUMP
: MADV_DONTDUMP);
#endif
if (is_exclusive && (env->me_flags & MDBX_WRITEMAP) != 0) {
@@ -6787,13 +6794,13 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
#endif
}
mdbx_info("header: root %" PRIaPGNO "/%" PRIaPGNO ", geo %" PRIaPGNO
"/%" PRIaPGNO "-%" PRIaPGNO "/%" PRIaPGNO
" +%u -%u, txn_id %" PRIaTXN ", %s",
meta.mm_dbs[MAIN_DBI].md_root, meta.mm_dbs[FREE_DBI].md_root,
meta.mm_geo.lower, meta.mm_geo.next, meta.mm_geo.now,
meta.mm_geo.upper, meta.mm_geo.grow, meta.mm_geo.shrink,
meta.mm_txnid_a.inconsistent, mdbx_durable_str(&meta));
mdbx_verbose("header: root %" PRIaPGNO "/%" PRIaPGNO ", geo %" PRIaPGNO
"/%" PRIaPGNO "-%" PRIaPGNO "/%" PRIaPGNO
" +%u -%u, txn_id %" PRIaTXN ", %s",
meta.mm_dbs[MAIN_DBI].md_root, meta.mm_dbs[FREE_DBI].md_root,
meta.mm_geo.lower, meta.mm_geo.next, meta.mm_geo.now,
meta.mm_geo.upper, meta.mm_geo.grow, meta.mm_geo.shrink,
meta.mm_txnid_a.inconsistent, mdbx_durable_str(&meta));
mdbx_setup_pagesize(env, meta.mm_psize);
const size_t used_bytes = pgno2bytes(env, meta.mm_geo.next);
@@ -6850,13 +6857,13 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
meta.mm_geo.grow = (uint16_t)bytes2pgno(env, env->me_dbgeo.grow);
meta.mm_geo.shrink = (uint16_t)bytes2pgno(env, env->me_dbgeo.shrink);
mdbx_info("amended: root %" PRIaPGNO "/%" PRIaPGNO ", geo %" PRIaPGNO
"/%" PRIaPGNO "-%" PRIaPGNO "/%" PRIaPGNO
" +%u -%u, txn_id %" PRIaTXN ", %s",
meta.mm_dbs[MAIN_DBI].md_root, meta.mm_dbs[FREE_DBI].md_root,
meta.mm_geo.lower, meta.mm_geo.next, meta.mm_geo.now,
meta.mm_geo.upper, meta.mm_geo.grow, meta.mm_geo.shrink,
meta.mm_txnid_a.inconsistent, mdbx_durable_str(&meta));
mdbx_verbose("amended: root %" PRIaPGNO "/%" PRIaPGNO ", geo %" PRIaPGNO
"/%" PRIaPGNO "-%" PRIaPGNO "/%" PRIaPGNO
" +%u -%u, txn_id %" PRIaTXN ", %s",
meta.mm_dbs[MAIN_DBI].md_root, meta.mm_dbs[FREE_DBI].md_root,
meta.mm_geo.lower, meta.mm_geo.next, meta.mm_geo.now,
meta.mm_geo.upper, meta.mm_geo.grow, meta.mm_geo.shrink,
meta.mm_txnid_a.inconsistent, mdbx_durable_str(&meta));
}
mdbx_ensure(env, meta.mm_geo.now >= meta.mm_geo.next);
} else {
@@ -6874,12 +6881,12 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
mdbx_ensure(env, expected_bytes >= used_bytes);
if (filesize_before_mmap != expected_bytes) {
if (lck_rc != /* lck exclusive */ MDBX_RESULT_TRUE) {
mdbx_info("filesize mismatch (expect %" PRIuPTR "/%" PRIaPGNO
", have %" PRIu64 "/%" PRIaPGNO "), "
"assume collision in non-exclusive mode",
expected_bytes, bytes2pgno(env, expected_bytes),
filesize_before_mmap,
bytes2pgno(env, (size_t)filesize_before_mmap));
mdbx_verbose("filesize mismatch (expect %" PRIuPTR "/%" PRIaPGNO
", have %" PRIu64 "/%" PRIaPGNO "), "
"assume collision in non-exclusive mode",
expected_bytes, bytes2pgno(env, expected_bytes),
filesize_before_mmap,
bytes2pgno(env, (size_t)filesize_before_mmap));
} else {
mdbx_notice("filesize mismatch (expect %" PRIuSIZE "/%" PRIaPGNO
", have %" PRIu64 "/%" PRIaPGNO ")",
@@ -6901,8 +6908,9 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
}
mdbx_notice("ignore filesize mismatch in readonly-mode");
} else {
mdbx_info("resize datafile to %" PRIuSIZE " bytes, %" PRIaPGNO " pages",
expected_bytes, bytes2pgno(env, expected_bytes));
mdbx_verbose("resize datafile to %" PRIuSIZE " bytes, %" PRIaPGNO
" pages",
expected_bytes, bytes2pgno(env, expected_bytes));
err = mdbx_ftruncate(env->me_fd, expected_bytes);
if (unlikely(err != MDBX_SUCCESS)) {
mdbx_error("error %d, while resize datafile to %" PRIuSIZE
@@ -6999,7 +7007,7 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
/* LY: assume just have a collision with other running process,
* or someone make a weak checkpoint */
mdbx_info("assume collision or online weak checkpoint");
mdbx_verbose("assume collision or online weak checkpoint");
break;
}
@@ -7012,50 +7020,51 @@ static int __cold mdbx_setup_dxb(MDBX_env *env, const int lck_rc) {
return err;
if (filesize_after_mmap != expected_bytes) {
if (filesize_after_mmap != filesize_before_mmap)
mdbx_info("datafile resized by system to %" PRIu64 " bytes",
filesize_after_mmap);
mdbx_verbose("datafile resized by system to %" PRIu64 " bytes",
filesize_after_mmap);
if (filesize_after_mmap % env->me_os_psize ||
filesize_after_mmap > env->me_dbgeo.upper ||
filesize_after_mmap < used_bytes) {
mdbx_info("unacceptable/unexpected datafile size %" PRIu64,
filesize_after_mmap);
mdbx_verbose("unacceptable/unexpected datafile size %" PRIu64,
filesize_after_mmap);
return MDBX_PROBLEM;
}
if ((env->me_flags & MDBX_RDONLY) == 0) {
meta.mm_geo.now =
bytes2pgno(env, env->me_dbgeo.now = (size_t)filesize_after_mmap);
mdbx_info("update meta-geo to filesize %" PRIuPTR " bytes, %" PRIaPGNO
" pages",
env->me_dbgeo.now, meta.mm_geo.now);
mdbx_verbose("update meta-geo to filesize %" PRIuPTR
" bytes, %" PRIaPGNO " pages",
env->me_dbgeo.now, meta.mm_geo.now);
}
}
if (memcmp(&meta.mm_geo, &head->mm_geo, sizeof(meta.mm_geo))) {
const txnid_t txnid = mdbx_meta_txnid_stable(env, head);
mdbx_info("updating meta.geo: "
"from l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN "), "
"to l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN ")",
head->mm_geo.lower, head->mm_geo.now, head->mm_geo.upper,
head->mm_geo.shrink, head->mm_geo.grow, txnid,
meta.mm_geo.lower, meta.mm_geo.now, meta.mm_geo.upper,
meta.mm_geo.shrink, meta.mm_geo.grow, txnid + 1);
mdbx_verbose("updating meta.geo: "
"from l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN "), "
"to l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN ")",
head->mm_geo.lower, head->mm_geo.now, head->mm_geo.upper,
head->mm_geo.shrink, head->mm_geo.grow, txnid,
meta.mm_geo.lower, meta.mm_geo.now, meta.mm_geo.upper,
meta.mm_geo.shrink, meta.mm_geo.grow, txnid + 1);
mdbx_ensure(env, mdbx_meta_eq(env, &meta, head));
mdbx_meta_set_txnid(env, &meta, txnid + 1);
*env->me_unsynced_pages += 1;
err = mdbx_sync_locked(env, env->me_flags | MDBX_SHRINK_ALLOWED, &meta);
if (err) {
mdbx_info("error %d, while updating meta.geo: "
"from l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN "), "
"to l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN ")",
err, head->mm_geo.lower, head->mm_geo.now, head->mm_geo.upper,
head->mm_geo.shrink, head->mm_geo.grow, txnid,
meta.mm_geo.lower, meta.mm_geo.now, meta.mm_geo.upper,
meta.mm_geo.shrink, meta.mm_geo.grow, txnid + 1);
mdbx_verbose("error %d, while updating meta.geo: "
"from l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN "), "
"to l%" PRIaPGNO "-n%" PRIaPGNO "-u%" PRIaPGNO
"/s%u-g%u (txn#%" PRIaTXN ")",
err, head->mm_geo.lower, head->mm_geo.now,
head->mm_geo.upper, head->mm_geo.shrink, head->mm_geo.grow,
txnid, meta.mm_geo.lower, meta.mm_geo.now,
meta.mm_geo.upper, meta.mm_geo.shrink, meta.mm_geo.grow,
txnid + 1);
return err;
}
}
@@ -10596,7 +10605,7 @@ static int mdbx_update_key(MDBX_cursor *mc, const MDBX_val *key) {
k2.iov_base = NODEKEY(node);
k2.iov_len = node->mn_ksize;
mdbx_debug("update key %u (ofs %u) [%s] to [%s] on page %" PRIaPGNO, indx,
ptr, mdbx_dkey(&k2, kbuf2, sizeof(kbuf2)), DKEY(key),
ptr, mdbx_dump_val(&k2, kbuf2, sizeof(kbuf2)), DKEY(key),
mp->mp_pgno);
}
@@ -13753,15 +13762,22 @@ int __cold mdbx_reader_check0(MDBX_env *env, int rdt_locked, int *dead) {
return rc;
}
int __cold mdbx_setup_debug(int flags, MDBX_debug_func *logger) {
const int rc = mdbx_runtime_flags;
int __cold mdbx_setup_debug(int loglevel, int flags, MDBX_debug_func *logger) {
const int rc = mdbx_runtime_flags | (mdbx_loglevel << 16);
#if !MDBX_DEBUG
(void)loglevel;
#else
if (loglevel != -1)
mdbx_loglevel = (uint8_t)loglevel;
#endif
if (flags != -1) {
#if !MDBX_DEBUG
flags &= MDBX_DBG_DUMP | MDBX_DBG_LEGACY_MULTIOPEN;
#else
flags &= MDBX_DBG_ASSERT | MDBX_DBG_PRINT | MDBX_DBG_TRACE |
MDBX_DBG_EXTRA | MDBX_DBG_AUDIT | MDBX_DBG_JITTER | MDBX_DBG_DUMP |
MDBX_DBG_LEGACY_MULTIOPEN;
flags &= MDBX_DBG_ASSERT | MDBX_DBG_AUDIT | MDBX_DBG_JITTER |
MDBX_DBG_DUMP | MDBX_DBG_LEGACY_MULTIOPEN;
#endif
#if defined(__linux__) || defined(__gnu_linux__)
if ((mdbx_runtime_flags ^ flags) & MDBX_DBG_DUMP) {
@@ -13793,7 +13809,7 @@ int __cold mdbx_setup_debug(int flags, MDBX_debug_func *logger) {
}
}
#endif /* Linux */
mdbx_runtime_flags = flags;
mdbx_runtime_flags = (uint8_t)flags;
}
if (-1 != (intptr_t)logger)

View File

@@ -987,12 +987,13 @@ typedef struct MDBX_ntxn {
/* Debug and Logging stuff */
#define MDBX_RUNTIME_FLAGS_INIT \
(MDBX_DBG_PRINT | ((MDBX_DEBUG) > 0) * MDBX_DBG_ASSERT | \
((MDBX_DEBUG) > 1) * MDBX_DBG_AUDIT | ((MDBX_DEBUG) > 2) * MDBX_DBG_TRACE | \
((MDBX_DEBUG) > 3) * MDBX_DBG_EXTRA)
((MDBX_DEBUG) > 0) * MDBX_DBG_ASSERT + ((MDBX_DEBUG) > 1) * MDBX_DBG_AUDIT
#ifndef mdbx_runtime_flags /* avoid override from tools */
MDBX_INTERNAL_VAR int mdbx_runtime_flags;
MDBX_INTERNAL_VAR uint8_t mdbx_runtime_flags;
#endif
#ifndef mdbx_runtime_flags /* avoid override from tools */
MDBX_INTERNAL_VAR uint8_t mdbx_loglevel;
#endif
MDBX_INTERNAL_VAR MDBX_debug_func *mdbx_debug_logger;
@@ -1008,100 +1009,99 @@ MDBX_INTERNAL_FUNC void mdbx_panic(const char *fmt, ...) __printf_args(1, 2);
#define mdbx_audit_enabled() unlikely(mdbx_runtime_flags &MDBX_DBG_AUDIT)
#define mdbx_debug_enabled(type) \
unlikely(mdbx_runtime_flags &(type & (MDBX_DBG_TRACE | MDBX_DBG_EXTRA)))
#ifdef MDBX_LOGLEVEL_BUILD
#define mdbx_log_enabled(msg) \
(msg <= MDBX_LOGLEVEL_BUILD && unlikely(msg <= mdbx_loglevel))
#else
#define mdbx_debug_enabled(type) (0)
#define mdbx_log_enabled(msg) unlikely(msg <= mdbx_loglevel)
#endif /* MDBX_LOGLEVEL_BUILD */
#else /* MDBX_DEBUG */
#define mdbx_audit_enabled() (0)
#if !defined(NDEBUG) || defined(MDBX_FORCE_ASSERT)
#define mdbx_assert_enabled() (1)
#else
#define mdbx_assert_enabled() (0)
#endif /* NDEBUG */
#ifdef MDBX_LOGLEVEL_BUILD
#define mdbx_log_enabled(msg) (msg <= MDBX_LOGLEVEL_BUILD)
#else
#define mdbx_log_enabled(msg) (0)
#endif /* MDBX_LOGLEVEL_BUILD */
#endif /* MDBX_DEBUG */
MDBX_INTERNAL_FUNC void mdbx_assert_fail(const MDBX_env *env, const char *msg,
const char *func, int line);
#define mdbx_print(fmt, ...) \
mdbx_debug_log(MDBX_DBG_PRINT, NULL, 0, fmt, ##__VA_ARGS__)
#define mdbx_trace(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE)) \
mdbx_debug_log(MDBX_DBG_TRACE, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_verbose(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_info(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_notice(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_warning(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_error(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_fatal(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE /* FIXME */)) \
mdbx_debug_log(MDBX_DBG_TRACE /* FIXME */, __FUNCTION__, __LINE__, \
fmt "\n", ##__VA_ARGS__); \
} while (0)
#define mdbx_debug(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE)) \
mdbx_debug_log(MDBX_DBG_TRACE, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_debug_print(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_TRACE)) \
mdbx_debug_log(MDBX_DBG_TRACE, NULL, 0, fmt, ##__VA_ARGS__); \
} while (0)
#define mdbx_debug_extra(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_EXTRA)) \
mdbx_debug_log(MDBX_DBG_EXTRA, __FUNCTION__, __LINE__, fmt, \
if (mdbx_log_enabled(MDBX_LOG_EXTRA)) \
mdbx_debug_log(MDBX_LOG_EXTRA, __FUNCTION__, __LINE__, fmt, \
##__VA_ARGS__); \
} while (0)
#define mdbx_debug_extra_print(fmt, ...) \
do { \
if (mdbx_debug_enabled(MDBX_DBG_EXTRA)) \
mdbx_debug_log(MDBX_DBG_EXTRA, NULL, 0, fmt, ##__VA_ARGS__); \
if (mdbx_log_enabled(MDBX_LOG_EXTRA)) \
mdbx_debug_log(MDBX_LOG_EXTRA, NULL, 0, fmt, ##__VA_ARGS__); \
} while (0)
#define mdbx_trace(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_TRACE)) \
mdbx_debug_log(MDBX_LOG_TRACE, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_debug(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_DEBUG)) \
mdbx_debug_log(MDBX_LOG_DEBUG, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_debug_print(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_DEBUG)) \
mdbx_debug_log(MDBX_LOG_DEBUG, NULL, 0, fmt, ##__VA_ARGS__); \
} while (0)
#define mdbx_verbose(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_VERBOSE)) \
mdbx_debug_log(MDBX_LOG_VERBOSE, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_notice(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_NOTICE)) \
mdbx_debug_log(MDBX_LOG_NOTICE, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_warning(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_WARN)) \
mdbx_debug_log(MDBX_LOG_WARN, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_error(fmt, ...) \
do { \
if (mdbx_log_enabled(MDBX_LOG_ERROR)) \
mdbx_debug_log(MDBX_LOG_ERROR, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__); \
} while (0)
#define mdbx_fatal(fmt, ...) \
mdbx_debug_log(MDBX_LOG_FATAL, __FUNCTION__, __LINE__, fmt "\n", \
##__VA_ARGS__);
#define mdbx_ensure_msg(env, expr, msg) \
do { \
if (unlikely(!(expr))) \
@@ -1156,9 +1156,9 @@ MDBX_INTERNAL_FUNC void mdbx_rthc_thread_dtor(void *ptr);
#if MDBX_DEBUG
#define DKBUF char _kbuf[DKBUF_MAXKEYSIZE * 4 + 2]
#define DKEY(x) mdbx_dkey(x, _kbuf, DKBUF_MAXKEYSIZE * 2 + 1)
#define DKEY(x) mdbx_dump_val(x, _kbuf, DKBUF_MAXKEYSIZE * 2 + 1)
#define DVAL(x) \
mdbx_dkey(x, _kbuf + DKBUF_MAXKEYSIZE * 2 + 1, DKBUF_MAXKEYSIZE * 2 + 1)
mdbx_dump_val(x, _kbuf + DKBUF_MAXKEYSIZE * 2 + 1, DKBUF_MAXKEYSIZE * 2 + 1)
#else
#define DKBUF ((void)(0))
#define DKEY(x) ("-")

View File

@@ -318,7 +318,7 @@ MDBX_INTERNAL_FUNC int __cold mdbx_lck_destroy(MDBX_env *env,
lck_op(env->me_lfd, op_setlk, F_WRLCK, 0, OFF_T_MAX) == 0 &&
lck_op(env->me_fd, op_setlk,
(env->me_flags & MDBX_RDONLY) ? F_RDLCK : F_WRLCK, 0, OFF_T_MAX)) {
mdbx_info("%s: got exclusive, drown mutexes", mdbx_func_);
mdbx_verbose("%s: got exclusive, drown mutexes", mdbx_func_);
rc = pthread_mutex_destroy(&env->me_lck->mti_rmutex);
if (rc == 0)
rc = pthread_mutex_destroy(&env->me_lck->mti_wmutex);

View File

@@ -211,7 +211,7 @@ MDBX_INTERNAL_FUNC void __cold mdbx_assert_fail(const MDBX_env *env,
#endif /* MDBX_DEBUG */
if (mdbx_debug_logger)
mdbx_debug_log(MDBX_DBG_ASSERT, func, line, "assert: %s\n", msg);
mdbx_debug_log(MDBX_LOG_FATAL, func, line, "assert: %s\n", msg);
else {
#if defined(_WIN32) || defined(_WIN64)
char *message = nullptr;