Fix mdb_move_node again

vmware
Howard Chu 13 years ago
parent f9c8796d0b
commit 1f8c3369b9
  1. 34
      libraries/libmdb/mdb.c

@ -2322,7 +2322,7 @@ mdb_get(MDB_txn *txn, MDB_dbi dbi,
{ {
MDB_cursor mc; MDB_cursor mc;
MDB_xcursor mx; MDB_xcursor mx;
int exact; int exact = 0;
DKBUF; DKBUF;
assert(key); assert(key);
@ -3475,6 +3475,7 @@ mdb_xcursor_init0(MDB_cursor *mc)
mx->mx_dbxs[dbn+1].md_rel = mx->mx_dbxs[dbn].md_rel; mx->mx_dbxs[dbn+1].md_rel = mx->mx_dbxs[dbn].md_rel;
mx->mx_dbxs[dbn+1].md_dirty = 0; mx->mx_dbxs[dbn+1].md_dirty = 0;
mx->mx_txn.mt_numdbs = dbn+2; mx->mx_txn.mt_numdbs = dbn+2;
mx->mx_txn.mt_u = mc->mc_txn->mt_u;
mx->mx_cursor.mc_xcursor = NULL; mx->mx_cursor.mc_xcursor = NULL;
mx->mx_cursor.mc_txn = &mx->mx_txn; mx->mx_cursor.mc_txn = &mx->mx_txn;
@ -3503,7 +3504,6 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_page *mp, MDB_node *node)
mx->mx_dbxs[dbn].md_name.mv_data = NODEKEY(node); mx->mx_dbxs[dbn].md_name.mv_data = NODEKEY(node);
mx->mx_dbxs[dbn].md_name.mv_size = node->mn_ksize; mx->mx_dbxs[dbn].md_name.mv_size = node->mn_ksize;
mx->mx_txn.mt_next_pgno = mc->mc_txn->mt_next_pgno; mx->mx_txn.mt_next_pgno = mc->mc_txn->mt_next_pgno;
mx->mx_txn.mt_u = mc->mc_txn->mt_u;
mx->mx_cursor.mc_snum = 0; mx->mx_cursor.mc_snum = 0;
mx->mx_cursor.mc_flags = 0; mx->mx_cursor.mc_flags = 0;
} }
@ -3696,8 +3696,17 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
key.mv_data = LEAF2KEY(src->mp_page, srcindx, key.mv_size); key.mv_data = LEAF2KEY(src->mp_page, srcindx, key.mv_size);
data.mv_size = 0; data.mv_size = 0;
data.mv_data = NULL; data.mv_data = NULL;
} else {
if (srcindx == 0 && IS_BRANCH(src->mp_page)) {
/* must find the lowest key below src */
MDB_pageparent mpp;
mpp.mp_page = src->mp_page;
mpp.mp_pi = 0;
mdb_search_page_root(txn, dbi, NULL, NULL, 0, &mpp);
srcnode = NODEPTR(mpp.mp_page, 0);
} else { } else {
srcnode = NODEPTR(src->mp_page, srcindx); srcnode = NODEPTR(src->mp_page, srcindx);
}
key.mv_size = NODEKSZ(srcnode); key.mv_size = NODEKSZ(srcnode);
key.mv_data = NODEKEY(srcnode); key.mv_data = NODEKEY(srcnode);
data.mv_size = NODEDSZ(srcnode); data.mv_size = NODEDSZ(srcnode);
@ -3721,17 +3730,17 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
*/ */
mdb_del_node(src->mp_page, srcindx, key.mv_size); mdb_del_node(src->mp_page, srcindx, key.mv_size);
/* The key value just changed due to del_node, find it again.
*/
if (!IS_LEAF2(src->mp_page)) {
srcnode = NODEPTR(src->mp_page, srcindx);
key.mv_data = NODEKEY(srcnode);
}
/* Update the parent separators. /* Update the parent separators.
*/ */
if (srcindx == 0) { if (srcindx == 0) {
if (src->mp_pi != 0) { if (src->mp_pi != 0) {
if (IS_LEAF2(src->mp_page)) {
key.mv_data = LEAF2KEY(src->mp_page, srcindx, key.mv_size);
} else {
srcnode = NODEPTR(src->mp_page, srcindx);
key.mv_size = NODEKSZ(srcnode);
key.mv_data = NODEKEY(srcnode);
}
DPRINTF("update separator for source page %lu to [%s]", DPRINTF("update separator for source page %lu to [%s]",
src->mp_page->mp_pgno, DKEY(&key)); src->mp_page->mp_pgno, DKEY(&key));
if ((rc = mdb_update_key(src->mp_parent, src->mp_pi, if ((rc = mdb_update_key(src->mp_parent, src->mp_pi,
@ -3747,6 +3756,13 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
if (dstindx == 0) { if (dstindx == 0) {
if (dst->mp_pi != 0) { if (dst->mp_pi != 0) {
if (IS_LEAF2(src->mp_page)) {
key.mv_data = LEAF2KEY(dst->mp_page, 0, key.mv_size);
} else {
srcnode = NODEPTR(dst->mp_page, 0);
key.mv_size = NODEKSZ(srcnode);
key.mv_data = NODEKEY(srcnode);
}
DPRINTF("update separator for destination page %lu to [%s]", DPRINTF("update separator for destination page %lu to [%s]",
dst->mp_page->mp_pgno, DKEY(&key)); dst->mp_page->mp_pgno, DKEY(&key));
if ((rc = mdb_update_key(dst->mp_parent, dst->mp_pi, if ((rc = mdb_update_key(dst->mp_parent, dst->mp_pi,

Loading…
Cancel
Save