mdbx: minor refactoring mdbx_cursor_set().

Change-Id: If3c984fb5ac2f77762501ac720080e2caaacac3c
This commit is contained in:
Leonid Yuriev 2021-04-18 00:49:38 +03:00
parent b59836e6d9
commit 3f6758e18d

View File

@ -13410,8 +13410,8 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
node = page_node(mp, 0); node = page_node(mp, 0);
get_key(node, &nodekey); get_key(node, &nodekey);
} }
ret.err = mc->mc_dbx->md_cmp(&aligned_key, &nodekey); int cmp = mc->mc_dbx->md_cmp(&aligned_key, &nodekey);
if (unlikely(ret.err == 0)) { if (unlikely(cmp == 0)) {
/* Probably happens rarely, but first node on the page /* Probably happens rarely, but first node on the page
* was the one we wanted. */ * was the one we wanted. */
mc->mc_ki[mc->mc_top] = 0; mc->mc_ki[mc->mc_top] = 0;
@ -13419,11 +13419,10 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
mdbx_cassert(mc, mc->mc_ki[mc->mc_top] < mdbx_cassert(mc, mc->mc_ki[mc->mc_top] <
page_numkeys(mc->mc_pg[mc->mc_top]) || page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
goto set1; goto got_node;
} }
if (ret.err > 0) { if (cmp > 0) {
const unsigned nkeys = page_numkeys(mp); const unsigned nkeys = page_numkeys(mp);
unsigned i;
if (nkeys > 1) { if (nkeys > 1) {
if (IS_LEAF2(mp)) { if (IS_LEAF2(mp)) {
nodekey.iov_base = page_leaf2key(mp, nkeys - 1, nodekey.iov_len); nodekey.iov_base = page_leaf2key(mp, nkeys - 1, nodekey.iov_len);
@ -13431,8 +13430,8 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
node = page_node(mp, nkeys - 1); node = page_node(mp, nkeys - 1);
get_key(node, &nodekey); get_key(node, &nodekey);
} }
ret.err = mc->mc_dbx->md_cmp(&aligned_key, &nodekey); cmp = mc->mc_dbx->md_cmp(&aligned_key, &nodekey);
if (ret.err == 0) { if (cmp == 0) {
/* last node was the one we wanted */ /* last node was the one we wanted */
mdbx_cassert(mc, nkeys >= 1 && nkeys <= UINT16_MAX + 1); mdbx_cassert(mc, nkeys >= 1 && nkeys <= UINT16_MAX + 1);
mc->mc_ki[mc->mc_top] = (indx_t)(nkeys - 1); mc->mc_ki[mc->mc_top] = (indx_t)(nkeys - 1);
@ -13440,9 +13439,9 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
mdbx_cassert(mc, mc->mc_ki[mc->mc_top] < mdbx_cassert(mc, mc->mc_ki[mc->mc_top] <
page_numkeys(mc->mc_pg[mc->mc_top]) || page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
goto set1; goto got_node;
} }
if (ret.err < 0) { if (cmp < 0) {
if (mc->mc_ki[mc->mc_top] < page_numkeys(mp)) { if (mc->mc_ki[mc->mc_top] < page_numkeys(mp)) {
/* This is definitely the right page, skip search_page */ /* This is definitely the right page, skip search_page */
if (IS_LEAF2(mp)) { if (IS_LEAF2(mp)) {
@ -13452,23 +13451,23 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
node = page_node(mp, mc->mc_ki[mc->mc_top]); node = page_node(mp, mc->mc_ki[mc->mc_top]);
get_key(node, &nodekey); get_key(node, &nodekey);
} }
ret.err = mc->mc_dbx->md_cmp(&aligned_key, &nodekey); cmp = mc->mc_dbx->md_cmp(&aligned_key, &nodekey);
if (ret.err == 0) { if (cmp == 0) {
/* current node was the one we wanted */ /* current node was the one we wanted */
ret.exact = true; ret.exact = true;
mdbx_cassert(mc, mc->mc_ki[mc->mc_top] < mdbx_cassert(mc, mc->mc_ki[mc->mc_top] <
page_numkeys(mc->mc_pg[mc->mc_top]) || page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
goto set1; goto got_node;
} }
} }
ret.err = 0;
mc->mc_flags &= ~C_EOF; mc->mc_flags &= ~C_EOF;
goto set2; goto search_node;
} }
} }
/* If any parents have right-sibs, search. /* If any parents have right-sibs, search.
* Otherwise, there's nothing further. */ * Otherwise, there's nothing further. */
unsigned i;
for (i = 0; i < mc->mc_top; i++) for (i = 0; i < mc->mc_top; i++)
if (mc->mc_ki[i] < page_numkeys(mc->mc_pg[i]) - 1) if (mc->mc_ki[i] < page_numkeys(mc->mc_pg[i]) - 1)
break; break;
@ -13484,17 +13483,15 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
if (!mc->mc_top) { if (!mc->mc_top) {
/* There are no other pages */ /* There are no other pages */
mc->mc_ki[mc->mc_top] = 0; mc->mc_ki[mc->mc_top] = 0;
if (op == MDBX_SET_RANGE) { if (op == MDBX_SET_RANGE)
ret.err = 0; goto got_node;
goto set1;
} else {
mdbx_cassert(mc, mc->mc_ki[mc->mc_top] < mdbx_cassert(mc, mc->mc_ki[mc->mc_top] <
page_numkeys(mc->mc_pg[mc->mc_top]) || page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
ret.err = MDBX_NOTFOUND; ret.err = MDBX_NOTFOUND;
return ret; return ret;
} }
}
} else { } else {
mc->mc_pg[0] = 0; mc->mc_pg[0] = 0;
} }
@ -13506,7 +13503,7 @@ static struct cursor_set_result mdbx_cursor_set(MDBX_cursor *mc, MDBX_val *key,
mp = mc->mc_pg[mc->mc_top]; mp = mc->mc_pg[mc->mc_top];
mdbx_cassert(mc, IS_LEAF(mp)); mdbx_cassert(mc, IS_LEAF(mp));
set2:; search_node:;
struct node_result nsr = mdbx_node_search(mc, &aligned_key); struct node_result nsr = mdbx_node_search(mc, &aligned_key);
node = nsr.node; node = nsr.node;
ret.exact = nsr.exact; ret.exact = nsr.exact;
@ -13522,8 +13519,8 @@ set2:;
if (node == NULL) { if (node == NULL) {
mdbx_debug("%s", "===> inexact leaf not found, goto sibling"); mdbx_debug("%s", "===> inexact leaf not found, goto sibling");
if (unlikely((ret.err = mdbx_cursor_sibling(mc, SIBLING_RIGHT)) != ret.err = mdbx_cursor_sibling(mc, SIBLING_RIGHT);
MDBX_SUCCESS)) { if (unlikely(ret.err != MDBX_SUCCESS)) {
mc->mc_flags |= C_EOF; mc->mc_flags |= C_EOF;
return ret; /* no entries matched */ return ret; /* no entries matched */
} }
@ -13537,7 +13534,7 @@ set2:;
mc->mc_ki[mc->mc_top] < page_numkeys(mc->mc_pg[mc->mc_top]) || mc->mc_ki[mc->mc_top] < page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
set1: got_node:
mc->mc_flags |= C_INITIALIZED; mc->mc_flags |= C_INITIALIZED;
mc->mc_flags &= ~C_EOF; mc->mc_flags &= ~C_EOF;
@ -13556,12 +13553,14 @@ set1:
return ret; return ret;
if (op == MDBX_SET || op == MDBX_SET_KEY || op == MDBX_SET_RANGE) { if (op == MDBX_SET || op == MDBX_SET_KEY || op == MDBX_SET_RANGE) {
ret.err = mdbx_cursor_first(&mc->mc_xcursor->mx_cursor, data, NULL); ret.err = mdbx_cursor_first(&mc->mc_xcursor->mx_cursor, data, NULL);
if (unlikely(ret.err != MDBX_SUCCESS))
return ret;
} else { } else {
ret = mdbx_cursor_set(&mc->mc_xcursor->mx_cursor, data, NULL, ret = mdbx_cursor_set(&mc->mc_xcursor->mx_cursor, data, NULL,
MDBX_SET_RANGE); MDBX_SET_RANGE);
}
if (unlikely(ret.err != MDBX_SUCCESS)) if (unlikely(ret.err != MDBX_SUCCESS))
return ret; return ret;
}
} else if (likely(data)) { } else if (likely(data)) {
if (op == MDBX_GET_BOTH || op == MDBX_GET_BOTH_RANGE) { if (op == MDBX_GET_BOTH || op == MDBX_GET_BOTH_RANGE) {
if (unlikely(data->iov_len < mc->mc_dbx->md_vlen_min || if (unlikely(data->iov_len < mc->mc_dbx->md_vlen_min ||
@ -13593,29 +13592,28 @@ set1:
} }
} }
MDBX_val olddata; MDBX_val olddata;
if (unlikely((ret.err = mdbx_node_read( ret.err = mdbx_node_read(mc, node, &olddata,
mc, node, &olddata, pp_txnid4chk(mc->mc_pg[mc->mc_top], mc->mc_txn));
pp_txnid4chk(mc->mc_pg[mc->mc_top], mc->mc_txn))) != if (unlikely(ret.err != MDBX_SUCCESS))
MDBX_SUCCESS))
return ret; return ret;
ret.err = mc->mc_dbx->md_dcmp(&aligned_data, &olddata); const int cmp = mc->mc_dbx->md_dcmp(&aligned_data, &olddata);
if (ret.err) { if (cmp) {
mdbx_cassert(mc, mc->mc_ki[mc->mc_top] < mdbx_cassert(mc, mc->mc_ki[mc->mc_top] <
page_numkeys(mc->mc_pg[mc->mc_top]) || page_numkeys(mc->mc_pg[mc->mc_top]) ||
(mc->mc_flags & C_EOF)); (mc->mc_flags & C_EOF));
if (op != MDBX_GET_BOTH_RANGE || ret.err > 0) { if (op != MDBX_GET_BOTH_RANGE || cmp > 0) {
ret.err = MDBX_NOTFOUND; ret.err = MDBX_NOTFOUND;
return ret; return ret;
} }
ret.err = MDBX_SUCCESS;
} }
*data = olddata; *data = olddata;
} else if (unlikely((ret.err = mdbx_node_read( } else {
mc, node, data, ret.err = mdbx_node_read(mc, node, data,
pp_txnid4chk(mc->mc_pg[mc->mc_top], pp_txnid4chk(mc->mc_pg[mc->mc_top], mc->mc_txn));
mc->mc_txn))) != MDBX_SUCCESS)) if (unlikely(ret.err != MDBX_SUCCESS))
return ret; return ret;
} }
}
/* The key already matches in all other cases */ /* The key already matches in all other cases */
if (op == MDBX_SET_RANGE || op == MDBX_SET_KEY) if (op == MDBX_SET_RANGE || op == MDBX_SET_KEY)
@ -13623,6 +13621,7 @@ set1:
mdbx_debug("==> cursor placed on key [%s], data [%s]", DKEY_DEBUG(key), mdbx_debug("==> cursor placed on key [%s], data [%s]", DKEY_DEBUG(key),
DVAL_DEBUG(data)); DVAL_DEBUG(data));
ret.err = MDBX_SUCCESS;
return ret; return ret;
} }