]> git.sur5r.net Git - openldap/commitdiff
Merge remote-tracking branch 'origin/mdb.RE/0.9'
authorHoward Chu <hyc@openldap.org>
Wed, 4 Nov 2015 21:04:57 +0000 (21:04 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 4 Nov 2015 21:04:57 +0000 (21:04 +0000)
libraries/liblmdb/CHANGES
libraries/liblmdb/mdb.c

index 07b087aad977ade746a4243881f30aa0026a037b..fb4b48238563dd1bb306776934c5d2710c48f7a3 100644 (file)
@@ -9,6 +9,7 @@ LMDB 0.9.17 Release Engineering
        Fix ITS#8263 cursor_put cursor tracking
        Fix ITS#8264 cursor_del cursor tracking
        Fix ITS#8299 mdb_del cursor tracking
+       Fix ITS#8300 mdb_del cursor tracking
        Fix ITS#7771 fakepage cursor tracking
        Fix ITS#7789 ensure mapsize >= pages in use
        Fix ITS#7971 mdb_txn_renew0() new reader slots
index 0bff10e75933687912cb62909bf0f3e6bbac2efd..56b731de56bbf3efbd188e2e2bd5e64b49b57b5b 100644 (file)
@@ -7598,16 +7598,19 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst)
                MDB_dbi dbi = csrc->mc_dbi;
                MDB_page *mp;
 
-               mp = cdst->mc_pg[csrc->mc_top];
-               for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
-                       if (csrc->mc_flags & C_SUB)
-                               m3 = &m2->mc_xcursor->mx_cursor;
-                       else
-                               m3 = m2;
-                       if (m3 == cdst) continue;
-                       if (m3->mc_pg[csrc->mc_top] == mp && m3->mc_ki[csrc->mc_top] >=
-                               cdst->mc_ki[csrc->mc_top]) {
-                               m3->mc_ki[csrc->mc_top]++;
+               /* If we're adding on the left, bump others up */
+               if (!cdst->mc_ki[csrc->mc_top]) {
+                       mp = cdst->mc_pg[csrc->mc_top];
+                       for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
+                               if (csrc->mc_flags & C_SUB)
+                                       m3 = &m2->mc_xcursor->mx_cursor;
+                               else
+                                       m3 = m2;
+                               if (m3 == cdst) continue;
+                               if (m3->mc_pg[csrc->mc_top] == mp && m3->mc_ki[csrc->mc_top] >=
+                                       cdst->mc_ki[csrc->mc_top]) {
+                                       m3->mc_ki[csrc->mc_top]++;
+                               }
                        }
                }
 
@@ -8009,7 +8012,8 @@ mdb_rebalance(MDB_cursor *mc)
         */
        if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= thresh && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) {
                rc = mdb_node_move(&mn, mc);
-               if (mc->mc_ki[mc->mc_top-1]) {
+               if (!mc->mc_ki[mc->mc_top]) {
+                       /* if we inserted on left, bump position up */
                        oldki++;
                }
        } else {