]> git.sur5r.net Git - openldap/commitdiff
ITS#8062 fix rebalance
authorHoward Chu <hyc@openldap.org>
Wed, 15 Apr 2015 22:20:55 +0000 (23:20 +0100)
committerHoward Chu <hyc@openldap.org>
Wed, 15 Apr 2015 22:30:52 +0000 (23:30 +0100)
(Probably fixes the ITS, definitely fixes a bug) when collapsing
the root page, fixups of other cursors was incomplete.

libraries/liblmdb/mdb.c

index c788b85347b2c6b0190dd58cf603e433110c0515..4bb7fee47c60a048be1f41353f2298338b9ebc65 100644 (file)
@@ -7717,12 +7717,12 @@ mdb_rebalance(MDB_cursor *mc)
                                                m3 = m2;
                                        if (m3 == mc || m3->mc_snum < mc->mc_snum) continue;
                                        if (m3->mc_pg[0] == mp) {
-                                               m3->mc_snum--;
-                                               m3->mc_top--;
                                                for (i=0; i<m3->mc_snum; i++) {
                                                        m3->mc_pg[i] = m3->mc_pg[i+1];
                                                        m3->mc_ki[i] = m3->mc_ki[i+1];
                                                }
+                                               m3->mc_snum--;
+                                               m3->mc_top--;
                                        }
                                }
                        }
@@ -7792,7 +7792,11 @@ mdb_rebalance(MDB_cursor *mc)
                } else {
                        oldki += NUMKEYS(mn.mc_pg[mn.mc_top]);
                        mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1;
+                       /* We want mdb_rebalance to find mn when doing fixups */
+                       mn.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+                       mc->mc_txn->mt_cursors[mc->mc_dbi] = &mn;
                        rc = mdb_page_merge(mc, &mn);
+                       mc->mc_txn->mt_cursors[mc->mc_dbi] = mn.mc_next;
                        mdb_cursor_copy(&mn, mc);
                }
                mc->mc_flags &= ~C_EOF;