summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2016-09-14 12:18:30 +1000
committerAlex Gorrod <alexander.gorrod@mongodb.com>2016-09-14 12:18:30 +1000
commit71c8bd736c888228d42d9a2ee478380d2224c984 (patch)
tree90e8411a6ebe20ed447041c1b087f5708c490a1b
parent09f65fffa7375357264f55f75678540bb7ab5a08 (diff)
downloadmongo-71c8bd736c888228d42d9a2ee478380d2224c984.tar.gz
WT-2902 Track per-tree the efficiency of eviction walks. (#3036)
Some workloads create "deserts" within a tree where no good eviction candidates can be found (e.g., zipfian distributions, append-only workloads, etc.). Rather than walking all the way through such regions, give up and try in the opposite direction next time. Also add a statistic for the eviction empty score.
-rw-r--r--dist/api_data.py2
-rw-r--r--dist/stat_data.py4
-rw-r--r--src/config/config_def.c10
-rw-r--r--src/evict/evict_lru.c112
-rw-r--r--src/include/btree.h1
-rw-r--r--src/include/cache.h1
-rw-r--r--src/include/stat.h2
-rw-r--r--src/include/wiredtiger.in350
-rw-r--r--src/support/stat.c8
-rw-r--r--tools/wtstats/stat_data.py2
10 files changed, 271 insertions, 221 deletions
diff --git a/dist/api_data.py b/dist/api_data.py
index 44fc935d5d3..0f4506f608c 100644
--- a/dist/api_data.py
+++ b/dist/api_data.py
@@ -402,7 +402,7 @@ connection_runtime_config = [
vary depending on the current eviction load''',
min=1, max=20),
]),
- Config('eviction_checkpoint_target', '15', r'''
+ Config('eviction_checkpoint_target', '5', r'''
perform eviction at the beginning of checkpoints to bring the dirty
content in cache to this level, expressed as a percentage of the total
cache size. Ignored if set to zero or \c in_memory is \c true''',
diff --git a/dist/stat_data.py b/dist/stat_data.py
index a050849ad76..5087afa44dc 100644
--- a/dist/stat_data.py
+++ b/dist/stat_data.py
@@ -185,6 +185,7 @@ connection_stats = [
CacheStat('cache_eviction_clean', 'unmodified pages evicted'),
CacheStat('cache_eviction_deepen', 'page split during eviction deepened the tree'),
CacheStat('cache_eviction_dirty', 'modified pages evicted'),
+ CacheStat('cache_eviction_empty_score', 'eviction empty score', 'no_clear,no_scale'),
CacheStat('cache_eviction_fail', 'pages selected for eviction unable to be evicted'),
CacheStat('cache_eviction_force', 'pages evicted because they exceeded the in-memory maximum'),
CacheStat('cache_eviction_force_delete', 'pages evicted because they had chains of deleted items'),
@@ -208,7 +209,8 @@ connection_stats = [
CacheStat('cache_eviction_split_leaf', 'leaf pages split during eviction'),
CacheStat('cache_eviction_state', 'eviction state', 'no_clear,no_scale'),
CacheStat('cache_eviction_walk', 'pages walked for eviction'),
- CacheStat('cache_eviction_walks_active', 'files with active eviction walks', 'no_clear,no_scale,size'),
+ CacheStat('cache_eviction_walks_abandoned', 'eviction walks abandoned'),
+ CacheStat('cache_eviction_walks_active', 'files with active eviction walks', 'no_clear,no_scale'),
CacheStat('cache_eviction_walks_started', 'files with new eviction walks started'),
CacheStat('cache_eviction_worker_evicting', 'eviction worker thread evicting pages'),
CacheStat('cache_hazard_checks', 'hazard pointer check calls'),
diff --git a/src/config/config_def.c b/src/config/config_def.c
index f231d7fc5d9..0ff2fd379d2 100644
--- a/src/config/config_def.c
+++ b/src/config/config_def.c
@@ -1005,7 +1005,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {
"async=(enabled=false,ops_max=1024,threads=2),cache_overhead=8,"
"cache_size=100MB,checkpoint=(log_size=0,wait=0),error_prefix=,"
"eviction=(threads_max=1,threads_min=1),"
- "eviction_checkpoint_target=15,eviction_dirty_target=5,"
+ "eviction_checkpoint_target=5,eviction_dirty_target=5,"
"eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
",file_manager=(close_handle_minimum=250,close_idle_time=30,"
"close_scan_interval=10),log=(archive=true,prealloc=true,"
@@ -1207,7 +1207,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {
"wait=0),checkpoint_sync=true,config_base=true,create=false,"
"direct_io=,encryption=(keyid=,name=,secretkey=),error_prefix=,"
"eviction=(threads_max=1,threads_min=1),"
- "eviction_checkpoint_target=15,eviction_dirty_target=5,"
+ "eviction_checkpoint_target=5,eviction_dirty_target=5,"
"eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
",exclusive=false,extensions=,file_extend=,"
"file_manager=(close_handle_minimum=250,close_idle_time=30,"
@@ -1230,7 +1230,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {
"wait=0),checkpoint_sync=true,config_base=true,create=false,"
"direct_io=,encryption=(keyid=,name=,secretkey=),error_prefix=,"
"eviction=(threads_max=1,threads_min=1),"
- "eviction_checkpoint_target=15,eviction_dirty_target=5,"
+ "eviction_checkpoint_target=5,eviction_dirty_target=5,"
"eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
",exclusive=false,extensions=,file_extend=,"
"file_manager=(close_handle_minimum=250,close_idle_time=30,"
@@ -1252,7 +1252,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {
",cache_overhead=8,cache_size=100MB,checkpoint=(log_size=0,"
"wait=0),checkpoint_sync=true,direct_io=,encryption=(keyid=,name="
",secretkey=),error_prefix=,eviction=(threads_max=1,"
- "threads_min=1),eviction_checkpoint_target=15,"
+ "threads_min=1),eviction_checkpoint_target=5,"
"eviction_dirty_target=5,eviction_dirty_trigger=20,"
"eviction_target=80,eviction_trigger=95,extensions=,file_extend=,"
"file_manager=(close_handle_minimum=250,close_idle_time=30,"
@@ -1273,7 +1273,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {
",cache_overhead=8,cache_size=100MB,checkpoint=(log_size=0,"
"wait=0),checkpoint_sync=true,direct_io=,encryption=(keyid=,name="
",secretkey=),error_prefix=,eviction=(threads_max=1,"
- "threads_min=1),eviction_checkpoint_target=15,"
+ "threads_min=1),eviction_checkpoint_target=5,"
"eviction_dirty_target=5,eviction_dirty_trigger=20,"
"eviction_target=80,eviction_trigger=95,extensions=,file_extend=,"
"file_manager=(close_handle_minimum=250,close_idle_time=30,"
diff --git a/src/evict/evict_lru.c b/src/evict/evict_lru.c
index 69fff96fef5..c7bd3f0cb17 100644
--- a/src/evict/evict_lru.c
+++ b/src/evict/evict_lru.c
@@ -17,24 +17,24 @@ static int __evict_pass(WT_SESSION_IMPL *);
static int __evict_server(WT_SESSION_IMPL *, bool *);
static int __evict_walk(WT_SESSION_IMPL *, WT_EVICT_QUEUE *);
static int __evict_walk_file(
- WT_SESSION_IMPL *, WT_EVICT_QUEUE *, u_int, u_int *, bool *);
+ WT_SESSION_IMPL *, WT_EVICT_QUEUE *, u_int, u_int *);
#define WT_EVICT_HAS_WORKERS(s) \
(S2C(s)->evict_threads.current_threads > 1)
/*
- * __evict_read_gen --
+ * __evict_entry_priority --
* Get the adjusted read generation for an eviction entry.
*/
static inline uint64_t
-__evict_read_gen(const WT_EVICT_ENTRY *entry)
+__evict_entry_priority(WT_SESSION_IMPL *session, WT_REF *ref)
{
WT_BTREE *btree;
WT_PAGE *page;
uint64_t read_gen;
- btree = entry->btree;
- page = entry->ref->page;
+ btree = S2BT(session);
+ page = ref->page;
/* Any page set to the oldest generation should be discarded. */
if (page->read_gen == WT_READGEN_OLDEST)
@@ -60,7 +60,14 @@ __evict_read_gen(const WT_EVICT_ENTRY *entry)
* The base read-generation is skewed by the eviction priority.
* Internal pages are also adjusted, we prefer to evict leaf pages.
*/
- read_gen = page->read_gen + btree->evict_priority;
+ if (page->modify != NULL &&
+ F_ISSET(S2C(session)->cache, WT_CACHE_EVICT_DIRTY) &&
+ !F_ISSET(S2C(session)->cache, WT_CACHE_EVICT_CLEAN))
+ read_gen = page->modify->update_txn;
+ else
+ read_gen = page->read_gen;
+
+ read_gen += btree->evict_priority;
if (WT_PAGE_IS_INTERNAL(page))
read_gen += WT_EVICT_INT_SKEW;
@@ -327,8 +334,6 @@ __evict_server(WT_SESSION_IMPL *session, bool *did_work)
__wt_spin_unlock(session, &conn->dhandle_lock);
WT_RET(ret);
- /* Next time we wake up, reverse the sweep direction. */
- cache->flags ^= WT_CACHE_WALK_REVERSE;
cache->pages_evicted = 0;
} else if (cache->pages_evicted != cache->pages_evict) {
cache->pages_evicted = cache->pages_evict;
@@ -641,7 +646,7 @@ __evict_pass(WT_SESSION_IMPL *session)
* Clear a single walk point.
*/
static int
-__evict_clear_walk(WT_SESSION_IMPL *session)
+__evict_clear_walk(WT_SESSION_IMPL *session, bool count_stat)
{
WT_BTREE *btree;
WT_CACHE *cache;
@@ -658,6 +663,9 @@ __evict_clear_walk(WT_SESSION_IMPL *session)
if ((ref = btree->evict_ref) == NULL)
return (0);
+ if (count_stat)
+ WT_STAT_FAST_CONN_INCR(session, cache_eviction_walks_abandoned);
+
/*
* Clear evict_ref first, in case releasing it forces eviction (we
* assert we never try to evict the current eviction walk point).
@@ -684,8 +692,8 @@ __evict_clear_all_walks(WT_SESSION_IMPL *session)
TAILQ_FOREACH(dhandle, &conn->dhqh, q)
if (WT_PREFIX_MATCH(dhandle->name, "file:"))
- WT_WITH_DHANDLE(session,
- dhandle, WT_TRET(__evict_clear_walk(session)));
+ WT_WITH_DHANDLE(session, dhandle,
+ WT_TRET(__evict_clear_walk(session, true)));
return (ret);
}
@@ -730,7 +738,7 @@ __wt_evict_file_exclusive_on(WT_SESSION_IMPL *session)
/* Clear any existing LRU eviction walk for the file. */
WT_WITH_PASS_LOCK(session, ret,
- ret = __evict_clear_walk(session));
+ ret = __evict_clear_walk(session, true));
(void)__wt_atomic_subv32(&cache->pass_intr, 1);
WT_ERR(ret);
@@ -843,8 +851,11 @@ __evict_lru_walk(WT_SESSION_IMPL *session)
cache = S2C(session)->cache;
/* Age out the score of how much the queue has been empty recently. */
- if (cache->evict_empty_score > 0)
+ if (cache->evict_empty_score > 0) {
--cache->evict_empty_score;
+ WT_STAT_FAST_CONN_SET(session, cache_eviction_empty_score,
+ cache->evict_empty_score);
+ }
/* Fill the next queue (that isn't the urgent queue). */
queue = cache->evict_fill_queue;
@@ -894,10 +905,14 @@ __evict_lru_walk(WT_SESSION_IMPL *session)
*/
if (__evict_queue_empty(queue)) {
if (F_ISSET(cache,
- WT_CACHE_EVICT_CLEAN_HARD | WT_CACHE_EVICT_DIRTY_HARD))
+ WT_CACHE_EVICT_CLEAN_HARD | WT_CACHE_EVICT_DIRTY_HARD)) {
cache->evict_empty_score = WT_MIN(
cache->evict_empty_score + WT_EVICT_SCORE_BUMP,
WT_EVICT_SCORE_MAX);
+ WT_STAT_FAST_CONN_SET(session,
+ cache_eviction_empty_score,
+ cache->evict_empty_score);
+ }
WT_STAT_FAST_CONN_INCR(session, cache_eviction_queue_empty);
} else
WT_STAT_FAST_CONN_INCR(session, cache_eviction_queue_not_empty);
@@ -1014,8 +1029,8 @@ __evict_walk(WT_SESSION_IMPL *session, WT_EVICT_QUEUE *queue)
WT_CONNECTION_IMPL *conn;
WT_DATA_HANDLE *dhandle;
WT_DECL_RET;
- u_int max_entries, prev_slot, retries, slot, start_slot, spins;
- bool dhandle_locked, incr, progress;
+ u_int max_entries, retries, slot, start_slot, spins;
+ bool dhandle_locked, incr;
conn = S2C(session);
cache = S2C(session)->cache;
@@ -1121,8 +1136,6 @@ retry: while (slot < max_entries) {
btree->evict_walk_skips++ < btree->evict_walk_period)
continue;
btree->evict_walk_skips = 0;
- prev_slot = slot;
- progress = false;
(void)__wt_atomic_addi32(&dhandle->session_inuse, 1);
incr = true;
@@ -1145,22 +1158,12 @@ retry: while (slot < max_entries) {
cache->evict_file_next = dhandle;
WT_WITH_DHANDLE(session, dhandle, ret =
__evict_walk_file(session, queue,
- max_entries, &slot, &progress));
+ max_entries, &slot));
WT_ASSERT(session, session->split_gen == 0);
}
__wt_spin_unlock(session, &cache->evict_walk_lock);
WT_ERR(ret);
}
-
- /*
- * If we didn't find any candidates in the file, skip it next
- * time.
- */
- if (slot == prev_slot && !progress)
- btree->evict_walk_period = WT_MIN(
- WT_MAX(1, 2 * btree->evict_walk_period), 100);
- else
- btree->evict_walk_period = 0;
}
if (incr) {
@@ -1229,7 +1232,7 @@ __evict_push_candidate(WT_SESSION_IMPL *session,
evict->btree = S2BT(session);
evict->ref = ref;
- evict->score = __evict_read_gen(evict);
+ evict->score = __evict_entry_priority(session, ref);
/* Adjust for size when doing dirty eviction. */
if (F_ISSET(S2C(session)->cache, WT_CACHE_EVICT_DIRTY) &&
@@ -1247,7 +1250,7 @@ __evict_push_candidate(WT_SESSION_IMPL *session,
*/
static int
__evict_walk_file(WT_SESSION_IMPL *session,
- WT_EVICT_QUEUE *queue, u_int max_entries, u_int *slotp, bool *progressp)
+ WT_EVICT_QUEUE *queue, u_int max_entries, u_int *slotp)
{
WT_BTREE *btree;
WT_CACHE *cache;
@@ -1259,17 +1262,18 @@ __evict_walk_file(WT_SESSION_IMPL *session,
WT_REF *ref;
WT_TXN_GLOBAL *txn_global;
uint64_t btree_inuse, bytes_per_slot, cache_inuse;
- uint64_t pages_seen, refs_walked;
+ uint64_t pages_seen, pages_queued, refs_walked;
uint32_t remaining_slots, total_slots, walk_flags;
uint32_t target_pages_clean, target_pages_dirty, target_pages;
int internal_pages, restarts;
- bool modified;
+ bool give_up, modified, urgent_queued;
conn = S2C(session);
btree = S2BT(session);
cache = conn->cache;
- internal_pages = restarts = 0;
txn_global = &conn->txn_global;
+ internal_pages = restarts = 0;
+ give_up = urgent_queued = false;
/*
* Figure out how many slots to fill from this tree.
@@ -1324,8 +1328,10 @@ __evict_walk_file(WT_SESSION_IMPL *session,
walk_flags =
WT_READ_CACHE | WT_READ_NO_EVICT | WT_READ_NO_GEN | WT_READ_NO_WAIT;
- if (F_ISSET(cache, WT_CACHE_WALK_REVERSE))
- walk_flags |= WT_READ_PREV;
+
+ /* Randomize the walk direction. */
+ if (btree->evict_walk_reverse)
+ FLD_SET(walk_flags, WT_READ_PREV);
/*
* Get some more eviction candidate pages.
@@ -1339,10 +1345,22 @@ __evict_walk_file(WT_SESSION_IMPL *session,
* Once we hit the page limit, do one more step through the walk in
* case we are appending and only the last page in the file is live.
*/
- for (evict = start, pages_seen = refs_walked = 0;
+ for (evict = start, pages_queued = pages_seen = refs_walked = 0;
evict < end && (ret == 0 || ret == WT_NOTFOUND);
ret = __wt_tree_walk_count(
session, &btree->evict_ref, &refs_walked, walk_flags)) {
+ /*
+ * Check whether we're finding a good ration of candidates vs
+ * pages seen. Some workloads create "deserts" in trees where
+ * no good eviction candidates can be found. Abandon the walk
+ * if we get into that situation.
+ */
+ give_up = pages_seen > 100 &&
+ (pages_queued == 0 || (pages_seen / pages_queued) >
+ (10 * total_slots / target_pages));
+ if (give_up)
+ break;
+
if ((ref = btree->evict_ref) == NULL) {
if (++restarts == 2)
break;
@@ -1382,7 +1400,7 @@ __evict_walk_file(WT_SESSION_IMPL *session,
WT_STAT_FAST_CONN_INCR(
session, cache_eviction_pages_queued_oldest);
if (__wt_page_evict_urgent(session, ref))
- *progressp = true;
+ urgent_queued = true;
continue;
}
@@ -1426,6 +1444,7 @@ fast: /* If the page can't be evicted, give up. */
if (!__evict_push_candidate(session, queue, evict, ref))
continue;
++evict;
+ ++pages_queued;
if (WT_PAGE_IS_INTERNAL(page))
++internal_pages;
@@ -1441,6 +1460,18 @@ fast: /* If the page can't be evicted, give up. */
session, cache_eviction_pages_queued, (u_int)(evict - start));
/*
+ * If we didn't find any candidates in the file, reverse the direction
+ * of the walk and skip it next time.
+ */
+ if (give_up)
+ btree->evict_walk_reverse = !btree->evict_walk_reverse;
+ if (give_up && !urgent_queued)
+ btree->evict_walk_period = WT_MIN(
+ WT_MAX(1, 2 * btree->evict_walk_period), 100);
+ else if (pages_queued == target_pages)
+ btree->evict_walk_period = 0;
+
+ /*
* If we happen to end up on the root page, clear it. We have to track
* hazard pointers, and the root page complicates that calculation.
*
@@ -1452,8 +1483,9 @@ fast: /* If the page can't be evicted, give up. */
* page: we want this page evicted as quickly as possible.
*/
if ((ref = btree->evict_ref) != NULL) {
- if (__wt_ref_is_root(ref) || evict == start)
- WT_RET(__evict_clear_walk(session));
+ /* Give up the walk occasionally. */
+ if (__wt_ref_is_root(ref) || evict == start || give_up)
+ WT_RET(__evict_clear_walk(session, restarts == 0));
else if (ref->page->read_gen == WT_READGEN_OLDEST)
WT_RET_NOTFOUND_OK(__wt_tree_walk_count(
session, &btree->evict_ref,
diff --git a/src/include/btree.h b/src/include/btree.h
index f1365c6c933..cfaf59e70e1 100644
--- a/src/include/btree.h
+++ b/src/include/btree.h
@@ -140,6 +140,7 @@ struct __wt_btree {
u_int evict_walk_skips; /* Number of walks skipped */
u_int evict_disabled; /* Eviction disabled count */
volatile uint32_t evict_busy; /* Count of threads in eviction */
+ bool evict_walk_reverse; /* Walk direction */
enum {
WT_CKPT_OFF, WT_CKPT_PREPARE, WT_CKPT_RUNNING
diff --git a/src/include/cache.h b/src/include/cache.h
index 0cb61f01435..515135f26ab 100644
--- a/src/include/cache.h
+++ b/src/include/cache.h
@@ -181,7 +181,6 @@ struct __wt_cache {
#define WT_CACHE_EVICT_MASK 0x0FF
#define WT_CACHE_POOL_MANAGER 0x100 /* The active cache pool manager */
#define WT_CACHE_POOL_RUN 0x200 /* Cache pool thread running */
-#define WT_CACHE_WALK_REVERSE 0x400 /* Scan backwards for candidates */
uint32_t flags;
};
diff --git a/src/include/stat.h b/src/include/stat.h
index b61c568783b..e9c6d64a850 100644
--- a/src/include/stat.h
+++ b/src/include/stat.h
@@ -286,12 +286,14 @@ struct __wt_connection_stats {
int64_t cache_eviction_get_ref_empty;
int64_t cache_eviction_get_ref_empty2;
int64_t cache_eviction_aggressive_set;
+ int64_t cache_eviction_empty_score;
int64_t cache_eviction_queue_empty;
int64_t cache_eviction_queue_not_empty;
int64_t cache_eviction_server_evicting;
int64_t cache_eviction_server_slept;
int64_t cache_eviction_slow;
int64_t cache_eviction_state;
+ int64_t cache_eviction_walks_abandoned;
int64_t cache_eviction_worker_evicting;
int64_t cache_eviction_force_fail;
int64_t cache_eviction_walks_active;
diff --git a/src/include/wiredtiger.in b/src/include/wiredtiger.in
index 61a66bd4086..f4763a113f1 100644
--- a/src/include/wiredtiger.in
+++ b/src/include/wiredtiger.in
@@ -1812,7 +1812,7 @@ struct __wt_connection {
* of checkpoints to bring the dirty content in cache to this level\,
* expressed as a percentage of the total cache size. Ignored if set to
* zero or \c in_memory is \c true., an integer between 0 and 99;
- * default \c 15.}
+ * default \c 5.}
* @config{eviction_dirty_target, perform eviction in worker threads
* when the cache contains at least this much dirty content\, expressed
* as a percentage of the total cache size. Ignored if \c in_memory is
@@ -2278,7 +2278,7 @@ struct __wt_connection {
* @config{eviction_checkpoint_target, perform eviction at the beginning of
* checkpoints to bring the dirty content in cache to this level\, expressed as
* a percentage of the total cache size. Ignored if set to zero or \c in_memory
- * is \c true., an integer between 0 and 99; default \c 15.}
+ * is \c true., an integer between 0 and 99; default \c 5.}
* @config{eviction_dirty_target, perform eviction in worker threads when the
* cache contains at least this much dirty content\, expressed as a percentage
* of the total cache size. Ignored if \c in_memory is \c true., an integer
@@ -4294,360 +4294,364 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_EVICTION_GET_REF_EMPTY2 1039
/*! cache: eviction currently operating in aggressive mode */
#define WT_STAT_CONN_CACHE_EVICTION_AGGRESSIVE_SET 1040
+/*! cache: eviction empty score */
+#define WT_STAT_CONN_CACHE_EVICTION_EMPTY_SCORE 1041
/*! cache: eviction server candidate queue empty when topping up */
-#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_EMPTY 1041
+#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_EMPTY 1042
/*! cache: eviction server candidate queue not empty when topping up */
-#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_NOT_EMPTY 1042
+#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_NOT_EMPTY 1043
/*! cache: eviction server evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_EVICTING 1043
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_EVICTING 1044
/*!
* cache: eviction server slept, because we did not make progress with
* eviction
*/
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1044
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1045
/*! cache: eviction server unable to reach eviction goal */
-#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1045
+#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1046
/*! cache: eviction state */
-#define WT_STAT_CONN_CACHE_EVICTION_STATE 1046
+#define WT_STAT_CONN_CACHE_EVICTION_STATE 1047
+/*! cache: eviction walks abandoned */
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1048
/*! cache: eviction worker thread evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1047
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1049
/*! cache: failed eviction of pages that exceeded the in-memory maximum */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1048
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1050
/*! cache: files with active eviction walks */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1049
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1051
/*! cache: files with new eviction walks started */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1050
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1052
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1051
+#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1053
/*! cache: hazard pointer check calls */
-#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1052
+#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1054
/*! cache: hazard pointer check entries walked */
-#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1053
+#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1055
/*! cache: hazard pointer maximum array length */
-#define WT_STAT_CONN_CACHE_HAZARD_MAX 1054
+#define WT_STAT_CONN_CACHE_HAZARD_MAX 1056
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1055
+#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1057
/*! cache: in-memory page splits */
-#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1056
+#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1058
/*! cache: internal pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1057
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1059
/*! cache: internal pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1058
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1060
/*! cache: leaf pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1059
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1061
/*! cache: lookaside table insert calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1060
+#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1062
/*! cache: lookaside table remove calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1061
+#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1063
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1062
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1064
/*! cache: maximum page size at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1063
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1065
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1064
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1066
/*! cache: modified pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1065
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1067
/*! cache: overflow pages read into cache */
-#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1066
+#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1068
/*! cache: overflow values cached in memory */
-#define WT_STAT_CONN_CACHE_OVERFLOW_VALUE 1067
+#define WT_STAT_CONN_CACHE_OVERFLOW_VALUE 1069
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1068
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1070
/*! cache: page written requiring lookaside records */
-#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1069
+#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1071
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1070
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1072
/*! cache: pages evicted because they exceeded the in-memory maximum */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1071
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1073
/*! cache: pages evicted because they had chains of deleted items */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1072
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1074
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1073
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1075
/*! cache: pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1074
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1076
/*! cache: pages queued for urgent eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1075
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1077
/*! cache: pages queued for urgent eviction during walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1076
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1078
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1077
+#define WT_STAT_CONN_CACHE_READ 1079
/*! cache: pages read into cache requiring lookaside entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1078
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1080
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1079
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1081
/*! cache: pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1080
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1082
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1081
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1083
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1082
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1084
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1083
+#define WT_STAT_CONN_CACHE_WRITE 1085
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1084
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1086
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1085
+#define WT_STAT_CONN_CACHE_OVERHEAD 1087
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1086
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1088
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1087
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1089
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1088
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1090
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1089
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1091
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1090
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1092
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1091
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1093
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1092
+#define WT_STAT_CONN_COND_AUTO_WAIT 1094
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1093
+#define WT_STAT_CONN_FILE_OPEN 1095
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1094
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1096
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1095
+#define WT_STAT_CONN_MEMORY_FREE 1097
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1096
+#define WT_STAT_CONN_MEMORY_GROW 1098
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1097
+#define WT_STAT_CONN_COND_WAIT 1099
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1098
+#define WT_STAT_CONN_RWLOCK_READ 1100
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1099
+#define WT_STAT_CONN_RWLOCK_WRITE 1101
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1100
+#define WT_STAT_CONN_FSYNC_IO 1102
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1101
+#define WT_STAT_CONN_READ_IO 1103
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1102
+#define WT_STAT_CONN_WRITE_IO 1104
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1103
+#define WT_STAT_CONN_CURSOR_CREATE 1105
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1104
+#define WT_STAT_CONN_CURSOR_INSERT 1106
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1105
+#define WT_STAT_CONN_CURSOR_NEXT 1107
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1106
+#define WT_STAT_CONN_CURSOR_PREV 1108
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1107
+#define WT_STAT_CONN_CURSOR_REMOVE 1109
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1108
+#define WT_STAT_CONN_CURSOR_RESET 1110
/*! cursor: cursor restarted searches */
-#define WT_STAT_CONN_CURSOR_RESTART 1109
+#define WT_STAT_CONN_CURSOR_RESTART 1111
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1110
+#define WT_STAT_CONN_CURSOR_SEARCH 1112
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1111
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1113
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1112
+#define WT_STAT_CONN_CURSOR_UPDATE 1114
/*! cursor: truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1113
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1115
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1114
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1116
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1115
+#define WT_STAT_CONN_DH_SWEEP_REF 1117
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1116
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1118
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1117
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1119
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1118
+#define WT_STAT_CONN_DH_SWEEP_TOD 1120
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1119
+#define WT_STAT_CONN_DH_SWEEPS 1121
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1120
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1122
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1121
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1123
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1122
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1124
/*! log: consolidated slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1123
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1125
/*! log: consolidated slot join races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1124
+#define WT_STAT_CONN_LOG_SLOT_RACES 1126
/*! log: consolidated slot join transitions */
-#define WT_STAT_CONN_LOG_SLOT_TRANSITIONS 1125
+#define WT_STAT_CONN_LOG_SLOT_TRANSITIONS 1127
/*! log: consolidated slot joins */
-#define WT_STAT_CONN_LOG_SLOT_JOINS 1126
+#define WT_STAT_CONN_LOG_SLOT_JOINS 1128
/*! log: consolidated slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1127
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1129
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1128
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1130
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1129
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1131
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1130
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1132
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1131
+#define WT_STAT_CONN_LOG_FLUSH 1133
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1132
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1134
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1133
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1135
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1134
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1136
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1135
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1137
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1136
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1138
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1137
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1139
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1138
+#define WT_STAT_CONN_LOG_SCANS 1140
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1139
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1141
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1140
+#define WT_STAT_CONN_LOG_WRITE_LSN 1142
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1141
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1143
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1142
+#define WT_STAT_CONN_LOG_SYNC 1144
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1143
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1145
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1144
+#define WT_STAT_CONN_LOG_SYNC_DIR 1146
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1145
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1147
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1146
+#define WT_STAT_CONN_LOG_WRITES 1148
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1147
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1149
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1148
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1150
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1149
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1151
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1150
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1152
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1151
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1153
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1152
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1154
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1153
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1155
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1154
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1156
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1155
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1157
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1156
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1158
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1157
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1159
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1158
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1160
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1159
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1161
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1160
+#define WT_STAT_CONN_REC_PAGES 1162
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1161
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1163
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1162
+#define WT_STAT_CONN_REC_PAGE_DELETE 1164
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1163
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1165
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1164
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1166
/*! session: open cursor count */
-#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1165
+#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1167
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1166
+#define WT_STAT_CONN_SESSION_OPEN 1168
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1167
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1169
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1168
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1170
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1169
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1171
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1170
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1172
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1171
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1173
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1172
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1174
/*! session: table rebalance failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1173
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1175
/*! session: table rebalance successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1174
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1176
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1175
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1177
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1176
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1178
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1177
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1179
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1178
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1180
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1179
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1181
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1180
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1182
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1181
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1183
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1182
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1184
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1183
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1185
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1184
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1186
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1185
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1187
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1186
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1188
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1187
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1189
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1188
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1190
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1189
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1191
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1190
+#define WT_STAT_CONN_PAGE_SLEEP 1192
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1191
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1193
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1192
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1194
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1193
+#define WT_STAT_CONN_TXN_BEGIN 1195
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1194
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1196
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1195
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1197
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1196
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1198
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1197
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1199
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1198
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1200
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1199
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1201
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1200
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1202
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1201
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1203
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1202
+#define WT_STAT_CONN_TXN_CHECKPOINT 1204
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1203
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1205
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1204
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1206
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1205
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1207
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1206
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1208
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1207
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1209
/*!
* transaction: transaction range of IDs currently pinned by named
* snapshots
*/
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1208
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1210
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1209
+#define WT_STAT_CONN_TXN_SYNC 1211
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1210
+#define WT_STAT_CONN_TXN_COMMIT 1212
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1211
+#define WT_STAT_CONN_TXN_ROLLBACK 1213
/*!
* @}
diff --git a/src/support/stat.c b/src/support/stat.c
index 81859ef1ca8..7150223e6cb 100644
--- a/src/support/stat.c
+++ b/src/support/stat.c
@@ -559,12 +559,14 @@ static const char * const __stats_connection_desc[] = {
"cache: eviction calls to get a page found queue empty",
"cache: eviction calls to get a page found queue empty after locking",
"cache: eviction currently operating in aggressive mode",
+ "cache: eviction empty score",
"cache: eviction server candidate queue empty when topping up",
"cache: eviction server candidate queue not empty when topping up",
"cache: eviction server evicting pages",
"cache: eviction server slept, because we did not make progress with eviction",
"cache: eviction server unable to reach eviction goal",
"cache: eviction state",
+ "cache: eviction walks abandoned",
"cache: eviction worker thread evicting pages",
"cache: failed eviction of pages that exceeded the in-memory maximum",
"cache: files with active eviction walks",
@@ -801,12 +803,14 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_get_ref_empty = 0;
stats->cache_eviction_get_ref_empty2 = 0;
/* not clearing cache_eviction_aggressive_set */
+ /* not clearing cache_eviction_empty_score */
stats->cache_eviction_queue_empty = 0;
stats->cache_eviction_queue_not_empty = 0;
stats->cache_eviction_server_evicting = 0;
stats->cache_eviction_server_slept = 0;
stats->cache_eviction_slow = 0;
/* not clearing cache_eviction_state */
+ stats->cache_eviction_walks_abandoned = 0;
stats->cache_eviction_worker_evicting = 0;
stats->cache_eviction_force_fail = 0;
/* not clearing cache_eviction_walks_active */
@@ -1041,6 +1045,8 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, cache_eviction_get_ref_empty2);
to->cache_eviction_aggressive_set +=
WT_STAT_READ(from, cache_eviction_aggressive_set);
+ to->cache_eviction_empty_score +=
+ WT_STAT_READ(from, cache_eviction_empty_score);
to->cache_eviction_queue_empty +=
WT_STAT_READ(from, cache_eviction_queue_empty);
to->cache_eviction_queue_not_empty +=
@@ -1051,6 +1057,8 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, cache_eviction_server_slept);
to->cache_eviction_slow += WT_STAT_READ(from, cache_eviction_slow);
to->cache_eviction_state += WT_STAT_READ(from, cache_eviction_state);
+ to->cache_eviction_walks_abandoned +=
+ WT_STAT_READ(from, cache_eviction_walks_abandoned);
to->cache_eviction_worker_evicting +=
WT_STAT_READ(from, cache_eviction_worker_evicting);
to->cache_eviction_force_fail +=
diff --git a/tools/wtstats/stat_data.py b/tools/wtstats/stat_data.py
index 1eb60c9d513..8f47b86a23e 100644
--- a/tools/wtstats/stat_data.py
+++ b/tools/wtstats/stat_data.py
@@ -7,6 +7,7 @@ no_scale_per_second_list = [
'cache: bytes currently in the cache',
'cache: bytes not belonging to page images in the cache',
'cache: eviction currently operating in aggressive mode',
+ 'cache: eviction empty score',
'cache: eviction state',
'cache: files with active eviction walks',
'cache: hazard pointer maximum array length',
@@ -103,6 +104,7 @@ no_clear_list = [
'cache: bytes currently in the cache',
'cache: bytes not belonging to page images in the cache',
'cache: eviction currently operating in aggressive mode',
+ 'cache: eviction empty score',
'cache: eviction state',
'cache: files with active eviction walks',
'cache: maximum bytes configured',