From: Howard Chu Date: Wed, 10 Jul 2013 18:03:51 +0000 (-0700) Subject: Fix rebalance/cursor adjust X-Git-Tag: OPENLDAP_REL_ENG_2_4_36~32^2~23 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=b711c07f3432d104612fd3186a22dab6f2369570;p=openldap Fix rebalance/cursor adjust 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. --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index a82b26380d..620e5b51ff 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -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]; } } } diff --git a/libraries/liblmdb/mtest.c b/libraries/liblmdb/mtest.c index 55cdd43c38..dbc69b8d4c 100644 --- a/libraries/liblmdb/mtest.c +++ b/libraries/liblmdb/mtest.c @@ -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);