ITS#8557 fix mdb_cursor_last

Optimize mdb_page_search_root(PS_LAST) when cursor is already near
last position, ignoring C_EOF flag for now.
mdb.RE/0.9
Howard Chu 8 years ago
parent 307a2e02cd
commit c97f4ed1ae
  1. 27
      libraries/liblmdb/mdb.c

@ -5459,8 +5459,17 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
if (flags & (MDB_PS_FIRST|MDB_PS_LAST)) { if (flags & (MDB_PS_FIRST|MDB_PS_LAST)) {
i = 0; i = 0;
if (flags & MDB_PS_LAST) if (flags & MDB_PS_LAST) {
i = NUMKEYS(mp) - 1; i = NUMKEYS(mp) - 1;
/* if already init'd, see if we're already in right place */
if (mc->mc_flags & C_INITIALIZED) {
if (mc->mc_ki[mc->mc_top] == i) {
mc->mc_top = mc->mc_snum++;
mp = mc->mc_pg[mc->mc_top];
goto ready;
}
}
}
} else { } else {
int exact; int exact;
node = mdb_node_search(mc, key, &exact); node = mdb_node_search(mc, key, &exact);
@ -5486,6 +5495,7 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
if ((rc = mdb_cursor_push(mc, mp))) if ((rc = mdb_cursor_push(mc, mp)))
return rc; return rc;
ready:
if (flags & MDB_PS_MODIFY) { if (flags & MDB_PS_MODIFY) {
if ((rc = mdb_page_touch(mc)) != 0) if ((rc = mdb_page_touch(mc)) != 0)
return rc; return rc;
@ -6224,16 +6234,13 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
if (mc->mc_xcursor) if (mc->mc_xcursor)
mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF); mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
if (!(mc->mc_flags & C_EOF)) { if (!(mc->mc_flags & C_INITIALIZED) || mc->mc_top) {
rc = mdb_page_search(mc, NULL, MDB_PS_LAST);
if (!(mc->mc_flags & C_INITIALIZED) || mc->mc_top) { if (rc != MDB_SUCCESS)
rc = mdb_page_search(mc, NULL, MDB_PS_LAST); return rc;
if (rc != MDB_SUCCESS)
return rc;
}
mdb_cassert(mc, IS_LEAF(mc->mc_pg[mc->mc_top]));
} }
mdb_cassert(mc, IS_LEAF(mc->mc_pg[mc->mc_top]));
mc->mc_ki[mc->mc_top] = NUMKEYS(mc->mc_pg[mc->mc_top]) - 1; mc->mc_ki[mc->mc_top] = NUMKEYS(mc->mc_pg[mc->mc_top]) - 1;
mc->mc_flags |= C_INITIALIZED|C_EOF; mc->mc_flags |= C_INITIALIZED|C_EOF;
leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]); leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);

Loading…
Cancel
Save