mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 02:04:13 +08:00
mdbx: extract mdbx_touch_dbi()
.
Change-Id: I3b077cefe44f4c2db099b2050e1fd72a1aaa2687
This commit is contained in:
parent
f9977975ae
commit
5e334fa830
78
src/core.c
78
src/core.c
@ -3619,6 +3619,7 @@ static int mdbx_page_new(MDBX_cursor *mc, uint32_t flags, unsigned num,
|
||||
MDBX_page **mp);
|
||||
static int mdbx_page_touch(MDBX_cursor *mc);
|
||||
static int mdbx_cursor_touch(MDBX_cursor *mc);
|
||||
static int mdbx_touch_dbi(MDBX_cursor *mc);
|
||||
|
||||
#define MDBX_END_NAMES \
|
||||
{ \
|
||||
@ -6344,20 +6345,17 @@ __hot static int mdbx_page_touch(MDBX_cursor *mc) {
|
||||
int rc;
|
||||
|
||||
if (mdbx_assert_enabled()) {
|
||||
if (mc->mc_dbi >= CORE_DBS) {
|
||||
if (mc->mc_flags & C_SUB) {
|
||||
MDBX_xcursor *mx = container_of(mc->mc_db, MDBX_xcursor, mx_db);
|
||||
MDBX_cursor_couple *couple =
|
||||
container_of(mx, MDBX_cursor_couple, inner);
|
||||
mdbx_cassert(mc, mc->mc_db == &couple->outer.mc_xcursor->mx_db);
|
||||
mdbx_cassert(mc, mc->mc_dbx == &couple->outer.mc_xcursor->mx_dbx);
|
||||
mdbx_cassert(mc, *couple->outer.mc_dbistate & DBI_DIRTY);
|
||||
} else {
|
||||
mdbx_cassert(mc, *mc->mc_dbistate & DBI_DIRTY);
|
||||
}
|
||||
mdbx_cassert(mc, mc->mc_txn->mt_flags & MDBX_TXN_DIRTY);
|
||||
if (mc->mc_flags & C_SUB) {
|
||||
MDBX_xcursor *mx = container_of(mc->mc_db, MDBX_xcursor, mx_db);
|
||||
MDBX_cursor_couple *couple = container_of(mx, MDBX_cursor_couple, inner);
|
||||
mdbx_tassert(txn, mc->mc_db == &couple->outer.mc_xcursor->mx_db);
|
||||
mdbx_tassert(txn, mc->mc_dbx == &couple->outer.mc_xcursor->mx_dbx);
|
||||
mdbx_tassert(txn, *couple->outer.mc_dbistate & DBI_DIRTY);
|
||||
} else {
|
||||
mdbx_tassert(txn, *mc->mc_dbistate & DBI_DIRTY);
|
||||
}
|
||||
mdbx_cassert(mc, !IS_OVERFLOW(mp));
|
||||
mdbx_tassert(txn, mc->mc_txn->mt_flags & MDBX_TXN_DIRTY);
|
||||
mdbx_tassert(txn, !IS_OVERFLOW(mp));
|
||||
mdbx_tassert(txn, mdbx_dirtylist_check(txn));
|
||||
}
|
||||
|
||||
@ -12887,6 +12885,8 @@ __hot static int mdbx_page_search(MDBX_cursor *mc, const MDBX_val *key,
|
||||
mc->mc_pg[0]->mp_flags);
|
||||
|
||||
if (flags & MDBX_PS_MODIFY) {
|
||||
if (!(*mc->mc_dbistate & DBI_DIRTY) && unlikely(rc = mdbx_touch_dbi(mc)))
|
||||
return rc;
|
||||
if (unlikely(rc = mdbx_page_touch(mc)))
|
||||
return rc;
|
||||
}
|
||||
@ -13828,28 +13828,37 @@ int mdbx_cursor_get(MDBX_cursor *mc, MDBX_val *key, MDBX_val *data,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int mdbx_touch_dbi(MDBX_cursor *mc) {
|
||||
mdbx_cassert(mc, (*mc->mc_dbistate & (DBI_DIRTY | DBI_DUPDATA)) == 0);
|
||||
*mc->mc_dbistate |= DBI_DIRTY;
|
||||
mc->mc_txn->mt_flags |= MDBX_TXN_DIRTY;
|
||||
if (mc->mc_dbi >= CORE_DBS) {
|
||||
mdbx_cassert(mc, (mc->mc_flags & C_RECLAIMING) == 0);
|
||||
/* Touch DB record of named DB */
|
||||
MDBX_cursor_couple cx;
|
||||
int rc = mdbx_cursor_init(&cx.outer, mc->mc_txn, MAIN_DBI);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
mc->mc_txn->mt_dbistate[MAIN_DBI] |= DBI_DIRTY;
|
||||
rc = mdbx_page_search(&cx.outer, &mc->mc_dbx->md_name, MDBX_PS_MODIFY);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
}
|
||||
return MDBX_SUCCESS;
|
||||
}
|
||||
|
||||
/* Touch all the pages in the cursor stack. Set mc_top.
|
||||
* Makes sure all the pages are writable, before attempting a write operation.
|
||||
* [in] mc The cursor to operate on. */
|
||||
static int mdbx_cursor_touch(MDBX_cursor *mc) {
|
||||
int rc = MDBX_SUCCESS;
|
||||
if (unlikely((*mc->mc_dbistate & (DBI_DIRTY | DBI_DUPDATA)) == 0)) {
|
||||
*mc->mc_dbistate |= DBI_DIRTY;
|
||||
mc->mc_txn->mt_flags |= MDBX_TXN_DIRTY;
|
||||
if (mc->mc_dbi >= CORE_DBS) {
|
||||
mdbx_cassert(mc, (mc->mc_flags & C_RECLAIMING) == 0);
|
||||
/* Touch DB record of named DB */
|
||||
MDBX_cursor_couple cx;
|
||||
rc = mdbx_cursor_init(&cx.outer, mc->mc_txn, MAIN_DBI);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
rc = mdbx_page_search(&cx.outer, &mc->mc_dbx->md_name, MDBX_PS_MODIFY);
|
||||
if (unlikely(rc))
|
||||
return rc;
|
||||
}
|
||||
rc = mdbx_touch_dbi(mc);
|
||||
if (unlikely(rc != MDBX_SUCCESS))
|
||||
return rc;
|
||||
}
|
||||
mc->mc_top = 0;
|
||||
if (mc->mc_snum) {
|
||||
if (likely(mc->mc_snum)) {
|
||||
mc->mc_top = 0;
|
||||
do {
|
||||
rc = mdbx_page_touch(mc);
|
||||
} while (!rc && ++(mc->mc_top) < mc->mc_snum);
|
||||
@ -14130,9 +14139,14 @@ int mdbx_cursor_put(MDBX_cursor *mc, const MDBX_val *key, MDBX_val *data,
|
||||
MDBX_page *np;
|
||||
/* new database, write a root leaf page */
|
||||
mdbx_debug("%s", "allocating new root leaf page");
|
||||
if (unlikely(rc2 = mdbx_page_new(mc, P_LEAF, 1, &np))) {
|
||||
return rc2;
|
||||
if (unlikely((*mc->mc_dbistate & (DBI_DIRTY | DBI_DUPDATA)) == 0)) {
|
||||
rc2 = mdbx_touch_dbi(mc);
|
||||
if (unlikely(rc2 != MDBX_SUCCESS))
|
||||
return rc2;
|
||||
}
|
||||
rc2 = mdbx_page_new(mc, P_LEAF, 1, &np);
|
||||
if (unlikely(rc2 != MDBX_SUCCESS))
|
||||
return rc;
|
||||
rc2 = mdbx_cursor_push(mc, np);
|
||||
if (unlikely(rc2 != MDBX_SUCCESS))
|
||||
return rc2;
|
||||
@ -14794,8 +14808,8 @@ static int mdbx_page_new(MDBX_cursor *mc, unsigned flags, unsigned num,
|
||||
np->mp_pgno, num);
|
||||
np->mp_flags = (uint16_t)(flags | P_DIRTY);
|
||||
np->mp_txnid = INVALID_TXNID;
|
||||
*mc->mc_dbistate |= DBI_DIRTY;
|
||||
mc->mc_txn->mt_flags |= MDBX_TXN_DIRTY;
|
||||
mdbx_cassert(mc, *mc->mc_dbistate & DBI_DIRTY);
|
||||
mdbx_cassert(mc, mc->mc_txn->mt_flags & MDBX_TXN_DIRTY);
|
||||
|
||||
if (likely(!IS_OVERFLOW(np))) {
|
||||
np->mp_lower = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user