]> git.sur5r.net Git - openldap/commitdiff
Fix mdb_rebalance collapsing root
authorHoward Chu <hyc@symas.com>
Tue, 20 May 2014 15:47:28 +0000 (08:47 -0700)
committerHoward Chu <hyc@symas.com>
Tue, 20 May 2014 15:47:28 +0000 (08:47 -0700)
Shift the rest of the cursor stack as needed

libraries/liblmdb/COPYRIGHT
libraries/liblmdb/mdb.c

index 4482816cf5da7b88e3e046d72b4f33c3d29b3878..e0eb484c7aa87eefa2c89437fecd65e1eaaa6bc9 100644 (file)
@@ -1,4 +1,4 @@
-Copyright 2011-2013 Howard Chu, Symas Corp.
+Copyright 2011-2014 Howard Chu, Symas Corp.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
index e0f551eba41cc0a9f2b7085d72206dd4cc515e9e..55b8a1dff19fd631477ca297fb5a64da2231899e 100644 (file)
@@ -7383,6 +7383,7 @@ mdb_rebalance(MDB_cursor *mc)
                                }
                        }
                } else if (IS_BRANCH(mp) && NUMKEYS(mp) == 1) {
+                       int i;
                        DPUTS("collapsing root page!");
                        rc = mdb_midl_append(&mc->mc_txn->mt_free_pgs, mp->mp_pgno);
                        if (rc)
@@ -7394,6 +7395,10 @@ mdb_rebalance(MDB_cursor *mc)
                        mc->mc_db->md_depth--;
                        mc->mc_db->md_branch_pages--;
                        mc->mc_ki[0] = mc->mc_ki[1];
+                       for (i = 1; i<mc->mc_db->md_depth; i++) {
+                               mc->mc_pg[i] = mc->mc_pg[i+1];
+                               mc->mc_ki[i] = mc->mc_ki[i+1];
+                       }
                        {
                                /* Adjust other cursors pointing to mp */
                                MDB_cursor *m2, *m3;
@@ -7406,7 +7411,6 @@ mdb_rebalance(MDB_cursor *mc)
                                                m3 = m2;
                                        if (m3 == mc || m3->mc_snum < mc->mc_snum) continue;
                                        if (m3->mc_pg[0] == mp) {
-                                               int i;
                                                m3->mc_snum--;
                                                m3->mc_top--;
                                                for (i=0; i<m3->mc_snum; i++) {