]> git.sur5r.net Git - openldap/commitdiff
ITS#8321 reorganize page_split fixups
authorHoward Chu <hyc@openldap.org>
Mon, 23 Nov 2015 01:34:26 +0000 (01:34 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 23 Nov 2015 01:50:29 +0000 (01:50 +0000)
DUPFIXED fixups needed to occur after separator update.
MDB_RESERVE handling moved after split fixup.

libraries/liblmdb/mdb.c

index 236f58d90a24df83b779f98d8c6df020b85889c8..c5174e983acb0923da159fe7874f8337de8d3169 100644 (file)
@@ -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_upper -= ksize - sizeof(indx_t);
                                mc->mc_ki[mc->mc_top] = x;
-                               mc->mc_pg[mc->mc_top] = rp;
-                               mc->mc_ki[ptop]++;
                        }
                } else {
                        int psize, nsize, k;
@@ -8582,11 +8580,6 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
                /* reset back to original page */
                if (newindx < split_indx) {
                        mc->mc_pg[mc->mc_top] = mp;
-                       if (nflags & MDB_RESERVE) {
-                               node = NODEPTR(mp, mc->mc_ki[mc->mc_top]);
-                               if (!(node->mn_flags & F_BIGDATA))
-                                       newdata->mv_data = NODEDATA(node);
-                       }
                } else {
                        mc->mc_pg[mc->mc_top] = rp;
                        mc->mc_ki[ptop]++;
@@ -8600,6 +8593,25 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
                                }
                        }
                }
+               if (nflags & MDB_RESERVE) {
+                       node = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
+                       if (!(node->mn_flags & F_BIGDATA))
+                               newdata->mv_data = NODEDATA(node);
+               }
+       } else {
+               if (newindx >= split_indx) {
+                       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];
+                               }
+                       }
+               }
        }
 
        {