summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/btree/col_srch.c
diff options
context:
space:
mode:
authorRamon Fernandez <ramon.fernandez@mongodb.com>2015-04-27 11:33:41 -0400
committerRamon Fernandez <ramon.fernandez@mongodb.com>2015-04-27 11:33:47 -0400
commit34b853ed0566a3bbffcd825191b9000de331bddc (patch)
tree06f3f81436489f252da15900b2fef169e7ca1bde /src/third_party/wiredtiger/src/btree/col_srch.c
parent076cd926ab476f872afdd89a0e5e7e733d26c3ae (diff)
downloadmongo-34b853ed0566a3bbffcd825191b9000de331bddc.tar.gz
SERVER-18199 Import wiredtiger-wiredtiger-2.5.3-371-g1f44c05.tar.gz from wiredtiger branch mongodb-3.2
Diffstat (limited to 'src/third_party/wiredtiger/src/btree/col_srch.c')
-rw-r--r--src/third_party/wiredtiger/src/btree/col_srch.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/third_party/wiredtiger/src/btree/col_srch.c b/src/third_party/wiredtiger/src/btree/col_srch.c
index db1b565b439..d02f23ed164 100644
--- a/src/third_party/wiredtiger/src/btree/col_srch.c
+++ b/src/third_party/wiredtiger/src/btree/col_srch.c
@@ -31,10 +31,7 @@ __wt_col_search(WT_SESSION_IMPL *session,
__cursor_pos_clear(cbt);
- /*
- * In the service of eviction splits, we're only searching a single leaf
- * page, not a full tree.
- */
+ /* We may only be searching a single leaf page, not the full tree. */
if (leaf != NULL) {
current = leaf;
goto leaf_only;
@@ -49,8 +46,7 @@ restart: page = current->page;
WT_ASSERT(session, current->key.recno == page->pg_intl_recno);
- WT_ASSERT(session, session->split_gen != 0);
- pindex = WT_INTL_INDEX_COPY(page);
+ WT_INTL_INDEX_GET(session, page, pindex);
base = pindex->entries;
descent = pindex->index[base - 1];
@@ -123,24 +119,41 @@ leaf_only:
cbt->slot = UINT32_MAX;
/*
- * Search the leaf page. We do not check in the search path for a
- * record greater than the maximum record in the tree; in that case,
- * we arrive here with a record that's impossibly large for the page.
+ * Search the leaf page.
+ *
+ * Search after a page is pinned does a search of the pinned page before
+ * doing a full tree search, in which case we might be searching for a
+ * record logically before the page. Return failure, and there's nothing
+ * else to do, the record isn't going to be on this page.
+ *
+ * We don't check inside the search path for a record greater than the
+ * maximum record in the tree; in that case, we get here with a record
+ * that's impossibly large for the page. We do have additional setup to
+ * do in that case, the record may be appended to the page.
*/
if (page->type == WT_PAGE_COL_FIX) {
+ if (recno < page->pg_fix_recno) {
+ cbt->compare = 1;
+ return (0);
+ }
if (recno >= page->pg_fix_recno + page->pg_fix_entries) {
cbt->recno = page->pg_fix_recno + page->pg_fix_entries;
goto past_end;
} else
ins_head = WT_COL_UPDATE_SINGLE(page);
- } else
- if ((cip = __col_var_search(page, recno)) == NULL) {
+ } else {
+ if (recno < page->pg_var_recno) {
+ cbt->compare = 1;
+ return (0);
+ }
+ if ((cip = __col_var_search(page, recno, NULL)) == NULL) {
cbt->recno = __col_var_last_recno(page);
goto past_end;
} else {
cbt->slot = WT_COL_SLOT(page, cip);
ins_head = WT_COL_UPDATE_SLOT(page, cbt->slot);
}
+ }
/*
* We have a match on the page, check for an update. Check the page's