mirror of
https://github.com/isar/libmdbx.git
synced 2025-11-07 07:18:56 +08:00
mdbx: новые настройки clang-format (косметика).
This commit is contained in:
76
src/walk.c
76
src/walk.c
@@ -41,19 +41,16 @@ static page_type_t walk_subpage_type(const page_t *sp) {
|
||||
}
|
||||
|
||||
/* Depth-first tree traversal. */
|
||||
__cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
txnid_t parent_txnid) {
|
||||
__cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno, txnid_t parent_txnid) {
|
||||
assert(pgno != P_INVALID);
|
||||
page_t *mp = nullptr;
|
||||
int err = page_get(ctx->cursor, pgno, &mp, parent_txnid);
|
||||
|
||||
const page_type_t type = walk_page_type(mp);
|
||||
const size_t nentries = mp ? page_numkeys(mp) : 0;
|
||||
size_t header_size =
|
||||
(mp && !is_dupfix_leaf(mp)) ? PAGEHDRSZ + mp->lower : PAGEHDRSZ;
|
||||
size_t header_size = (mp && !is_dupfix_leaf(mp)) ? PAGEHDRSZ + mp->lower : PAGEHDRSZ;
|
||||
size_t payload_size = 0;
|
||||
size_t unused_size =
|
||||
(mp ? page_room(mp) : ctx->txn->env->ps - header_size) - payload_size;
|
||||
size_t unused_size = (mp ? page_room(mp) : ctx->txn->env->ps - header_size) - payload_size;
|
||||
size_t align_bytes = 0;
|
||||
|
||||
for (size_t i = 0; err == MDBX_SUCCESS && i < nentries; ++i) {
|
||||
@@ -89,12 +86,10 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
assert(err == MDBX_SUCCESS);
|
||||
pgr_t lp = page_get_large(ctx->cursor, large_pgno, mp->txnid);
|
||||
const size_t npages =
|
||||
((err = lp.err) == MDBX_SUCCESS) ? lp.page->pages : 1;
|
||||
const size_t npages = ((err = lp.err) == MDBX_SUCCESS) ? lp.page->pages : 1;
|
||||
const size_t pagesize = pgno2bytes(ctx->txn->env, npages);
|
||||
const size_t over_unused = pagesize - over_payload - over_header;
|
||||
const int rc = ctx->visitor(large_pgno, npages, ctx->userctx, ctx->deep,
|
||||
tbl, pagesize, page_large, err, 1,
|
||||
const int rc = ctx->visitor(large_pgno, npages, ctx->userctx, ctx->deep, tbl, pagesize, page_large, err, 1,
|
||||
over_payload, over_header, over_unused);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return (rc == MDBX_RESULT_TRUE) ? MDBX_SUCCESS : rc;
|
||||
@@ -104,8 +99,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
case N_TREE /* sub-db */: {
|
||||
if (unlikely(node_data_size != sizeof(tree_t))) {
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid table node size", (unsigned)node_data_size);
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid table node size", (unsigned)node_data_size);
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
}
|
||||
@@ -115,8 +109,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
case N_TREE | N_DUP /* dupsorted sub-tree */:
|
||||
if (unlikely(node_data_size != sizeof(tree_t))) {
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid sub-tree node size", (unsigned)node_data_size);
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid sub-tree node size", (unsigned)node_data_size);
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
}
|
||||
@@ -126,8 +119,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
case N_DUP /* short sub-page */: {
|
||||
if (unlikely(node_data_size <= PAGEHDRSZ || (node_data_size & 1))) {
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid sub-page node size", (unsigned)node_data_size);
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid sub-page node size", (unsigned)node_data_size);
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
break;
|
||||
@@ -137,14 +129,12 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
const page_type_t subtype = walk_subpage_type(sp);
|
||||
const size_t nsubkeys = page_numkeys(sp);
|
||||
if (unlikely(subtype == page_sub_broken)) {
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid sub-page flags", sp->flags);
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid sub-page flags", sp->flags);
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
}
|
||||
|
||||
size_t subheader_size =
|
||||
is_dupfix_leaf(sp) ? PAGEHDRSZ : PAGEHDRSZ + sp->lower;
|
||||
size_t subheader_size = is_dupfix_leaf(sp) ? PAGEHDRSZ : PAGEHDRSZ + sp->lower;
|
||||
size_t subunused_size = page_room(sp);
|
||||
size_t subpayload_size = 0;
|
||||
size_t subalign_bytes = 0;
|
||||
@@ -161,18 +151,15 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
subpayload_size += subnode_size;
|
||||
subalign_bytes += subnode_size & 1;
|
||||
if (unlikely(node_flags(subnode) != 0)) {
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"unexpected sub-node flags", node_flags(subnode));
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED, "unexpected sub-node flags", node_flags(subnode));
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const int rc =
|
||||
ctx->visitor(pgno, 0, ctx->userctx, ctx->deep + 1, tbl,
|
||||
node_data_size, subtype, err, nsubkeys, subpayload_size,
|
||||
subheader_size, subunused_size + subalign_bytes);
|
||||
const int rc = ctx->visitor(pgno, 0, ctx->userctx, ctx->deep + 1, tbl, node_data_size, subtype, err, nsubkeys,
|
||||
subpayload_size, subheader_size, subunused_size + subalign_bytes);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return (rc == MDBX_RESULT_TRUE) ? MDBX_SUCCESS : rc;
|
||||
header_size += subheader_size;
|
||||
@@ -182,16 +169,14 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
} break;
|
||||
|
||||
default:
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid node flags", node_flags(node));
|
||||
ERROR("%s/%d: %s 0x%x", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid node flags", node_flags(node));
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
}
|
||||
}
|
||||
|
||||
const int rc = ctx->visitor(
|
||||
pgno, 1, ctx->userctx, ctx->deep, tbl, ctx->txn->env->ps, type, err,
|
||||
nentries, payload_size, header_size, unused_size + align_bytes);
|
||||
const int rc = ctx->visitor(pgno, 1, ctx->userctx, ctx->deep, tbl, ctx->txn->env->ps, type, err, nentries,
|
||||
payload_size, header_size, unused_size + align_bytes);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return (rc == MDBX_RESULT_TRUE) ? MDBX_SUCCESS : rc;
|
||||
|
||||
@@ -220,8 +205,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
case N_TREE /* sub-db */:
|
||||
if (unlikely(node_ds(node) != sizeof(tree_t))) {
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid sub-tree node size", (unsigned)node_ds(node));
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid sub-tree node size", (unsigned)node_ds(node));
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
} else {
|
||||
@@ -238,8 +222,8 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
|
||||
case N_TREE | N_DUP /* dupsorted sub-tree */:
|
||||
if (unlikely(node_ds(node) != sizeof(tree_t))) {
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED,
|
||||
"invalid dupsort sub-tree node size", (unsigned)node_ds(node));
|
||||
ERROR("%s/%d: %s %u", "MDBX_CORRUPTED", MDBX_CORRUPTED, "invalid dupsort sub-tree node size",
|
||||
(unsigned)node_ds(node));
|
||||
assert(err == MDBX_CORRUPTED);
|
||||
err = MDBX_CORRUPTED;
|
||||
} else {
|
||||
@@ -248,8 +232,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
assert(err == MDBX_SUCCESS);
|
||||
err = cursor_dupsort_setup(ctx->cursor, node, mp);
|
||||
if (likely(err == MDBX_SUCCESS)) {
|
||||
assert(ctx->cursor->subcur ==
|
||||
&container_of(ctx->cursor, cursor_couple_t, outer)->inner);
|
||||
assert(ctx->cursor->subcur == &container_of(ctx->cursor, cursor_couple_t, outer)->inner);
|
||||
ctx->cursor = &ctx->cursor->subcur->cursor;
|
||||
ctx->deep += 1;
|
||||
tbl->nested = &aligned_db;
|
||||
@@ -257,8 +240,7 @@ __cold static int walk_pgno(walk_ctx_t *ctx, walk_tbl_t *tbl, const pgno_t pgno,
|
||||
tbl->nested = nullptr;
|
||||
ctx->deep -= 1;
|
||||
subcur_t *inner_xcursor = container_of(ctx->cursor, subcur_t, cursor);
|
||||
cursor_couple_t *couple =
|
||||
container_of(inner_xcursor, cursor_couple_t, inner);
|
||||
cursor_couple_t *couple = container_of(inner_xcursor, cursor_couple_t, inner);
|
||||
ctx->cursor = &couple->outer;
|
||||
}
|
||||
}
|
||||
@@ -280,30 +262,24 @@ __cold static int walk_tbl(walk_ctx_t *ctx, walk_tbl_t *tbl) {
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
|
||||
const uint8_t cursor_checking = (ctx->options & dont_check_keys_ordering)
|
||||
? z_pagecheck | z_ignord
|
||||
: z_pagecheck;
|
||||
const uint8_t cursor_checking = (ctx->options & dont_check_keys_ordering) ? z_pagecheck | z_ignord : z_pagecheck;
|
||||
couple.outer.checking |= cursor_checking;
|
||||
couple.inner.cursor.checking |= cursor_checking;
|
||||
couple.outer.next = ctx->cursor;
|
||||
couple.outer.top_and_flags = z_disable_tree_search_fastpath;
|
||||
ctx->cursor = &couple.outer;
|
||||
rc = walk_pgno(ctx, tbl, db->root,
|
||||
db->mod_txnid ? db->mod_txnid : ctx->txn->txnid);
|
||||
rc = walk_pgno(ctx, tbl, db->root, db->mod_txnid ? db->mod_txnid : ctx->txn->txnid);
|
||||
ctx->cursor = couple.outer.next;
|
||||
return rc;
|
||||
}
|
||||
|
||||
__cold int walk_pages(MDBX_txn *txn, walk_func *visitor, void *user,
|
||||
walk_options_t options) {
|
||||
__cold int walk_pages(MDBX_txn *txn, walk_func *visitor, void *user, walk_options_t options) {
|
||||
int rc = check_txn(txn, MDBX_TXN_BLOCKED);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
|
||||
walk_ctx_t ctx = {
|
||||
.txn = txn, .userctx = user, .visitor = visitor, .options = options};
|
||||
walk_tbl_t tbl = {.name = {.iov_base = MDBX_CHK_GC},
|
||||
.internal = &txn->dbs[FREE_DBI]};
|
||||
walk_ctx_t ctx = {.txn = txn, .userctx = user, .visitor = visitor, .options = options};
|
||||
walk_tbl_t tbl = {.name = {.iov_base = MDBX_CHK_GC}, .internal = &txn->dbs[FREE_DBI]};
|
||||
rc = walk_tbl(&ctx, &tbl);
|
||||
if (!MDBX_IS_ERROR(rc)) {
|
||||
tbl.name.iov_base = MDBX_CHK_MAIN;
|
||||
|
||||
Reference in New Issue
Block a user