mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
ITS#8311 fix page_split from update_key
Check for top of stack. Usually the cursor only has height 1 when calling page_split, but not always.
This commit is contained in:
parent
a9877f783a
commit
f9d3dc8293
1 changed files with 12 additions and 8 deletions
|
|
@ -6391,16 +6391,18 @@ fix_parent:
|
|||
* update branch key if there is a parent page
|
||||
*/
|
||||
if (mc->mc_top && !mc->mc_ki[mc->mc_top]) {
|
||||
unsigned short top = mc->mc_top;
|
||||
unsigned short dtop = 1;
|
||||
mc->mc_top--;
|
||||
/* slot 0 is always an empty key, find real slot */
|
||||
while (mc->mc_top && !mc->mc_ki[mc->mc_top])
|
||||
while (mc->mc_top && !mc->mc_ki[mc->mc_top]) {
|
||||
mc->mc_top--;
|
||||
dtop++;
|
||||
}
|
||||
if (mc->mc_ki[mc->mc_top])
|
||||
rc2 = mdb_update_key(mc, key);
|
||||
else
|
||||
rc2 = MDB_SUCCESS;
|
||||
mc->mc_top = top;
|
||||
mc->mc_top += dtop;
|
||||
if (rc2)
|
||||
return rc2;
|
||||
}
|
||||
|
|
@ -8249,12 +8251,14 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
|
|||
rp->mp_pad = mp->mp_pad;
|
||||
DPRINTF(("new right sibling: page %"Z"u", rp->mp_pgno));
|
||||
|
||||
if (mc->mc_snum < 2) {
|
||||
if (mc->mc_top < 1) {
|
||||
if ((rc = mdb_page_new(mc, P_BRANCH, 1, &pp)))
|
||||
goto done;
|
||||
/* shift current top to make room for new parent */
|
||||
mc->mc_pg[1] = mc->mc_pg[0];
|
||||
mc->mc_ki[1] = mc->mc_ki[0];
|
||||
for (i=mc->mc_snum; i>0; i--) {
|
||||
mc->mc_pg[i] = mc->mc_pg[i-1];
|
||||
mc->mc_ki[i] = mc->mc_ki[i-1];
|
||||
}
|
||||
mc->mc_pg[0] = pp;
|
||||
mc->mc_ki[0] = 0;
|
||||
mc->mc_db->md_root = pp->mp_pgno;
|
||||
|
|
@ -8270,8 +8274,8 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
|
|||
mc->mc_db->md_depth--;
|
||||
goto done;
|
||||
}
|
||||
mc->mc_snum = 2;
|
||||
mc->mc_top = 1;
|
||||
mc->mc_snum++;
|
||||
mc->mc_top++;
|
||||
ptop = 0;
|
||||
} else {
|
||||
ptop = mc->mc_top-1;
|
||||
|
|
|
|||
Loading…
Reference in a new issue