Set subDB DBI=parent DBI, fix MDB_DUPSORT delete.

xcursor DBIs were parent DBI+1 for debugging. Instead output
-(parent DBI).  Fixes a crash in mdb_cursor_del0()'s xcursor
tracking, it forgot to subtract 1 for C_SUB cursors.
vmware
Hallvard Furuseth 11 years ago
parent 79eac42c0f
commit 07dc79a7c3
  1. 52
      libraries/liblmdb/mdb.c

@ -317,6 +317,9 @@ static txnid_t mdb_debug_start;
* The string is printed literally, with no format processing. * The string is printed literally, with no format processing.
*/ */
#define DPUTS(arg) DPRINTF(("%s", arg)) #define DPUTS(arg) DPRINTF(("%s", arg))
/** Debuging output value of a cursor DBI: Negative in a sub-cursor. */
#define DDBI(mc) \
(((mc)->mc_flags & C_SUB) ? -(int)(mc)->mc_dbi : (int)(mc)->mc_dbi)
/** @} */ /** @} */
/** A default memory page size. /** A default memory page size.
@ -1859,7 +1862,6 @@ mdb_page_touch(MDB_cursor *mc)
MDB_page *mp = mc->mc_pg[mc->mc_top], *np; MDB_page *mp = mc->mc_pg[mc->mc_top], *np;
MDB_txn *txn = mc->mc_txn; MDB_txn *txn = mc->mc_txn;
MDB_cursor *m2, *m3; MDB_cursor *m2, *m3;
MDB_dbi dbi;
pgno_t pgno; pgno_t pgno;
int rc; int rc;
@ -1876,7 +1878,8 @@ mdb_page_touch(MDB_cursor *mc)
(rc = mdb_page_alloc(mc, 1, &np))) (rc = mdb_page_alloc(mc, 1, &np)))
return rc; return rc;
pgno = np->mp_pgno; pgno = np->mp_pgno;
DPRINTF(("touched db %u page %"Z"u -> %"Z"u", mc->mc_dbi,mp->mp_pgno,pgno)); DPRINTF(("touched db %d page %"Z"u -> %"Z"u", DDBI(mc),
mp->mp_pgno, pgno));
assert(mp->mp_pgno != pgno); assert(mp->mp_pgno != pgno);
mdb_midl_xappend(txn->mt_free_pgs, mp->mp_pgno); mdb_midl_xappend(txn->mt_free_pgs, mp->mp_pgno);
/* Update the parent page, if any, to point to the new page */ /* Update the parent page, if any, to point to the new page */
@ -1922,17 +1925,16 @@ mdb_page_touch(MDB_cursor *mc)
done: done:
/* Adjust cursors pointing to mp */ /* Adjust cursors pointing to mp */
mc->mc_pg[mc->mc_top] = np; mc->mc_pg[mc->mc_top] = np;
dbi = mc->mc_dbi; m2 = txn->mt_cursors[mc->mc_dbi];
if (mc->mc_flags & C_SUB) { if (mc->mc_flags & C_SUB) {
dbi--; for (; m2; m2=m2->mc_next) {
for (m2 = txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
if (m3->mc_snum < mc->mc_snum) continue; if (m3->mc_snum < mc->mc_snum) continue;
if (m3->mc_pg[mc->mc_top] == mp) if (m3->mc_pg[mc->mc_top] == mp)
m3->mc_pg[mc->mc_top] = np; m3->mc_pg[mc->mc_top] = np;
} }
} else { } else {
for (m2 = txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (; m2; m2=m2->mc_next) {
if (m2->mc_snum < mc->mc_snum) continue; if (m2->mc_snum < mc->mc_snum) continue;
if (m2->mc_pg[mc->mc_top] == mp) { if (m2->mc_pg[mc->mc_top] == mp) {
m2->mc_pg[mc->mc_top] = np; m2->mc_pg[mc->mc_top] = np;
@ -4502,8 +4504,8 @@ mdb_cursor_pop(MDB_cursor *mc)
if (mc->mc_snum) if (mc->mc_snum)
mc->mc_top--; mc->mc_top--;
DPRINTF(("popped page %"Z"u off db %u cursor %p", top->mp_pgno, DPRINTF(("popped page %"Z"u off db %d cursor %p", top->mp_pgno,
mc->mc_dbi, (void *) mc)); DDBI(mc), (void *) mc));
} }
} }
@ -4511,8 +4513,8 @@ mdb_cursor_pop(MDB_cursor *mc)
static int static int
mdb_cursor_push(MDB_cursor *mc, MDB_page *mp) mdb_cursor_push(MDB_cursor *mc, MDB_page *mp)
{ {
DPRINTF(("pushing page %"Z"u on db %u cursor %p", mp->mp_pgno, DPRINTF(("pushing page %"Z"u on db %d cursor %p", mp->mp_pgno,
mc->mc_dbi, (void *) mc)); DDBI(mc), (void *) mc));
if (mc->mc_snum >= CURSOR_STACK) { if (mc->mc_snum >= CURSOR_STACK) {
assert(mc->mc_snum < CURSOR_STACK); assert(mc->mc_snum < CURSOR_STACK);
@ -4745,8 +4747,8 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
mc->mc_snum = 1; mc->mc_snum = 1;
mc->mc_top = 0; mc->mc_top = 0;
DPRINTF(("db %u root page %"Z"u has flags 0x%X", DPRINTF(("db %d root page %"Z"u has flags 0x%X",
mc->mc_dbi, root, mc->mc_pg[0]->mp_flags)); DDBI(mc), root, mc->mc_pg[0]->mp_flags));
if (flags & MDB_PS_MODIFY) { if (flags & MDB_PS_MODIFY) {
if ((rc = mdb_page_touch(mc))) if ((rc = mdb_page_touch(mc)))
@ -5620,8 +5622,8 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
return MDB_BAD_VALSIZE; return MDB_BAD_VALSIZE;
#endif #endif
DPRINTF(("==> put db %u key [%s], size %"Z"u, data size %"Z"u", DPRINTF(("==> put db %d key [%s], size %"Z"u, data size %"Z"u",
mc->mc_dbi, DKEY(key), key ? key->mv_size:0, data->mv_size)); DDBI(mc), DKEY(key), key ? key->mv_size : 0, data->mv_size));
dkey.mv_size = 0; dkey.mv_size = 0;
@ -5950,9 +5952,6 @@ new_sub:
unsigned i = mc->mc_top; unsigned i = mc->mc_top;
MDB_page *mp = mc->mc_pg[i]; MDB_page *mp = mc->mc_pg[i];
if (mc->mc_flags & C_SUB)
dbi--;
for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (mc->mc_flags & C_SUB) if (mc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
@ -6462,7 +6461,7 @@ mdb_xcursor_init0(MDB_cursor *mc)
mx->mx_cursor.mc_txn = mc->mc_txn; mx->mx_cursor.mc_txn = mc->mc_txn;
mx->mx_cursor.mc_db = &mx->mx_db; mx->mx_cursor.mc_db = &mx->mx_db;
mx->mx_cursor.mc_dbx = &mx->mx_dbx; mx->mx_cursor.mc_dbx = &mx->mx_dbx;
mx->mx_cursor.mc_dbi = mc->mc_dbi+1; mx->mx_cursor.mc_dbi = mc->mc_dbi;
mx->mx_cursor.mc_dbflag = &mx->mx_dbflag; mx->mx_cursor.mc_dbflag = &mx->mx_dbflag;
mx->mx_cursor.mc_snum = 0; mx->mx_cursor.mc_snum = 0;
mx->mx_cursor.mc_top = 0; mx->mx_cursor.mc_top = 0;
@ -6510,7 +6509,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_node *node)
mx->mx_db.md_flags |= MDB_INTEGERKEY; mx->mx_db.md_flags |= MDB_INTEGERKEY;
} }
} }
DPRINTF(("Sub-db %u for db %u root page %"Z"u", mx->mx_cursor.mc_dbi, mc->mc_dbi, DPRINTF(("Sub-db -%u root page %"Z"u", mx->mx_cursor.mc_dbi,
mx->mx_db.md_root)); mx->mx_db.md_root));
mx->mx_dbflag = DB_VALID | (F_ISSET(mc->mc_pg[mc->mc_top]->mp_flags, P_DIRTY) ? mx->mx_dbflag = DB_VALID | (F_ISSET(mc->mc_pg[mc->mc_top]->mp_flags, P_DIRTY) ?
DB_DIRTY : 0); DB_DIRTY : 0);
@ -6831,9 +6830,6 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst)
MDB_dbi dbi = csrc->mc_dbi; MDB_dbi dbi = csrc->mc_dbi;
MDB_page *mp = csrc->mc_pg[csrc->mc_top]; MDB_page *mp = csrc->mc_pg[csrc->mc_top];
if (csrc->mc_flags & C_SUB)
dbi--;
for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (csrc->mc_flags & C_SUB) if (csrc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
@ -7008,9 +7004,6 @@ mdb_page_merge(MDB_cursor *csrc, MDB_cursor *cdst)
MDB_dbi dbi = csrc->mc_dbi; MDB_dbi dbi = csrc->mc_dbi;
MDB_page *mp = cdst->mc_pg[cdst->mc_top]; MDB_page *mp = cdst->mc_pg[cdst->mc_top];
if (csrc->mc_flags & C_SUB)
dbi--;
for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (csrc->mc_flags & C_SUB) if (csrc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
@ -7109,9 +7102,6 @@ mdb_rebalance(MDB_cursor *mc)
MDB_cursor *m2, *m3; MDB_cursor *m2, *m3;
MDB_dbi dbi = mc->mc_dbi; MDB_dbi dbi = mc->mc_dbi;
if (mc->mc_flags & C_SUB)
dbi--;
for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (mc->mc_flags & C_SUB) if (mc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
@ -7141,9 +7131,6 @@ mdb_rebalance(MDB_cursor *mc)
MDB_cursor *m2, *m3; MDB_cursor *m2, *m3;
MDB_dbi dbi = mc->mc_dbi; MDB_dbi dbi = mc->mc_dbi;
if (mc->mc_flags & C_SUB)
dbi--;
for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (mc->mc_flags & C_SUB) if (mc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;
@ -7712,9 +7699,6 @@ done:
MDB_dbi dbi = mc->mc_dbi; MDB_dbi dbi = mc->mc_dbi;
int fixup = NUMKEYS(mp); int fixup = NUMKEYS(mp);
if (mc->mc_flags & C_SUB)
dbi--;
for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = mc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (mc->mc_flags & C_SUB) if (mc->mc_flags & C_SUB)
m3 = &m2->mc_xcursor->mx_cursor; m3 = &m2->mc_xcursor->mx_cursor;

Loading…
Cancel
Save