summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuke Chen <luke.chen@mongodb.com>2019-12-05 10:29:59 +1100
committerLuke Chen <luke.chen@mongodb.com>2019-12-05 10:29:59 +1100
commita0bbbff6ada159e19298d37946ac8dc4b497eadf (patch)
tree39c541e3aa07ea3b2f1072835612bf0c5f3317a0 /src
parentf4404e7ac489bec9b208bc56b1ebb9078a518216 (diff)
downloadmongo-a0bbbff6ada159e19298d37946ac8dc4b497eadf.tar.gz
Import wiredtiger: 8b63de583201b15f38cc161298d5ebc215c817a3 from branch mongodb-4.2r4.2.2-rc1r4.2.2
ref: 1311372125..8b63de5832 for: 4.2.2 Revert WT-5120 Checkpoint hangs when reconciliation doesn't release the eviction generation
Diffstat (limited to 'src')
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c12
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c6
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_cursor.c153
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_random.c55
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_read.c8
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_ret.c25
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_split.c12
-rw-r--r--src/third_party/wiredtiger/src/btree/col_modify.c6
-rw-r--r--src/third_party/wiredtiger/src/btree/col_srch.c21
-rw-r--r--src/third_party/wiredtiger/src/btree/row_modify.c6
-rw-r--r--src/third_party/wiredtiger/src/btree/row_srch.c23
-rw-r--r--src/third_party/wiredtiger/src/cache/cache_las.c11
-rw-r--r--src/third_party/wiredtiger/src/include/cursor.i8
-rw-r--r--src/third_party/wiredtiger/src/include/extern.h27
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in5
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_col.c10
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_row.c10
18 files changed, 180 insertions, 220 deletions
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data
index 8a69d9b9ae6..88b556b1e56 100644
--- a/src/third_party/wiredtiger/import.data
+++ b/src/third_party/wiredtiger/import.data
@@ -1,5 +1,5 @@
{
- "commit": "1311372125d14fe97b07d0f4c165b1ad9efb4e9a",
+ "commit": "8b63de583201b15f38cc161298d5ebc215c817a3",
"github": "wiredtiger/wiredtiger.git",
"vendor": "wiredtiger",
"branch": "mongodb-4.2"
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c
index d4abddbd9dd..b7f2e0db4b3 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curnext.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c
@@ -159,7 +159,7 @@ __cursor_var_append_next(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
++cbt->page_deleted_count;
continue;
}
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/* NOTREACHED */
}
@@ -228,7 +228,7 @@ __cursor_var_next(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
++cbt->page_deleted_count;
continue;
}
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/*
@@ -351,7 +351,7 @@ __cursor_row_next(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
}
key->data = WT_INSERT_KEY(ins);
key->size = WT_INSERT_KEY_SIZE(ins);
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/* Check for the end of the page. */
@@ -481,12 +481,8 @@ __wt_cursor_key_order_check(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, bool
* Initialize key ordering checks for cursor movements after a successful search.
*/
int
-__wt_cursor_key_order_init(WT_CURSOR_BTREE *cbt)
+__wt_cursor_key_order_init(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
{
- WT_SESSION_IMPL *session;
-
- session = (WT_SESSION_IMPL *)cbt->iface.session;
-
/*
* Cursor searches set the position for cursor movements, set the last-key value for diagnostic
* checking.
diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c
index 4f514db6495..2a91695ebd2 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curprev.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c
@@ -300,7 +300,7 @@ __cursor_var_append_prev(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
++cbt->page_deleted_count;
continue;
}
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/* NOTREACHED */
}
@@ -370,7 +370,7 @@ __cursor_var_prev(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
++cbt->page_deleted_count;
continue;
}
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/*
@@ -502,7 +502,7 @@ __cursor_row_prev(WT_CURSOR_BTREE *cbt, bool newpage, bool restart)
}
key->data = WT_INSERT_KEY(ins);
key->size = WT_INSERT_KEY_SIZE(ins);
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
}
/* Check for the beginning of the page. */
diff --git a/src/third_party/wiredtiger/src/btree/bt_cursor.c b/src/third_party/wiredtiger/src/btree/bt_cursor.c
index 11201846a38..111222809f0 100644
--- a/src/third_party/wiredtiger/src/btree/bt_cursor.c
+++ b/src/third_party/wiredtiger/src/btree/bt_cursor.c
@@ -367,14 +367,11 @@ __wt_cursor_valid(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *valid)
* Column-store search from a cursor.
*/
static inline int
-__cursor_col_search(WT_CURSOR_BTREE *cbt, WT_REF *leaf, bool *leaf_foundp)
+__cursor_col_search(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_REF *leaf)
{
WT_DECL_RET;
- WT_SESSION_IMPL *session;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
- WT_WITH_PAGE_INDEX(
- session, ret = __wt_col_search(cbt, cbt->iface.recno, leaf, false, leaf_foundp));
+ WT_WITH_PAGE_INDEX(session, ret = __wt_col_search(session, cbt->iface.recno, leaf, cbt, false));
return (ret);
}
@@ -383,14 +380,12 @@ __cursor_col_search(WT_CURSOR_BTREE *cbt, WT_REF *leaf, bool *leaf_foundp)
* Row-store search from a cursor.
*/
static inline int
-__cursor_row_search(WT_CURSOR_BTREE *cbt, bool insert, WT_REF *leaf, bool *leaf_foundp)
+__cursor_row_search(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_REF *leaf, bool insert)
{
WT_DECL_RET;
- WT_SESSION_IMPL *session;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
WT_WITH_PAGE_INDEX(
- session, ret = __wt_row_search(cbt, &cbt->iface.key, insert, leaf, false, leaf_foundp));
+ session, ret = __wt_row_search(session, &cbt->iface.key, leaf, cbt, insert, false));
return (ret);
}
@@ -399,9 +394,10 @@ __cursor_row_search(WT_CURSOR_BTREE *cbt, bool insert, WT_REF *leaf, bool *leaf_
* Column-store modify from a cursor, with a separate value.
*/
static inline int
-__cursor_col_modify_v(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
+__cursor_col_modify_v(
+ WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
{
- return (__wt_col_modify(cbt, cbt->iface.recno, value, NULL, modify_type, false));
+ return (__wt_col_modify(session, cbt, cbt->iface.recno, value, NULL, modify_type, false));
}
/*
@@ -409,9 +405,10 @@ __cursor_col_modify_v(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
* Row-store modify from a cursor, with a separate value.
*/
static inline int
-__cursor_row_modify_v(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
+__cursor_row_modify_v(
+ WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
{
- return (__wt_row_modify(cbt, &cbt->iface.key, value, NULL, modify_type, false));
+ return (__wt_row_modify(session, cbt, &cbt->iface.key, value, NULL, modify_type, false));
}
/*
@@ -419,9 +416,10 @@ __cursor_row_modify_v(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
* Column-store modify from a cursor.
*/
static inline int
-__cursor_col_modify(WT_CURSOR_BTREE *cbt, u_int modify_type)
+__cursor_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, u_int modify_type)
{
- return (__wt_col_modify(cbt, cbt->iface.recno, &cbt->iface.value, NULL, modify_type, false));
+ return (
+ __wt_col_modify(session, cbt, cbt->iface.recno, &cbt->iface.value, NULL, modify_type, false));
}
/*
@@ -429,9 +427,10 @@ __cursor_col_modify(WT_CURSOR_BTREE *cbt, u_int modify_type)
* Row-store modify from a cursor.
*/
static inline int
-__cursor_row_modify(WT_CURSOR_BTREE *cbt, u_int modify_type)
+__cursor_row_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, u_int modify_type)
{
- return (__wt_row_modify(cbt, &cbt->iface.key, &cbt->iface.value, NULL, modify_type, false));
+ return (
+ __wt_row_modify(session, cbt, &cbt->iface.key, &cbt->iface.value, NULL, modify_type, false));
}
/*
@@ -485,8 +484,8 @@ __wt_btcur_search_uncommitted(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp)
session = (WT_SESSION_IMPL *)cursor->session;
*updp = upd = NULL; /* -Wuninitialized */
- WT_RET(btree->type == BTREE_ROW ? __cursor_row_search(cbt, false, NULL, NULL) :
- __cursor_col_search(cbt, NULL, NULL));
+ WT_RET(btree->type == BTREE_ROW ? __cursor_row_search(session, cbt, NULL, false) :
+ __cursor_col_search(session, cbt, NULL));
/*
* Ideally exact match should be found, as this transaction has searched for updates done by
@@ -525,7 +524,7 @@ __wt_btcur_search(WT_CURSOR_BTREE *cbt)
WT_DECL_RET;
WT_SESSION_IMPL *session;
WT_UPDATE *upd;
- bool leaf_found, valid;
+ bool valid;
btree = cbt->btree;
cursor = &cbt->iface;
@@ -556,18 +555,18 @@ __wt_btcur_search(WT_CURSOR_BTREE *cbt)
if (__cursor_page_pinned(cbt, true)) {
__wt_txn_cursor_op(session);
- WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(cbt, false, cbt->ref, &leaf_found) :
- __cursor_col_search(cbt, cbt->ref, &leaf_found));
+ WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(session, cbt, cbt->ref, false) :
+ __cursor_col_search(session, cbt, cbt->ref));
/* Return, if prepare conflict encountered. */
- if (leaf_found && cbt->compare == 0)
+ if (cbt->compare == 0)
WT_ERR(__wt_cursor_valid(cbt, &upd, &valid));
}
if (!valid) {
WT_ERR(__cursor_func_init(cbt, true));
- WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(cbt, false, NULL, NULL) :
- __cursor_col_search(cbt, NULL, NULL));
+ WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(session, cbt, NULL, false) :
+ __cursor_col_search(session, cbt, NULL));
/* Return, if prepare conflict encountered. */
if (cbt->compare == 0)
@@ -575,7 +574,7 @@ __wt_btcur_search(WT_CURSOR_BTREE *cbt)
}
if (valid)
- ret = __cursor_kv_return(cbt, upd);
+ ret = __cursor_kv_return(session, cbt, upd);
else if (__cursor_fix_implicit(btree, cbt)) {
/*
* Creating a record past the end of the tree in a fixed-length column-store implicitly
@@ -592,7 +591,7 @@ __wt_btcur_search(WT_CURSOR_BTREE *cbt)
#ifdef HAVE_DIAGNOSTIC
if (ret == 0)
- WT_ERR(__wt_cursor_key_order_init(cbt));
+ WT_ERR(__wt_cursor_key_order_init(session, cbt));
#endif
err:
@@ -617,7 +616,7 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp)
WT_SESSION_IMPL *session;
WT_UPDATE *upd;
int exact;
- bool leaf_found, valid;
+ bool valid;
btree = cbt->btree;
cursor = &cbt->iface;
@@ -655,7 +654,7 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp)
if (btree->type == BTREE_ROW && __cursor_page_pinned(cbt, true)) {
__wt_txn_cursor_op(session);
- WT_ERR(__cursor_row_search(cbt, true, cbt->ref, &leaf_found));
+ WT_ERR(__cursor_row_search(session, cbt, cbt->ref, true));
/*
* Search-near is trickier than search when searching an already pinned page. If search
@@ -664,13 +663,13 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp)
* append lists (there may be no page slots or we might be legitimately positioned after the
* last page slot). Ignore those cases, it makes things too complicated.
*/
- if (leaf_found && cbt->slot != 0 && cbt->slot != cbt->ref->page->entries - 1)
+ if (cbt->slot != 0 && cbt->slot != cbt->ref->page->entries - 1)
WT_ERR(__wt_cursor_valid(cbt, &upd, &valid));
}
if (!valid) {
WT_ERR(__cursor_func_init(cbt, true));
- WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(cbt, true, NULL, NULL) :
- __cursor_col_search(cbt, NULL, NULL));
+ WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(session, cbt, NULL, true) :
+ __cursor_col_search(session, cbt, NULL));
WT_ERR(__wt_cursor_valid(cbt, &upd, &valid));
}
@@ -691,7 +690,7 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp)
*/
if (valid) {
exact = cbt->compare;
- ret = __cursor_kv_return(cbt, upd);
+ ret = __cursor_kv_return(session, cbt, upd);
} else if (__cursor_fix_implicit(btree, cbt)) {
cbt->recno = cursor->recno;
cbt->v = 0;
@@ -737,7 +736,7 @@ err:
#ifdef HAVE_DIAGNOSTIC
if (ret == 0)
- WT_TRET(__wt_cursor_key_order_init(cbt));
+ WT_TRET(__wt_cursor_key_order_init(session, cbt));
#endif
if (ret != 0) {
@@ -807,8 +806,8 @@ __wt_btcur_insert(WT_CURSOR_BTREE *cbt)
* Correct to an exact match so we can update whatever we're pointing at.
*/
cbt->compare = 0;
- ret = btree->type == BTREE_ROW ? __cursor_row_modify(cbt, WT_UPDATE_STANDARD) :
- __cursor_col_modify(cbt, WT_UPDATE_STANDARD);
+ ret = btree->type == BTREE_ROW ? __cursor_row_modify(session, cbt, WT_UPDATE_STANDARD) :
+ __cursor_col_modify(session, cbt, WT_UPDATE_STANDARD);
if (ret == 0)
goto done;
@@ -835,7 +834,7 @@ retry:
WT_ERR(__cursor_func_init(cbt, true));
if (btree->type == BTREE_ROW) {
- WT_ERR(__cursor_row_search(cbt, true, NULL, NULL));
+ WT_ERR(__cursor_row_search(session, cbt, NULL, true));
/*
* If not overwriting, fail if the key exists, else insert the key/value pair.
*/
@@ -845,7 +844,7 @@ retry:
WT_ERR(WT_DUPLICATE_KEY);
}
- ret = __cursor_row_modify(cbt, WT_UPDATE_STANDARD);
+ ret = __cursor_row_modify(session, cbt, WT_UPDATE_STANDARD);
} else if (append_key) {
/*
* Optionally insert a new record (ignoring the application's record number). The real
@@ -853,11 +852,11 @@ retry:
*/
cbt->iface.recno = WT_RECNO_OOB;
cbt->compare = 1;
- WT_ERR(__cursor_col_search(cbt, NULL, NULL));
- WT_ERR(__cursor_col_modify(cbt, WT_UPDATE_STANDARD));
+ WT_ERR(__cursor_col_search(session, cbt, NULL));
+ WT_ERR(__cursor_col_modify(session, cbt, WT_UPDATE_STANDARD));
cursor->recno = cbt->recno;
} else {
- WT_ERR(__cursor_col_search(cbt, NULL, NULL));
+ WT_ERR(__cursor_col_search(session, cbt, NULL));
/*
* If not overwriting, fail if the key exists. Creating a record past the end of the tree in
@@ -873,7 +872,7 @@ retry:
WT_ERR(WT_DUPLICATE_KEY);
}
- WT_ERR(__cursor_col_modify(cbt, WT_UPDATE_STANDARD));
+ WT_ERR(__cursor_col_modify(session, cbt, WT_UPDATE_STANDARD));
}
err:
@@ -953,7 +952,7 @@ __wt_btcur_insert_check(WT_CURSOR_BTREE *cbt)
retry:
WT_ERR(__cursor_func_init(cbt, true));
- WT_ERR(__cursor_row_search(cbt, true, NULL, NULL));
+ WT_ERR(__cursor_row_search(session, cbt, NULL, true));
/* Just check for conflicts. */
ret = __curfile_update_check(cbt);
@@ -1028,8 +1027,8 @@ __wt_btcur_remove(WT_CURSOR_BTREE *cbt, bool positioned)
* Correct to an exact match so we can remove whatever we're pointing at.
*/
cbt->compare = 0;
- ret = btree->type == BTREE_ROW ? __cursor_row_modify(cbt, WT_UPDATE_TOMBSTONE) :
- __cursor_col_modify(cbt, WT_UPDATE_TOMBSTONE);
+ ret = btree->type == BTREE_ROW ? __cursor_row_modify(session, cbt, WT_UPDATE_TOMBSTONE) :
+ __cursor_col_modify(session, cbt, WT_UPDATE_TOMBSTONE);
if (ret == 0)
goto done;
goto err;
@@ -1050,7 +1049,7 @@ retry:
WT_ERR(__cursor_func_init(cbt, true));
if (btree->type == BTREE_ROW) {
- ret = __cursor_row_search(cbt, false, NULL, NULL);
+ ret = __cursor_row_search(session, cbt, NULL, false);
if (ret == WT_NOTFOUND)
goto search_notfound;
WT_ERR(ret);
@@ -1064,9 +1063,9 @@ retry:
if (!valid)
goto search_notfound;
- ret = __cursor_row_modify(cbt, WT_UPDATE_TOMBSTONE);
+ ret = __cursor_row_modify(session, cbt, WT_UPDATE_TOMBSTONE);
} else {
- ret = __cursor_col_search(cbt, NULL, NULL);
+ ret = __cursor_col_search(session, cbt, NULL);
if (ret == WT_NOTFOUND)
goto search_notfound;
WT_ERR(ret);
@@ -1094,7 +1093,7 @@ retry:
*/
cbt->recno = cursor->recno;
} else
- ret = __cursor_col_modify(cbt, WT_UPDATE_TOMBSTONE);
+ ret = __cursor_col_modify(session, cbt, WT_UPDATE_TOMBSTONE);
}
err:
@@ -1112,7 +1111,7 @@ err:
*/
if (positioned) {
if (searched)
- WT_TRET(__wt_key_return(cbt));
+ WT_TRET(__wt_key_return(session, cbt));
} else {
F_CLR(cursor, WT_CURSTD_KEY_SET);
WT_TRET(__cursor_reset(cbt));
@@ -1175,7 +1174,7 @@ __btcur_update(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
WT_DECL_RET;
WT_SESSION_IMPL *session;
uint64_t yield_count, sleep_usecs;
- bool leaf_found, valid;
+ bool valid;
btree = cbt->btree;
cursor = &cbt->iface;
@@ -1204,8 +1203,8 @@ __btcur_update(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
* Correct to an exact match so we can update whatever we're pointing at.
*/
cbt->compare = 0;
- ret = btree->type == BTREE_ROW ? __cursor_row_modify_v(cbt, value, modify_type) :
- __cursor_col_modify_v(cbt, value, modify_type);
+ ret = btree->type == BTREE_ROW ? __cursor_row_modify_v(session, cbt, value, modify_type) :
+ __cursor_col_modify_v(session, cbt, value, modify_type);
if (ret == 0)
goto done;
@@ -1228,22 +1227,12 @@ __btcur_update(WT_CURSOR_BTREE *cbt, WT_ITEM *value, u_int modify_type)
WT_ERR(__cursor_localvalue(cursor));
__cursor_state_save(cursor, &state);
- /* If our caller configures for a local search and we have a page pinned, do that search. */
- if (F_ISSET(cursor, WT_CURSTD_UPDATE_LOCAL) && __cursor_page_pinned(cbt, true)) {
- __wt_txn_cursor_op(session);
-
- WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(cbt, true, cbt->ref, &leaf_found) :
- __cursor_col_search(cbt, cbt->ref, &leaf_found));
- if (leaf_found)
- goto update_local;
- }
-
retry:
WT_ERR(__cursor_func_init(cbt, true));
- WT_ERR(btree->type == BTREE_ROW ? __cursor_row_search(cbt, true, NULL, NULL) :
- __cursor_col_search(cbt, NULL, NULL));
-update_local:
+
if (btree->type == BTREE_ROW) {
+ WT_ERR(__cursor_row_search(session, cbt, NULL, true));
+
/*
* If not overwriting, check for conflicts and fail if the key does not exist.
*/
@@ -1255,8 +1244,10 @@ update_local:
if (!valid)
WT_ERR(WT_NOTFOUND);
}
- ret = __cursor_row_modify_v(cbt, value, modify_type);
+ ret = __cursor_row_modify_v(session, cbt, value, modify_type);
} else {
+ WT_ERR(__cursor_col_search(session, cbt, NULL));
+
/*
* If not overwriting, fail if the key doesn't exist. If we find an update for the key,
* check for conflicts. Update the record if it exists. Creating a record past the end of
@@ -1271,7 +1262,7 @@ update_local:
if ((cbt->compare != 0 || !valid) && !__cursor_fix_implicit(btree, cbt))
WT_ERR(WT_NOTFOUND);
}
- ret = __cursor_col_modify_v(cbt, value, modify_type);
+ ret = __cursor_col_modify_v(session, cbt, value, modify_type);
}
err:
@@ -1294,7 +1285,7 @@ done:
/*
* WT_CURSOR.update returns a key and a value.
*/
- ret = __cursor_kv_return(cbt, cbt->modify_update);
+ ret = __cursor_kv_return(session, cbt, cbt->modify_update);
break;
case WT_UPDATE_RESERVE:
/*
@@ -1307,7 +1298,7 @@ done:
* WT_CURSOR.modify has already created the return value and our job is to leave it
* untouched.
*/
- ret = __wt_key_return(cbt);
+ ret = __wt_key_return(session, cbt);
break;
case WT_UPDATE_BIRTHMARK:
case WT_UPDATE_TOMBSTONE:
@@ -1631,14 +1622,12 @@ __wt_btcur_equals(WT_CURSOR_BTREE *a_arg, WT_CURSOR_BTREE *b_arg, int *equalp)
* Discard a cursor range from row-store or variable-width column-store tree.
*/
static int
-__cursor_truncate(
- WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop, int (*rmfunc)(WT_CURSOR_BTREE *, u_int))
+__cursor_truncate(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop,
+ int (*rmfunc)(WT_SESSION_IMPL *, WT_CURSOR_BTREE *, u_int))
{
WT_DECL_RET;
- WT_SESSION_IMPL *session;
uint64_t yield_count, sleep_usecs;
- session = (WT_SESSION_IMPL *)start->iface.session;
yield_count = sleep_usecs = 0;
/*
@@ -1661,7 +1650,7 @@ retry:
WT_ASSERT(session, F_MASK((WT_CURSOR *)start, WT_CURSTD_KEY_SET) == WT_CURSTD_KEY_INT);
for (;;) {
- WT_ERR(rmfunc(start, WT_UPDATE_TOMBSTONE));
+ WT_ERR(rmfunc(session, start, WT_UPDATE_TOMBSTONE));
if (stop != NULL && __cursor_equals(start, stop))
return (0);
@@ -1686,15 +1675,13 @@ err:
* Discard a cursor range from fixed-width column-store tree.
*/
static int
-__cursor_truncate_fix(
- WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop, int (*rmfunc)(WT_CURSOR_BTREE *, u_int))
+__cursor_truncate_fix(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop,
+ int (*rmfunc)(WT_SESSION_IMPL *, WT_CURSOR_BTREE *, u_int))
{
WT_DECL_RET;
- WT_SESSION_IMPL *session;
uint64_t yield_count, sleep_usecs;
const uint8_t *value;
- session = (WT_SESSION_IMPL *)start->iface.session;
yield_count = sleep_usecs = 0;
/*
@@ -1720,7 +1707,7 @@ retry:
for (;;) {
value = (const uint8_t *)start->iface.value.data;
if (*value != 0)
- WT_ERR(rmfunc(start, WT_UPDATE_TOMBSTONE));
+ WT_ERR(rmfunc(session, start, WT_UPDATE_TOMBSTONE));
if (stop != NULL && __cursor_equals(start, stop))
return (0);
@@ -1768,10 +1755,10 @@ __wt_btcur_range_truncate(WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop)
switch (btree->type) {
case BTREE_COL_FIX:
- WT_ERR(__cursor_truncate_fix(start, stop, __cursor_col_modify));
+ WT_ERR(__cursor_truncate_fix(session, start, stop, __cursor_col_modify));
break;
case BTREE_COL_VAR:
- WT_ERR(__cursor_truncate(start, stop, __cursor_col_modify));
+ WT_ERR(__cursor_truncate(session, start, stop, __cursor_col_modify));
break;
case BTREE_ROW:
/*
@@ -1783,7 +1770,7 @@ __wt_btcur_range_truncate(WT_CURSOR_BTREE *start, WT_CURSOR_BTREE *stop)
* setting up the truncate so we're good to go: if that ever changes, we'd need to do
* something here to ensure a fully instantiated cursor.
*/
- WT_ERR(__cursor_truncate(start, stop, __cursor_row_modify));
+ WT_ERR(__cursor_truncate(session, start, stop, __cursor_row_modify));
break;
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_random.c b/src/third_party/wiredtiger/src/btree/bt_random.c
index d35d7f63a54..6acccf699a4 100644
--- a/src/third_party/wiredtiger/src/btree/bt_random.c
+++ b/src/third_party/wiredtiger/src/btree/bt_random.c
@@ -55,14 +55,12 @@ __random_slot_valid(WT_CURSOR_BTREE *cbt, uint32_t slot, WT_UPDATE **updp, bool
* Return an estimate of how many entries are in a skip list.
*/
static uint32_t
-__random_skip_entries(WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head)
+__random_skip_entries(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head)
{
WT_INSERT **t;
- WT_SESSION_IMPL *session;
uint32_t entries;
int level;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
entries = 0; /* [-Wconditional-uninitialized] */
if (ins_head == NULL)
@@ -104,19 +102,16 @@ __random_skip_entries(WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head)
* Return a random key/value from a skip list.
*/
static int
-__random_leaf_skip(
- WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head, uint32_t entries, WT_UPDATE **updp, bool *validp)
+__random_leaf_skip(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head,
+ uint32_t entries, WT_UPDATE **updp, bool *validp)
{
WT_INSERT *ins, *saved_ins;
- WT_SESSION_IMPL *session;
uint32_t i;
int retry;
*updp = NULL;
*validp = false;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
-
/* This is a relatively expensive test, try a few times then quit. */
for (retry = 0; retry < WT_RANDOM_SKIP_RETRY; ++retry) {
/*
@@ -164,24 +159,22 @@ __random_leaf_skip(
* Look for a large insert list from which we can select a random item.
*/
static int
-__random_leaf_insert(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
+__random_leaf_insert(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
{
WT_INSERT_HEAD *ins_head;
WT_PAGE *page;
- WT_SESSION_IMPL *session;
uint32_t entries, slot, start;
*updp = NULL;
*validp = false;
page = cbt->ref->page;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
/* Check for a large insert list with no items, that's common when tables are newly created. */
ins_head = WT_ROW_INSERT_SMALLEST(page);
- entries = __random_skip_entries(cbt, ins_head);
+ entries = __random_skip_entries(session, cbt, ins_head);
if (entries >= WT_RANDOM_SKIP_INSERT_SMALLEST_ENOUGH) {
- WT_RET(__random_leaf_skip(cbt, ins_head, entries, updp, validp));
+ WT_RET(__random_leaf_skip(session, cbt, ins_head, entries, updp, validp));
if (*validp)
return (0);
}
@@ -195,18 +188,18 @@ __random_leaf_insert(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
start = __wt_random(&session->rnd) % page->entries;
for (slot = start; slot < page->entries; ++slot) {
ins_head = WT_ROW_INSERT(page, &page->pg_row[slot]);
- entries = __random_skip_entries(cbt, ins_head);
+ entries = __random_skip_entries(session, cbt, ins_head);
if (entries >= WT_RANDOM_SKIP_INSERT_ENOUGH) {
- WT_RET(__random_leaf_skip(cbt, ins_head, entries, updp, validp));
+ WT_RET(__random_leaf_skip(session, cbt, ins_head, entries, updp, validp));
if (*validp)
return (0);
}
}
for (slot = 0; slot < start; ++slot) {
ins_head = WT_ROW_INSERT(page, &page->pg_row[slot]);
- entries = __random_skip_entries(cbt, ins_head);
+ entries = __random_skip_entries(session, cbt, ins_head);
if (entries >= WT_RANDOM_SKIP_INSERT_ENOUGH) {
- WT_RET(__random_leaf_skip(cbt, ins_head, entries, updp, validp));
+ WT_RET(__random_leaf_skip(session, cbt, ins_head, entries, updp, validp));
if (*validp)
return (0);
}
@@ -215,9 +208,9 @@ __random_leaf_insert(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
/* Fall back to the single insert list, if it's not tiny. */
ins_head = WT_ROW_INSERT_SMALLEST(page);
- entries = __random_skip_entries(cbt, ins_head);
+ entries = __random_skip_entries(session, cbt, ins_head);
if (entries >= WT_RANDOM_SKIP_INSERT_ENOUGH) {
- WT_RET(__random_leaf_skip(cbt, ins_head, entries, updp, validp));
+ WT_RET(__random_leaf_skip(session, cbt, ins_head, entries, updp, validp));
if (*validp)
return (0);
}
@@ -232,10 +225,9 @@ __random_leaf_insert(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
* Return a random key/value from a page's on-disk entries.
*/
static int
-__random_leaf_disk(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
+__random_leaf_disk(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
{
WT_PAGE *page;
- WT_SESSION_IMPL *session;
uint32_t entries, slot;
int retry;
@@ -243,7 +235,6 @@ __random_leaf_disk(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
*validp = false;
page = cbt->ref->page;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
entries = cbt->ref->page->entries;
/* This is a relatively cheap test, so try several times. */
@@ -269,17 +260,15 @@ __random_leaf_disk(WT_CURSOR_BTREE *cbt, WT_UPDATE **updp, bool *validp)
* Return a random key/value from a row-store leaf page.
*/
static int
-__random_leaf(WT_CURSOR_BTREE *cbt)
+__random_leaf(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
{
WT_CURSOR *cursor;
WT_DECL_RET;
- WT_SESSION_IMPL *session;
WT_UPDATE *upd;
uint32_t i;
bool next, valid;
cursor = (WT_CURSOR *)cbt;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
/*
* If the page has a sufficiently large number of disk-based entries, randomly select from them.
@@ -287,24 +276,24 @@ __random_leaf(WT_CURSOR_BTREE *cbt)
* a reasonable chunk of the name space.
*/
if (cbt->ref->page->entries > WT_RANDOM_DISK_ENOUGH) {
- WT_RET(__random_leaf_disk(cbt, &upd, &valid));
+ WT_RET(__random_leaf_disk(session, cbt, &upd, &valid));
if (valid)
- return (__cursor_kv_return(cbt, upd));
+ return (__cursor_kv_return(session, cbt, upd));
}
/* Look for any large insert list and select from it. */
- WT_RET(__random_leaf_insert(cbt, &upd, &valid));
+ WT_RET(__random_leaf_insert(session, cbt, &upd, &valid));
if (valid)
- return (__cursor_kv_return(cbt, upd));
+ return (__cursor_kv_return(session, cbt, upd));
/*
* Try again if there are at least a few hundred disk-based entries: this may be a normal leaf
* page with big items.
*/
if (cbt->ref->page->entries > WT_RANDOM_DISK_ENOUGH / 2) {
- WT_RET(__random_leaf_disk(cbt, &upd, &valid));
+ WT_RET(__random_leaf_disk(session, cbt, &upd, &valid));
if (valid)
- return (__cursor_kv_return(cbt, upd));
+ return (__cursor_kv_return(session, cbt, upd));
}
/*
@@ -519,7 +508,7 @@ __wt_btcur_next_random(WT_CURSOR_BTREE *cbt)
WT_ERR(__cursor_func_init(cbt, true));
WT_WITH_PAGE_INDEX(session, ret = __wt_random_descent(session, &cbt->ref, read_flags));
if (ret == 0) {
- WT_ERR(__random_leaf(cbt));
+ WT_ERR(__random_leaf(session, cbt));
return (0);
}
@@ -593,7 +582,7 @@ __wt_btcur_next_random(WT_CURSOR_BTREE *cbt)
WT_ERR(__wt_btcur_next(cbt, false));
/* Select a random entry from the leaf page. */
- WT_ERR(__random_leaf(cbt));
+ WT_ERR(__random_leaf(session, cbt));
return (0);
diff --git a/src/third_party/wiredtiger/src/btree/bt_read.c b/src/third_party/wiredtiger/src/btree/bt_read.c
index 81adc9de7a1..e75680fc946 100644
--- a/src/third_party/wiredtiger/src/btree/bt_read.c
+++ b/src/third_party/wiredtiger/src/btree/bt_read.c
@@ -31,8 +31,8 @@ __col_instantiate(
__wt_free_update_list(session, upd);
/* Search the page and add updates. */
- WT_RET(__wt_col_search(cbt, recno, ref, true, NULL));
- WT_RET(__wt_col_modify(cbt, recno, NULL, updlist, WT_UPDATE_INVALID, false));
+ WT_RET(__wt_col_search(session, recno, ref, cbt, true));
+ WT_RET(__wt_col_modify(session, cbt, recno, NULL, updlist, WT_UPDATE_INVALID, false));
return (0);
}
@@ -59,8 +59,8 @@ __row_instantiate(
__wt_free_update_list(session, upd);
/* Search the page and add updates. */
- WT_RET(__wt_row_search(cbt, key, true, ref, true, NULL));
- WT_RET(__wt_row_modify(cbt, key, NULL, updlist, WT_UPDATE_INVALID, false));
+ WT_RET(__wt_row_search(session, key, ref, cbt, true, true));
+ WT_RET(__wt_row_modify(session, cbt, key, NULL, updlist, WT_UPDATE_INVALID, false));
return (0);
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_ret.c b/src/third_party/wiredtiger/src/btree/bt_ret.c
index b182b1f8468..d9d1d8263a8 100644
--- a/src/third_party/wiredtiger/src/btree/bt_ret.c
+++ b/src/third_party/wiredtiger/src/btree/bt_ret.c
@@ -13,17 +13,15 @@
* Change the cursor to reference an internal return key.
*/
static inline int
-__key_return(WT_CURSOR_BTREE *cbt)
+__key_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
{
WT_CURSOR *cursor;
WT_ITEM *tmp;
WT_PAGE *page;
WT_ROW *rip;
- WT_SESSION_IMPL *session;
page = cbt->ref->page;
cursor = &cbt->iface;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
if (page->type == WT_PAGE_ROW_LEAF) {
rip = &page->pg_row[cbt->slot];
@@ -74,7 +72,7 @@ __key_return(WT_CURSOR_BTREE *cbt)
* Change the cursor to reference an internal original-page return value.
*/
static inline int
-__value_return(WT_CURSOR_BTREE *cbt)
+__value_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
{
WT_BTREE *btree;
WT_CELL *cell;
@@ -82,10 +80,8 @@ __value_return(WT_CURSOR_BTREE *cbt)
WT_CURSOR *cursor;
WT_PAGE *page;
WT_ROW *rip;
- WT_SESSION_IMPL *session;
uint8_t v;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
btree = S2BT(session);
page = cbt->ref->page;
@@ -127,18 +123,17 @@ __value_return(WT_CURSOR_BTREE *cbt)
* Change the cursor to reference an internal update structure return value.
*/
int
-__wt_value_return_upd(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd, bool ignore_visibility)
+__wt_value_return_upd(
+ WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd, bool ignore_visibility)
{
WT_CURSOR *cursor;
WT_DECL_RET;
- WT_SESSION_IMPL *session;
WT_UPDATE **listp, *list[WT_MODIFY_ARRAY_SIZE];
size_t allocated_bytes;
u_int i;
bool skipped_birthmark;
cursor = &cbt->iface;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
allocated_bytes = 0;
/*
@@ -217,7 +212,7 @@ __wt_value_return_upd(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd, bool ignore_visibili
*/
WT_ASSERT(session, cbt->slot != UINT32_MAX);
- WT_ERR(__value_return(cbt));
+ WT_ERR(__value_return(session, cbt));
}
} else if (upd->type == WT_UPDATE_TOMBSTONE)
WT_ERR(__wt_buf_set(session, &cursor->value, "", 0));
@@ -241,7 +236,7 @@ err:
* Change the cursor to reference an internal return key.
*/
int
-__wt_key_return(WT_CURSOR_BTREE *cbt)
+__wt_key_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
{
WT_CURSOR *cursor;
@@ -257,7 +252,7 @@ __wt_key_return(WT_CURSOR_BTREE *cbt)
*/
F_CLR(cursor, WT_CURSTD_KEY_EXT);
if (!F_ISSET(cursor, WT_CURSTD_KEY_INT)) {
- WT_RET(__key_return(cbt));
+ WT_RET(__key_return(session, cbt));
F_SET(cursor, WT_CURSTD_KEY_INT);
}
return (0);
@@ -268,7 +263,7 @@ __wt_key_return(WT_CURSOR_BTREE *cbt)
* Change the cursor to reference an internal return value.
*/
int
-__wt_value_return(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
+__wt_value_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
{
WT_CURSOR *cursor;
@@ -276,9 +271,9 @@ __wt_value_return(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
F_CLR(cursor, WT_CURSTD_VALUE_EXT);
if (upd == NULL)
- WT_RET(__value_return(cbt));
+ WT_RET(__value_return(session, cbt));
else
- WT_RET(__wt_value_return_upd(cbt, upd, false));
+ WT_RET(__wt_value_return_upd(session, cbt, upd, false));
F_SET(cursor, WT_CURSTD_VALUE_INT);
return (0);
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_split.c b/src/third_party/wiredtiger/src/btree/bt_split.c
index 4212d820e60..f22036e1ebb 100644
--- a/src/third_party/wiredtiger/src/btree/bt_split.c
+++ b/src/third_party/wiredtiger/src/btree/bt_split.c
@@ -1445,10 +1445,10 @@ __split_multi_inmem(WT_SESSION_IMPL *session, WT_PAGE *orig, WT_MULTI *multi, WT
recno = WT_INSERT_RECNO(supd->ins);
/* Search the page. */
- WT_ERR(__wt_col_search(&cbt, recno, ref, true, NULL));
+ WT_ERR(__wt_col_search(session, recno, ref, &cbt, true));
/* Apply the modification. */
- WT_ERR(__wt_col_modify(&cbt, recno, NULL, upd, WT_UPDATE_INVALID, true));
+ WT_ERR(__wt_col_modify(session, &cbt, recno, NULL, upd, WT_UPDATE_INVALID, true));
break;
case WT_PAGE_ROW_LEAF:
/* Build a key. */
@@ -1467,13 +1467,15 @@ __split_multi_inmem(WT_SESSION_IMPL *session, WT_PAGE *orig, WT_MULTI *multi, WT
WT_ASSERT(session, __wt_count_birthmarks(upd) <= 1);
/* Search the page. */
- WT_ERR(__wt_row_search(&cbt, key, true, ref, true, NULL));
+ WT_ERR(__wt_row_search(session, key, ref, &cbt, true, true));
- /* Birthmarks should only be applied to on-page values. */
+ /*
+ * Birthmarks should only be applied to on-page values.
+ */
WT_ASSERT(session, cbt.compare == 0 || upd->type != WT_UPDATE_BIRTHMARK);
/* Apply the modification. */
- WT_ERR(__wt_row_modify(&cbt, key, NULL, upd, WT_UPDATE_INVALID, true));
+ WT_ERR(__wt_row_modify(session, &cbt, key, NULL, upd, WT_UPDATE_INVALID, true));
break;
default:
WT_ERR(__wt_illegal_value(session, orig->type));
diff --git a/src/third_party/wiredtiger/src/btree/col_modify.c b/src/third_party/wiredtiger/src/btree/col_modify.c
index 592bc7ebeae..8a6c6e8aa2e 100644
--- a/src/third_party/wiredtiger/src/btree/col_modify.c
+++ b/src/third_party/wiredtiger/src/btree/col_modify.c
@@ -15,8 +15,8 @@ static int __col_insert_alloc(WT_SESSION_IMPL *, uint64_t, u_int, WT_INSERT **,
* Column-store delete, insert, and update.
*/
int
-__wt_col_modify(WT_CURSOR_BTREE *cbt, uint64_t recno, const WT_ITEM *value, WT_UPDATE *upd_arg,
- u_int modify_type, bool exclusive)
+__wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, uint64_t recno,
+ const WT_ITEM *value, WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
{
static const WT_ITEM col_fix_remove = {"", 1, NULL, 0, 0};
WT_BTREE *btree;
@@ -25,7 +25,6 @@ __wt_col_modify(WT_CURSOR_BTREE *cbt, uint64_t recno, const WT_ITEM *value, WT_U
WT_INSERT_HEAD *ins_head, **ins_headp;
WT_PAGE *page;
WT_PAGE_MODIFY *mod;
- WT_SESSION_IMPL *session;
WT_UPDATE *old_upd, *upd;
size_t ins_size, upd_size;
u_int i, skipdepth;
@@ -34,7 +33,6 @@ __wt_col_modify(WT_CURSOR_BTREE *cbt, uint64_t recno, const WT_ITEM *value, WT_U
btree = cbt->btree;
ins = NULL;
page = cbt->ref->page;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
upd = upd_arg;
append = logged = false;
diff --git a/src/third_party/wiredtiger/src/btree/col_srch.c b/src/third_party/wiredtiger/src/btree/col_srch.c
index b7515bf6b42..160f19ffc2a 100644
--- a/src/third_party/wiredtiger/src/btree/col_srch.c
+++ b/src/third_party/wiredtiger/src/btree/col_srch.c
@@ -59,7 +59,7 @@ __check_leaf_key_range(WT_SESSION_IMPL *session, uint64_t recno, WT_REF *leaf, W
*/
int
__wt_col_search(
- WT_CURSOR_BTREE *cbt, uint64_t search_recno, WT_REF *leaf, bool leaf_safe, bool *leaf_foundp)
+ WT_SESSION_IMPL *session, uint64_t search_recno, WT_REF *leaf, WT_CURSOR_BTREE *cbt, bool restore)
{
WT_BTREE *btree;
WT_COL *cip;
@@ -69,12 +69,10 @@ __wt_col_search(
WT_PAGE *page;
WT_PAGE_INDEX *pindex, *parent_pindex;
WT_REF *current, *descent;
- WT_SESSION_IMPL *session;
uint64_t recno;
uint32_t base, indx, limit, read_flags;
int depth;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
btree = S2BT(session);
current = NULL;
@@ -90,18 +88,23 @@ __wt_col_search(
/*
* We may be searching only a single leaf page, not the full tree. In the normal case where we
* are searching a tree, check the page's parent keys before doing the full search, it's faster
- * when the cursor is being re-positioned. Skip that check if we know the page is the right one
- * (for example, when re-instantiating a page in memory, in that case we know the target must be
- * on the current page).
+ * when the cursor is being re-positioned. Skip this if the page is being re-instantiated in
+ * memory.
*/
if (leaf != NULL) {
WT_ASSERT(session, search_recno != WT_RECNO_OOB);
- if (!leaf_safe) {
+ if (!restore) {
WT_RET(__check_leaf_key_range(session, recno, leaf, cbt));
- *leaf_foundp = cbt->compare == 0;
- if (!*leaf_foundp)
+ if (cbt->compare != 0) {
+ /*
+ * !!!
+ * WT_CURSOR.search_near uses the slot value to
+ * decide if there was an on-page match.
+ */
+ cbt->slot = 0;
return (0);
+ }
}
current = leaf;
diff --git a/src/third_party/wiredtiger/src/btree/row_modify.c b/src/third_party/wiredtiger/src/btree/row_modify.c
index 30f27b19048..25accf8c60b 100644
--- a/src/third_party/wiredtiger/src/btree/row_modify.c
+++ b/src/third_party/wiredtiger/src/btree/row_modify.c
@@ -41,15 +41,14 @@ err:
* Row-store insert, update and delete.
*/
int
-__wt_row_modify(WT_CURSOR_BTREE *cbt, const WT_ITEM *key, const WT_ITEM *value, WT_UPDATE *upd_arg,
- u_int modify_type, bool exclusive)
+__wt_row_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, const WT_ITEM *key,
+ const WT_ITEM *value, WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
{
WT_DECL_RET;
WT_INSERT *ins;
WT_INSERT_HEAD *ins_head, **ins_headp;
WT_PAGE *page;
WT_PAGE_MODIFY *mod;
- WT_SESSION_IMPL *session;
WT_UPDATE *old_upd, *upd, **upd_entry;
size_t ins_size, upd_size;
uint32_t ins_slot;
@@ -58,7 +57,6 @@ __wt_row_modify(WT_CURSOR_BTREE *cbt, const WT_ITEM *key, const WT_ITEM *value,
ins = NULL;
page = cbt->ref->page;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
upd = upd_arg;
logged = false;
diff --git a/src/third_party/wiredtiger/src/btree/row_srch.c b/src/third_party/wiredtiger/src/btree/row_srch.c
index 26328dee4d6..9b69c0aa9ed 100644
--- a/src/third_party/wiredtiger/src/btree/row_srch.c
+++ b/src/third_party/wiredtiger/src/btree/row_srch.c
@@ -206,8 +206,8 @@ __check_leaf_key_range(
* Search a row-store tree for a specific key.
*/
int
-__wt_row_search(WT_CURSOR_BTREE *cbt, WT_ITEM *srch_key, bool insert, WT_REF *leaf, bool leaf_safe,
- bool *leaf_foundp)
+__wt_row_search(WT_SESSION_IMPL *session, WT_ITEM *srch_key, WT_REF *leaf, WT_CURSOR_BTREE *cbt,
+ bool insert, bool restore)
{
WT_BTREE *btree;
WT_COLLATOR *collator;
@@ -218,13 +218,11 @@ __wt_row_search(WT_CURSOR_BTREE *cbt, WT_ITEM *srch_key, bool insert, WT_REF *le
WT_PAGE_INDEX *pindex, *parent_pindex;
WT_REF *current, *descent;
WT_ROW *rip;
- WT_SESSION_IMPL *session;
size_t match, skiphigh, skiplow;
uint32_t base, indx, limit, read_flags;
int cmp, depth;
bool append_check, descend_right, done;
- session = (WT_SESSION_IMPL *)cbt->iface.session;
btree = S2BT(session);
collator = btree->collator;
item = cbt->tmp;
@@ -253,16 +251,21 @@ __wt_row_search(WT_CURSOR_BTREE *cbt, WT_ITEM *srch_key, bool insert, WT_REF *le
/*
* We may be searching only a single leaf page, not the full tree. In the normal case where we
* are searching a tree, check the page's parent keys before doing the full search, it's faster
- * when the cursor is being re-positioned. Skip that check if we know the page is the right one
- * (for example, when re-instantiating a page in memory, in that case we know the target must be
- * on the current page).
+ * when the cursor is being re-positioned. Skip this if the page is being re-instantiated in
+ * memory.
*/
if (leaf != NULL) {
- if (!leaf_safe) {
+ if (!restore) {
WT_RET(__check_leaf_key_range(session, srch_key, leaf, cbt));
- *leaf_foundp = cbt->compare == 0;
- if (!*leaf_foundp)
+ if (cbt->compare != 0) {
+ /*
+ * !!!
+ * WT_CURSOR.search_near uses the slot value to
+ * decide if there was an on-page match.
+ */
+ cbt->slot = 0;
return (0);
+ }
}
current = leaf;
diff --git a/src/third_party/wiredtiger/src/cache/cache_las.c b/src/third_party/wiredtiger/src/cache/cache_las.c
index 2cacc57e6fb..164cacf4ea4 100644
--- a/src/third_party/wiredtiger/src/cache/cache_las.c
+++ b/src/third_party/wiredtiger/src/cache/cache_las.c
@@ -646,9 +646,6 @@ __wt_las_insert_block(
__las_set_isolation(session, &saved_isolation);
local_txn = true;
- /* Inserts should be on the same page absent a split, search any pinned leaf page. */
- F_SET(cursor, WT_CURSTD_UPDATE_LOCAL);
-
/* Enter each update in the boundary's list into the lookaside store. */
for (las_counter = 0, i = 0, list = multi->supd; i < multi->supd_entries; ++i, ++list) {
/* Lookaside table key component: source key. */
@@ -747,11 +744,8 @@ __wt_las_insert_block(
cursor->set_value(cursor, upd->txnid, upd->start_ts, upd->durable_ts,
upd->prepare_state, upd->type, &las_value);
- /*
- * Using update instead of insert so the page stays pinned and can be searched before
- * the tree.
- */
- WT_ERR(cursor->update(cursor));
+ /* Using insert so we don't keep the page pinned longer than necessary. */
+ WT_ERR(cursor->insert(cursor));
++insert_cnt;
if (upd->prepare_state == WT_PREPARE_INPROGRESS)
++prepared_insert_cnt;
@@ -775,7 +769,6 @@ err:
else
WT_TRET(__wt_txn_rollback(session, NULL));
__las_restore_isolation(session, saved_isolation);
- F_CLR(cursor, WT_CURSTD_UPDATE_LOCAL);
/* Adjust the entry count. */
if (ret == 0) {
diff --git a/src/third_party/wiredtiger/src/include/cursor.i b/src/third_party/wiredtiger/src/include/cursor.i
index 7d637168ad1..18c5d146a9e 100644
--- a/src/third_party/wiredtiger/src/include/cursor.i
+++ b/src/third_party/wiredtiger/src/include/cursor.i
@@ -303,10 +303,10 @@ __wt_cursor_dhandle_decr_use(WT_SESSION_IMPL *session)
* Return a page referenced key/value pair to the application.
*/
static inline int
-__cursor_kv_return(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
+__cursor_kv_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
{
- WT_RET(__wt_key_return(cbt));
- WT_RET(__wt_value_return(cbt, upd));
+ WT_RET(__wt_key_return(session, cbt));
+ WT_RET(__wt_value_return(session, cbt, upd));
return (0);
}
@@ -441,7 +441,7 @@ value:
* (if any) is visible.
*/
if (upd != NULL)
- return (__wt_value_return(cbt, upd));
+ return (__wt_value_return(session, cbt, upd));
/* Else, simple values have their location encoded in the WT_ROW. */
if (__wt_row_leaf_value(page, rip, vb))
diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h
index d42e0d43d9d..31adeadc902 100644
--- a/src/third_party/wiredtiger/src/include/extern.h
+++ b/src/third_party/wiredtiger/src/include/extern.h
@@ -366,11 +366,11 @@ extern int __wt_clsm_open_bulk(WT_CURSOR_LSM *clsm, const char *cfg[])
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_clsm_request_switch(WT_CURSOR_LSM *clsm)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_col_modify(WT_CURSOR_BTREE *cbt, uint64_t recno, const WT_ITEM *value,
- WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
+extern int __wt_col_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, uint64_t recno,
+ const WT_ITEM *value, WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_col_search(WT_CURSOR_BTREE *cbt, uint64_t search_recno, WT_REF *leaf,
- bool leaf_safe, bool *leaf_foundp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_col_search(WT_SESSION_IMPL *session, uint64_t search_recno, WT_REF *leaf,
+ WT_CURSOR_BTREE *cbt, bool restore) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_collator_config(WT_SESSION_IMPL *session, const char *uri, WT_CONFIG_ITEM *cname,
WT_CONFIG_ITEM *metadata, WT_COLLATOR **collatorp, int *ownp)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
@@ -532,7 +532,7 @@ extern int __wt_cursor_init(WT_CURSOR *cursor, const char *uri, WT_CURSOR *owner
WT_CURSOR **cursorp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_cursor_key_order_check(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, bool next)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_cursor_key_order_init(WT_CURSOR_BTREE *cbt)
+extern int __wt_cursor_key_order_init(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_cursor_kv_not_set(WT_CURSOR *cursor, bool key) WT_GCC_FUNC_DECL_ATTRIBUTE((cold))
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
@@ -752,7 +752,8 @@ extern int __wt_json_to_item(WT_SESSION_IMPL *session, const char *jstr, const c
extern int __wt_json_token(WT_SESSION *wt_session, const char *src, int *toktype,
const char **tokstart, size_t *toklen) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")))
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_key_return(WT_CURSOR_BTREE *cbt) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_key_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt)
+ WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_las_config(WT_SESSION_IMPL *session, const char **cfg)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_las_create(WT_SESSION_IMPL *session, const char **cfg)
@@ -1192,11 +1193,11 @@ extern int __wt_row_leaf_key_work(WT_SESSION_IMPL *session, WT_PAGE *page, WT_RO
WT_ITEM *keyb, bool instantiate) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_row_leaf_keys(WT_SESSION_IMPL *session, WT_PAGE *page)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_row_modify(WT_CURSOR_BTREE *cbt, const WT_ITEM *key, const WT_ITEM *value,
- WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
+extern int __wt_row_modify(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, const WT_ITEM *key,
+ const WT_ITEM *value, WT_UPDATE *upd_arg, u_int modify_type, bool exclusive)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_row_search(WT_CURSOR_BTREE *cbt, WT_ITEM *srch_key, bool insert, WT_REF *leaf,
- bool leaf_safe, bool *leaf_foundp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_row_search(WT_SESSION_IMPL *session, WT_ITEM *srch_key, WT_REF *leaf,
+ WT_CURSOR_BTREE *cbt, bool insert, bool restore) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_rwlock_init(WT_SESSION_IMPL *session, WT_RWLOCK *l)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_salvage(WT_SESSION_IMPL *session, const char *cfg[])
@@ -1490,10 +1491,10 @@ extern int __wt_update_alloc(WT_SESSION_IMPL *session, const WT_ITEM *value, WT_
size_t *sizep, u_int modify_type) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_upgrade(WT_SESSION_IMPL *session, const char *cfg[])
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_value_return(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
- WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_value_return_upd(WT_CURSOR_BTREE *cbt, WT_UPDATE *upd, bool ignore_visibility)
+extern int __wt_value_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_value_return_upd(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd,
+ bool ignore_visibility) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_verbose_config(WT_SESSION_IMPL *session, const char *cfg[])
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_verbose_dump_cache(WT_SESSION_IMPL *session)
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index aec3014e788..7558f348313 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -718,9 +718,8 @@ struct __wt_cursor {
#define WT_CURSTD_OVERWRITE 0x02000u
#define WT_CURSTD_RAW 0x04000u
#define WT_CURSTD_RAW_SEARCH 0x08000u
-#define WT_CURSTD_UPDATE_LOCAL 0x10000u
-#define WT_CURSTD_VALUE_EXT 0x20000u /* Value points out of tree. */
-#define WT_CURSTD_VALUE_INT 0x40000u /* Value points into tree. */
+#define WT_CURSTD_VALUE_EXT 0x10000u /* Value points out of tree. */
+#define WT_CURSTD_VALUE_INT 0x20000u /* Value points into tree. */
/* AUTOMATIC FLAG VALUE GENERATION STOP */
#define WT_CURSTD_KEY_SET (WT_CURSTD_KEY_EXT | WT_CURSTD_KEY_INT)
#define WT_CURSTD_VALUE_SET (WT_CURSTD_VALUE_EXT | WT_CURSTD_VALUE_INT)
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_col.c b/src/third_party/wiredtiger/src/reconcile/rec_col.c
index ca6b0b4adaa..0b52a9e657a 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_col.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_col.c
@@ -606,14 +606,12 @@ __wt_rec_col_var(
btree = S2BT(session);
vpack = &_vpack;
+ cbt = &r->update_modify_cbt;
page = pageref->page;
upd = NULL;
size = 0;
data = NULL;
- cbt = &r->update_modify_cbt;
- cbt->iface.session = (WT_SESSION *)session;
-
/*
* Acquire the newest-durable timestamp for this page so we can roll it forward. If it exists,
* it's in the WT_REF structure or the parent's disk image.
@@ -774,7 +772,8 @@ __wt_rec_col_var(
switch (upd->type) {
case WT_UPDATE_MODIFY:
cbt->slot = WT_COL_SLOT(page, cip);
- WT_ERR(__wt_value_return_upd(cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
+ WT_ERR(
+ __wt_value_return_upd(session, cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
data = cbt->iface.value.data;
size = (uint32_t)cbt->iface.value.size;
update_no_copy = false;
@@ -1031,7 +1030,8 @@ compare:
* Impossible slot, there's no backing on-page item.
*/
cbt->slot = UINT32_MAX;
- WT_ERR(__wt_value_return_upd(cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
+ WT_ERR(
+ __wt_value_return_upd(session, cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
data = cbt->iface.value.data;
size = (uint32_t)cbt->iface.value.size;
update_no_copy = false;
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_row.c b/src/third_party/wiredtiger/src/reconcile/rec_row.c
index 43360d702c5..ff6087ca441 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_row.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_row.c
@@ -560,9 +560,7 @@ __rec_row_leaf_insert(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins)
bool ovfl_key, upd_saved;
btree = S2BT(session);
-
cbt = &r->update_modify_cbt;
- cbt->iface.session = (WT_SESSION *)session;
key = &r->k;
val = &r->v;
@@ -603,7 +601,7 @@ __rec_row_leaf_insert(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins)
* Impossible slot, there's no backing on-page item.
*/
cbt->slot = UINT32_MAX;
- WT_RET(__wt_value_return_upd(cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
+ WT_RET(__wt_value_return_upd(session, cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
WT_RET(__wt_rec_cell_build_val(session, r, cbt->iface.value.data, cbt->iface.value.size,
start_ts, start_txn, stop_ts, stop_txn, 0));
break;
@@ -689,12 +687,10 @@ __wt_rec_row_leaf(
const void *p;
btree = S2BT(session);
+ cbt = &r->update_modify_cbt;
page = pageref->page;
slvg_skip = salvage == NULL ? 0 : salvage->skip;
- cbt = &r->update_modify_cbt;
- cbt->iface.session = (WT_SESSION *)session;
-
key = &r->k;
val = &r->v;
vpack = &_vpack;
@@ -849,7 +845,7 @@ __wt_rec_row_leaf(
switch (upd->type) {
case WT_UPDATE_MODIFY:
cbt->slot = WT_ROW_SLOT(page, rip);
- WT_ERR(__wt_value_return_upd(cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
+ WT_ERR(__wt_value_return_upd(session, cbt, upd, F_ISSET(r, WT_REC_VISIBLE_ALL)));
WT_ERR(__wt_rec_cell_build_val(session, r, cbt->iface.value.data,
cbt->iface.value.size, start_ts, start_txn, stop_ts, stop_txn, 0));
dictionary = true;