From 1105aa35ba46f811ebfddb7e5790c3d9e90000e6 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 13 May 2013 12:36:47 -0700 Subject: [PATCH 1/2] Doxygen cleanup --- libraries/liblmdb/mdb.c | 16 ++++++++++------ libraries/liblmdb/midl.h | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 80336831e1..dfa87964bc 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -853,7 +853,7 @@ struct MDB_txn { #define MDB_TXN_DIRTY 0x04 /**< must write, even if dirty list is empty */ /** @} */ unsigned int mt_flags; /**< @ref mdb_txn */ - /** dirty_list maxsize - #allocated pages including in parent txns */ + /** dirty_list maxsize - # of allocated pages allowed, including in parent txns */ unsigned int mt_dirty_room; /** Tracks which of the two meta pages was used at the start * of this transaction. @@ -1268,6 +1268,10 @@ mdb_page_malloc(MDB_cursor *mc) { return ret; } +/** Free a single page. + * Saves single pages to a list, for future reuse. + * (This is not used for multi-page overflow pages.) + */ static void mdb_page_free(MDB_env *env, MDB_page *mp) { @@ -1549,6 +1553,7 @@ none: /** Copy a page: avoid copying unused portions of the page. * @param[in] dst page to copy into * @param[in] src page to copy from + * @param[in] psize size of a page */ static void mdb_page_copy(MDB_page *dst, MDB_page *src, unsigned int psize) @@ -4068,8 +4073,7 @@ done: * @param[in,out] mc the cursor for this operation. * @param[in] key the key to search for. If NULL, search for the lowest * page. (This is used by #mdb_cursor_first().) - * @param[in] flags If MDB_PS_MODIFY set, visited pages are updated with new page numbers. - * If MDB_PS_ROOTONLY set, just fetch root node, no further lookups. + * @param[in] modify If true, visited pages are updated with new page numbers. * @return 0 on success, non-zero on failure. */ static int @@ -4169,7 +4173,8 @@ mdb_page_search_lowest(MDB_cursor *mc) * @param[in,out] mc the cursor for this operation. * @param[in] key the key to search for. If NULL, search for the lowest * page. (This is used by #mdb_cursor_first().) - * @param[in] modify If true, visited pages are updated with new page numbers. + * @param[in] flags If MDB_PS_MODIFY set, visited pages are updated with new page numbers. + * If MDB_PS_ROOTONLY set, just fetch root node, no further lookups. * @return 0 on success, non-zero on failure. */ static int @@ -5940,8 +5945,7 @@ mdb_cursor_dbi(MDB_cursor *mc) } /** Replace the key for a node with a new key. - * @param[in] mp The page containing the node to operate on. - * @param[in] indx The index of the node to operate on. + * @param[in] mc Cursor pointing to the node to operate on. * @param[in] key The new key to use. * @return 0 on success, non-zero on failure. */ diff --git a/libraries/liblmdb/midl.h b/libraries/liblmdb/midl.h index 9319fb590b..792e6ab938 100644 --- a/libraries/liblmdb/midl.h +++ b/libraries/liblmdb/midl.h @@ -135,7 +135,7 @@ int mdb_midl_shrink(MDB_IDL *idp); /** Grow an IDL. * Add room for num additional elements. * @param[in,out] idp Address of the IDL to grow. - * @param[i] num Number of elements to add. + * @param[in] num Number of elements to add. * @return 0 on success, -1 on failure. */ int mdb_midl_grow(MDB_IDL *idp, int num); From 7233bc295bb3e40b2758158ae2de6f42516962f8 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 14 May 2013 16:57:50 -0700 Subject: [PATCH 2/2] Fix mdb_page_split - nested split If updating a page's separator triggers a split in its parent, we may have missed adjusting the parent's cursor position. --- libraries/liblmdb/mdb.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index dfa87964bc..c09cb0d918 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -6933,6 +6933,17 @@ newsep: } } else { mc->mc_ki[ptop]++; + /* Make sure mc_ki is still valid. + */ + if (mn.mc_pg[ptop] != mc->mc_pg[ptop] && + mc->mc_ki[ptop] >= NUMKEYS(mc->mc_pg[ptop])) { + for (i=0; imc_pg[i] = mn.mc_pg[i]; + mc->mc_ki[i] = mn.mc_ki[i]; + } + mc->mc_pg[ptop] = mn.mc_pg[ptop]; + mc->mc_ki[ptop] = mn.mc_ki[ptop] - 1; + } } /* return tmp page to freelist */