]> git.sur5r.net Git - openldap/commitdiff
Fix rebalance/cursor adjust
authorHoward Chu <hyc@symas.com>
Wed, 10 Jul 2013 18:03:51 +0000 (11:03 -0700)
committerHoward Chu <hyc@symas.com>
Wed, 10 Jul 2013 18:04:37 +0000 (11:04 -0700)
When collapsing root, must also move cursor index down,
not just the page pointer.

Also in mtest, break from NEXT loops on error, otherwise it just
prints the previous key/data again, which looks confusing.

libraries/liblmdb/mdb.c
libraries/liblmdb/mtest.c

index a82b26380daf4d60c5812eb748a74b4422db4e89..620e5b51ff309828f289bee69b090ec4b58f17e8 100644 (file)
@@ -6451,6 +6451,7 @@ mdb_rebalance(MDB_cursor *mc)
                                return rc;
                        mc->mc_db->md_depth--;
                        mc->mc_db->md_branch_pages--;
+                       mc->mc_ki[0] = mc->mc_ki[1];
                        {
                                /* Adjust other cursors pointing to mp */
                                MDB_cursor *m2, *m3;
@@ -6469,6 +6470,7 @@ mdb_rebalance(MDB_cursor *mc)
                                                m3->mc_pg[0] = mc->mc_pg[0];
                                                m3->mc_snum = 1;
                                                m3->mc_top = 0;
+                                               m3->mc_ki[0] = m3->mc_ki[1];
                                        }
                                }
                        }
index 55cdd43c38711793e77737da77e5f967032dbcaa..dbc69b8d4cae06d9be11fe0c637b5ae5949e8ede 100644 (file)
@@ -129,6 +129,8 @@ int main(int argc,char * argv[])
                rc = mdb_cursor_open(txn, dbi, &cur2);
                for (i=0; i<50; i++) {
                        rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
+                       if (rc)
+                               break;
                        printf("key: %p %.*s, data: %p %.*s\n",
                                key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
                                data.mv_data, (int) data.mv_size, (char *) data.mv_data);
@@ -142,6 +144,7 @@ int main(int argc,char * argv[])
                        data.mv_data, (int) data.mv_size, (char *) data.mv_data);
                for (i=0; i<32; i++) {
                        rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
+                       if (rc) break;
                        printf("key: %p %.*s, data: %p %.*s\n",
                                key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
                                data.mv_data, (int) data.mv_size, (char *) data.mv_data);
@@ -158,6 +161,7 @@ int main(int argc,char * argv[])
                        data.mv_data, (int) data.mv_size, (char *) data.mv_data);
                for (i=0; i<32; i++) {
                        rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT);
+                       if (rc) break;
                        printf("key: %p %.*s, data: %p %.*s\n",
                                key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
                                data.mv_data, (int) data.mv_size, (char *) data.mv_data);