Skip to content

Commit d78ffc9

Browse files
committed
ITS#8321 reorganize page_split fixups
DUPFIXED fixups needed to occur after separator update. MDB_RESERVE handling moved after split fixup.
1 parent 8fdf796 commit d78ffc9

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

libraries/liblmdb/mdb.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8380,8 +8380,6 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
83808380
rp->mp_lower += sizeof(indx_t);
83818381
rp->mp_upper -= ksize - sizeof(indx_t);
83828382
mc->mc_ki[mc->mc_top] = x;
8383-
mc->mc_pg[mc->mc_top] = rp;
8384-
mc->mc_ki[ptop]++;
83858383
}
83868384
} else {
83878385
int psize, nsize, k;
@@ -8582,11 +8580,6 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
85828580
/* reset back to original page */
85838581
if (newindx < split_indx) {
85848582
mc->mc_pg[mc->mc_top] = mp;
8585-
if (nflags & MDB_RESERVE) {
8586-
node = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
8587-
if (!(node->mn_flags & F_BIGDATA))
8588-
newdata->mv_data = NODEDATA(node);
8589-
}
85908583
} else {
85918584
mc->mc_pg[mc->mc_top] = rp;
85928585
mc->mc_ki[ptop]++;
@@ -8600,6 +8593,25 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
86008593
}
86018594
}
86028595
}
8596+
if (nflags & MDB_RESERVE) {
8597+
node = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
8598+
if (!(node->mn_flags & F_BIGDATA))
8599+
newdata->mv_data = NODEDATA(node);
8600+
}
8601+
} else {
8602+
if (newindx >= split_indx) {
8603+
mc->mc_pg[mc->mc_top] = rp;
8604+
mc->mc_ki[ptop]++;
8605+
/* Make sure mc_ki is still valid.
8606+
*/
8607+
if (mn.mc_pg[ptop] != mc->mc_pg[ptop] &&
8608+
mc->mc_ki[ptop] >= NUMKEYS(mc->mc_pg[ptop])) {
8609+
for (i=0; i<=ptop; i++) {
8610+
mc->mc_pg[i] = mn.mc_pg[i];
8611+
mc->mc_ki[i] = mn.mc_ki[i];
8612+
}
8613+
}
8614+
}
86038615
}
86048616

86058617
{

0 commit comments

Comments
 (0)