ITS#8321 reorganize page_split fixups

DUPFIXED fixups needed to occur after separator update.
MDB_RESERVE handling moved after split fixup.
mdb.RE/0.9
Howard Chu 9 years ago
parent 8fdf79600a
commit d78ffc9517
  1. 18
      libraries/liblmdb/mdb.c

@ -8380,8 +8380,6 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
rp->mp_lower += sizeof(indx_t); rp->mp_lower += sizeof(indx_t);
rp->mp_upper -= ksize - sizeof(indx_t); rp->mp_upper -= ksize - sizeof(indx_t);
mc->mc_ki[mc->mc_top] = x; mc->mc_ki[mc->mc_top] = x;
mc->mc_pg[mc->mc_top] = rp;
mc->mc_ki[ptop]++;
} }
} else { } else {
int psize, nsize, k; int psize, nsize, k;
@ -8582,12 +8580,26 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
/* reset back to original page */ /* reset back to original page */
if (newindx < split_indx) { if (newindx < split_indx) {
mc->mc_pg[mc->mc_top] = mp; mc->mc_pg[mc->mc_top] = mp;
} else {
mc->mc_pg[mc->mc_top] = rp;
mc->mc_ki[ptop]++;
/* Make sure mc_ki is still valid.
*/
if (mn.mc_pg[ptop] != mc->mc_pg[ptop] &&
mc->mc_ki[ptop] >= NUMKEYS(mc->mc_pg[ptop])) {
for (i=0; i<=ptop; i++) {
mc->mc_pg[i] = mn.mc_pg[i];
mc->mc_ki[i] = mn.mc_ki[i];
}
}
}
if (nflags & MDB_RESERVE) { if (nflags & MDB_RESERVE) {
node = NODEPTR(mp, mc->mc_ki[mc->mc_top]); node = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
if (!(node->mn_flags & F_BIGDATA)) if (!(node->mn_flags & F_BIGDATA))
newdata->mv_data = NODEDATA(node); newdata->mv_data = NODEDATA(node);
} }
} else { } else {
if (newindx >= split_indx) {
mc->mc_pg[mc->mc_top] = rp; mc->mc_pg[mc->mc_top] = rp;
mc->mc_ki[ptop]++; mc->mc_ki[ptop]++;
/* Make sure mc_ki is still valid. /* Make sure mc_ki is still valid.

Loading…
Cancel
Save