summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/btree/bt_read.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/btree/bt_read.c')
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_read.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/src/third_party/wiredtiger/src/btree/bt_read.c b/src/third_party/wiredtiger/src/btree/bt_read.c
index 086500c8b2f..a23ab0f091f 100644
--- a/src/third_party/wiredtiger/src/btree/bt_read.c
+++ b/src/third_party/wiredtiger/src/btree/bt_read.c
@@ -147,7 +147,7 @@ __las_page_instantiate(WT_SESSION_IMPL *session,
WT_ERR(__wt_scr_alloc(session, 0, &las_value));
/* Open a lookaside table cursor. */
- WT_ERR(__wt_las_cursor(session, &cursor, &session_flags));
+ __wt_las_cursor(session, &cursor, &session_flags);
/*
* The lookaside records are in key and update order, that is, there
@@ -296,7 +296,7 @@ err: WT_TRET(__wt_las_cursor_close(session, &cursor, session_flags));
* __evict_force_check --
* Check if a page matches the criteria for forced eviction.
*/
-static int
+static bool
__evict_force_check(WT_SESSION_IMPL *session, WT_REF *ref)
{
WT_BTREE *btree;
@@ -307,26 +307,41 @@ __evict_force_check(WT_SESSION_IMPL *session, WT_REF *ref)
/* Leaf pages only. */
if (WT_PAGE_IS_INTERNAL(page))
- return (0);
+ return (false);
/*
* It's hard to imagine a page with a huge memory footprint that has
* never been modified, but check to be sure.
*/
if (page->modify == NULL)
- return (0);
+ return (false);
/* Pages are usually small enough, check that first. */
if (page->memory_footprint < btree->splitmempage)
- return (0);
- else if (page->memory_footprint < btree->maxmempage)
+ return (false);
+
+ /*
+ * If this session has more than one hazard pointer, eviction will fail
+ * and there is no point trying.
+ */
+ if (__wt_hazard_count(session, page) > 1)
+ return (false);
+
+ /*
+ * If we have already tried and the transaction state has not moved on,
+ * eviction is highly likely to fail.
+ */
+ if (page->modify->last_eviction_id == __wt_txn_oldest_id(session))
+ return (false);
+
+ if (page->memory_footprint < btree->maxmempage)
return (__wt_leaf_page_can_split(session, page));
/* Trigger eviction on the next page release. */
- __wt_page_evict_soon(page);
+ __wt_page_evict_soon(session, ref);
/* Bump the oldest ID, we're about to do some visibility checks. */
- WT_RET(__wt_txn_update_oldest(session, 0));
+ WT_IGNORE_RET(__wt_txn_update_oldest(session, 0));
/* If eviction cannot succeed, don't try. */
return (__wt_page_can_evict(session, ref, NULL));
@@ -461,8 +476,15 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
btree = S2BT(session);
- WT_STAT_FAST_CONN_INCR(session, cache_pages_requested);
- WT_STAT_FAST_DATA_INCR(session, cache_pages_requested);
+ /*
+ * Ignore reads of pages already known to be in cache, otherwise the
+ * eviction server can dominate these statistics.
+ */
+ if (!LF_ISSET(WT_READ_CACHE)) {
+ WT_STAT_FAST_CONN_INCR(session, cache_pages_requested);
+ WT_STAT_FAST_DATA_INCR(session, cache_pages_requested);
+ }
+
for (evict_soon = stalled = false,
force_attempts = 0, sleep_cnt = wait_cnt = 0;;) {
switch (ref->state) {
@@ -548,10 +570,14 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
* if the page qualifies for forced eviction and update
* the page's generation number. If eviction isn't being
* done on this file, we're done.
+ * In-memory split of large pages is allowed while
+ * no_eviction is set on btree, whereas reconciliation
+ * is not allowed.
*/
if (LF_ISSET(WT_READ_NO_EVICT) ||
F_ISSET(session, WT_SESSION_NO_EVICTION) ||
- F_ISSET(btree, WT_BTREE_NO_EVICTION))
+ (F_ISSET(btree, WT_BTREE_NO_EVICTION) &&
+ !F_ISSET(btree, WT_BTREE_NO_RECONCILE)))
goto skip_evict;
/*
@@ -595,7 +621,7 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
page = ref->page;
if (page->read_gen == WT_READGEN_NOTSET) {
if (evict_soon)
- __wt_page_evict_soon(page);
+ __wt_page_evict_soon(session, ref);
else
__wt_cache_read_gen_new(session, page);
} else if (!LF_ISSET(WT_READ_NO_GEN))