summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2017-10-27 00:36:23 -0400
committerAlex Gorrod <alexander.gorrod@mongodb.com>2017-10-27 15:36:23 +1100
commitb59b8856c040531ef883b6e68010ff1f47ce1495 (patch)
tree1db9915ab24cea9115be900b3aca2f38b47a0b64
parent4ff5d172ed42bbc703bc8d80d6f5642acbe7d777 (diff)
downloadmongo-b59b8856c040531ef883b6e68010ff1f47ce1495.tar.gz
WT-3652 Skip unnecessary lookaside reads / writes. (#3744)
Also fix reads during checkpoint so the expected read generation is set, and checkpoint can attempt to clean up after itself. Add a "lookaside_score" measuring the proportion of unstable updates in cache (those required for historic reads), use that to determine when to use the lookaside table rather than waiting for the cache to become stuck. Instead of discarding updates as part of restoring a page, including the original value in the update list if the on-page update is a modify. This removes some problematic code that was inconsistent about removing updates. Also, if we need to restore updates earlier than the on-page version, the previous code was incorrect. Disable checkpoint skipping lookaside pages for now: always visit every page until we are tracking the correct IDs and timestamps to skip properly. Ensure all trees with lookaside pages must stay dirty.
-rw-r--r--dist/stat_data.py1
-rw-r--r--src/btree/bt_read.c78
-rw-r--r--src/btree/bt_split.c33
-rw-r--r--src/conn/conn_cache.c13
-rw-r--r--src/evict/evict_lru.c30
-rw-r--r--src/evict/evict_page.c17
-rw-r--r--src/include/btmem.h6
-rw-r--r--src/include/cache.h36
-rw-r--r--src/include/cache.i53
-rw-r--r--src/include/stat.h1
-rw-r--r--src/include/wiredtiger.in410
-rw-r--r--src/reconcile/rec_write.c53
-rw-r--r--src/support/stat.c4
13 files changed, 407 insertions, 328 deletions
diff --git a/dist/stat_data.py b/dist/stat_data.py
index 24610b9ab14..64d3d46818b 100644
--- a/dist/stat_data.py
+++ b/dist/stat_data.py
@@ -257,6 +257,7 @@ connection_stats = [
CacheStat('cache_lookaside_entries', 'lookaside table entries', 'no_clear,no_scale'),
CacheStat('cache_lookaside_insert', 'lookaside table insert calls'),
CacheStat('cache_lookaside_remove', 'lookaside table remove calls'),
+ CacheStat('cache_lookaside_score', 'lookaside score', 'no_clear,no_scale'),
CacheStat('cache_overhead', 'percentage overhead', 'no_clear,no_scale'),
CacheStat('cache_pages_dirty', 'tracked dirty pages in the cache', 'no_clear,no_scale'),
CacheStat('cache_pages_inuse', 'pages currently held in the cache', 'no_clear,no_scale'),
diff --git a/src/btree/bt_read.c b/src/btree/bt_read.c
index 2dd366d8d5e..eaf025d5468 100644
--- a/src/btree/bt_read.c
+++ b/src/btree/bt_read.c
@@ -430,6 +430,61 @@ err: /*
}
/*
+ * __page_in_lookaside_check --
+ * Review lookaside page references for page in
+ */
+static inline int
+__page_in_lookaside_check(WT_SESSION_IMPL *session, WT_REF *ref)
+{
+ WT_TXN *txn;
+ WT_TXN_GLOBAL *txn_global;
+
+ txn = &session->txn;
+ txn_global = &S2C(session)->txn_global;
+
+ /*
+ * Skip lookaside pages if reading without a timestamp and all the
+ * updates in lookaside are in the past.
+ *
+ * If we skip a lookaside page, the tree cannot be left clean:
+ * lookaside entries must be resolved before the tree can be discarded.
+ *
+ * Lookaside eviction preferentially chooses the newest updates when
+ * creating page image with no stable timestamp. If a stable timestamp
+ * has been set, we have to visit the page because eviction chooses old
+ * version of records in that case.
+ *
+ * One case where we may need to visit the page is if lookaside
+ * eviction is active in tree 2 when a checkpoint has started and is
+ * working its way through tree 1. In that case, lookaside may have
+ * created a page image with updates in the future of the checkpoint.
+ */
+ if (!F_ISSET(txn, WT_TXN_HAS_TS_READ) &&
+ F_ISSET(txn, WT_TXN_HAS_SNAPSHOT) &&
+ !txn_global->has_stable_timestamp &&
+ WT_TXNID_LT(ref->page_las->las_max_txn,
+ txn->snap_min)) {
+ __wt_tree_modify_set(session);
+ return (WT_NOTFOUND);
+ }
+#ifdef HAVE_TIMESTAMPS
+ /*
+ * Skip lookaside pages if reading as of a timestamp and all the
+ * updates are in the future.
+ */
+ if (F_ISSET(&session->txn, WT_TXN_HAS_TS_READ) &&
+ txn_global->has_stable_timestamp &&
+ WT_TXNID_LT(ref->page_las->las_max_txn, txn->snap_min) &&
+ __wt_timestamp_cmp(
+ &ref->page_las->min_timestamp, &session->txn.read_timestamp) > 0) {
+ __wt_tree_modify_set(session);
+ return (WT_NOTFOUND);
+ }
+#endif
+ return (0);
+}
+
+/*
* __wt_page_in_func --
* Acquire a hazard pointer to a page; if the page is not in-memory,
* read it from the disk and build an in-memory version.
@@ -473,23 +528,8 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
if (ref->state != WT_REF_LOOKASIDE ||
!LF_ISSET(WT_READ_LOOKASIDE))
return (WT_NOTFOUND);
-#ifdef HAVE_TIMESTAMPS
- /*
- * Skip lookaside pages if reading as of a
- * timestamp and all the updates are in the
- * future. If we skip a lookaside page, the
- * tree cannot be left clean: it must be
- * visited by future checkpoints.
- */
- if (F_ISSET(
- &session->txn, WT_TXN_HAS_TS_READ) &&
- __wt_timestamp_cmp(
- &ref->page_las->min_timestamp,
- &session->txn.read_timestamp) > 0) {
- __wt_tree_modify_set(session);
- return (WT_NOTFOUND);
- }
-#endif
+
+ WT_RET(__page_in_lookaside_check(session, ref));
}
/*
@@ -603,7 +643,7 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
continue;
}
- /*
+skip_evict: /*
* If we read the page and are configured to not trash
* the cache, and no other thread has already used the
* page, set the read generation so the page is evicted
@@ -622,7 +662,7 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
__wt_cache_read_gen_new(session, page);
} else if (!LF_ISSET(WT_READ_NO_GEN))
__wt_cache_read_gen_bump(session, page);
-skip_evict:
+
/*
* Check if we need an autocommit transaction.
* Starting a transaction can trigger eviction, so skip
diff --git a/src/btree/bt_split.c b/src/btree/bt_split.c
index 66f0478c542..24c88128a0e 100644
--- a/src/btree/bt_split.c
+++ b/src/btree/bt_split.c
@@ -1383,7 +1383,7 @@ __split_multi_inmem(
WT_DECL_RET;
WT_PAGE *page;
WT_SAVE_UPD *supd;
- WT_UPDATE *prev_upd, *upd;
+ WT_UPDATE *upd;
uint64_t recno;
uint32_t i, slot;
@@ -1474,36 +1474,6 @@ __split_multi_inmem(
break;
WT_ILLEGAL_VALUE_ERR(session);
}
-
- /*
- * Discard the update used to create the on-page disk image.
- * This is not just a performance issue: if the update used to
- * create the value for this on-page disk image was a modify,
- * and it was applied to the previous on-page value to
- * determine a value to write to this disk image, that update
- * cannot be applied to the new on-page value without risking
- * corruption.
- */
- if (supd->onpage_upd != NULL) {
- for (prev_upd = upd; prev_upd != NULL &&
- prev_upd->next != supd->onpage_upd;
- prev_upd = prev_upd->next)
- ;
- /*
- * If the on-page update was in fact a tombstone, there
- * will be no value on the page. Don't throw the
- * tombstone away: we may need it to correctly resolve
- * modifications.
- */
- if (supd->onpage_upd->type == WT_UPDATE_DELETED &&
- prev_upd != NULL)
- prev_upd = prev_upd->next;
- if (prev_upd != NULL) {
- __wt_update_obsolete_free(
- session, page, prev_upd->next);
- prev_upd->next = NULL;
- }
- }
}
/*
@@ -1673,6 +1643,7 @@ __wt_multi_to_ref(WT_SESSION_IMPL *session,
WT_RET(__wt_calloc_one(session, &ref->page_las));
ref->page_las->las_pageid = multi->las_pageid;
+ ref->page_las->las_max_txn = multi->las_max_txn;
#ifdef HAVE_TIMESTAMPS
__wt_timestamp_set(
&ref->page_las->min_timestamp, &multi->las_min_timestamp);
diff --git a/src/conn/conn_cache.c b/src/conn/conn_cache.c
index c83fb544982..007aa8757da 100644
--- a/src/conn/conn_cache.c
+++ b/src/conn/conn_cache.c
@@ -266,6 +266,19 @@ __wt_cache_stats_update(WT_SESSION_IMPL *session)
WT_STAT_SET(session, stats, cache_pages_dirty,
cache->pages_dirty_intl + cache->pages_dirty_leaf);
+ WT_STAT_CONN_SET(session, cache_eviction_state, cache->flags);
+ WT_STAT_CONN_SET(session,
+ cache_eviction_aggressive_set, cache->evict_aggressive_score);
+ WT_STAT_CONN_SET(session,
+ cache_eviction_empty_score, cache->evict_empty_score);
+ WT_STAT_CONN_SET(session,
+ cache_lookaside_score, __wt_cache_lookaside_score(cache));
+
+ WT_STAT_CONN_SET(session,
+ cache_eviction_active_workers, conn->evict_threads.current_threads);
+ WT_STAT_CONN_SET(session, cache_eviction_stable_state_workers,
+ cache->evict_tune_workers_best);
+
/*
* The number of files with active walks ~= number of hazard pointers
* in the walk session. Note: reading without locking.
diff --git a/src/evict/evict_lru.c b/src/evict/evict_lru.c
index daee1b3d29a..2e559531f4b 100644
--- a/src/evict/evict_lru.c
+++ b/src/evict/evict_lru.c
@@ -617,8 +617,6 @@ __evict_update_work(WT_SESSION_IMPL *session)
F_CLR(cache, WT_CACHE_EVICT_CLEAN | WT_CACHE_EVICT_CLEAN_HARD);
}
- WT_STAT_CONN_SET(session, cache_eviction_state, cache->flags);
-
return (F_ISSET(cache, WT_CACHE_EVICT_ALL | WT_CACHE_EVICT_URGENT));
}
@@ -727,9 +725,6 @@ __evict_pass(WT_SESSION_IMPL *session)
txn_global->current != oldest_id &&
cache->evict_aggressive_score < 100)
++cache->evict_aggressive_score;
- WT_STAT_CONN_SET(session,
- cache_eviction_aggressive_set,
- cache->evict_aggressive_score);
prev = now;
prev_oldest_id = oldest_id;
}
@@ -761,12 +756,8 @@ __evict_pass(WT_SESSION_IMPL *session)
"%s", "unable to reach eviction goal");
break;
} else {
- if (cache->evict_aggressive_score > 0) {
+ if (cache->evict_aggressive_score > 0)
--cache->evict_aggressive_score;
- WT_STAT_CONN_SET(session,
- cache_eviction_aggressive_set,
- cache->evict_aggressive_score);
- }
loop = 0;
eviction_progress = cache->eviction_progress;
}
@@ -1098,12 +1089,7 @@ __evict_tune_workers(WT_SESSION_IMPL *session)
WT_STAT_CONN_INCR(session,
cache_eviction_worker_removed);
}
- WT_STAT_CONN_SET(session,
- cache_eviction_stable_state_workers,
- cache->evict_tune_workers_best);
cache->evict_tune_stable = true;
- WT_STAT_CONN_SET(session, cache_eviction_active_workers,
- conn->evict_threads.current_threads);
goto done;
}
}
@@ -1135,9 +1121,6 @@ __evict_tune_workers(WT_SESSION_IMPL *session)
cache->evict_tune_last_action_time = current_time;
}
- WT_STAT_CONN_SET(session, cache_eviction_active_workers,
- conn->evict_threads.current_threads);
-
done: cache->evict_tune_last_time = current_time;
cache->evict_tune_progress_last = eviction_progress;
}
@@ -1187,11 +1170,8 @@ __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_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;
@@ -1221,14 +1201,10 @@ __evict_lru_walk(WT_SESSION_IMPL *session)
*/
if (__evict_queue_empty(queue, false)) {
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_CONN_SET(session,
- cache_eviction_empty_score,
- cache->evict_empty_score);
- }
WT_STAT_CONN_INCR(session, cache_eviction_queue_empty);
} else
WT_STAT_CONN_INCR(session, cache_eviction_queue_not_empty);
diff --git a/src/evict/evict_page.c b/src/evict/evict_page.c
index edf80ec4460..d0128d8bcdd 100644
--- a/src/evict/evict_page.c
+++ b/src/evict/evict_page.c
@@ -576,18 +576,13 @@ __evict_review(
}
/*
- * If the cache is nearly stuck, check if
- * reconciliation suggests trying the lookaside table
- * unless lookaside eviction is disabled globally.
- *
- * We don't wait until the cache is completely stuck:
- * for workloads where lookaside eviction is necessary
- * to make progress, we don't want a single successful
- * page eviction to make the cache "unstuck" so we have
- * to wait again before evicting the next page.
+ * If the cache is under pressure with many updates
+ * that can't be evicted, check if reconciliation
+ * suggests trying the lookaside table.
*/
- if (__wt_cache_nearly_stuck(session) &&
- !F_ISSET(conn, WT_CONN_EVICTION_NO_LOOKASIDE))
+ if (!F_ISSET(conn, WT_CONN_EVICTION_NO_LOOKASIDE) &&
+ (__wt_cache_lookaside_score(cache) > 50 ||
+ __wt_cache_stuck(session)))
lookaside_retryp = &lookaside_retry;
}
}
diff --git a/src/include/btmem.h b/src/include/btmem.h
index 158fcf87d29..8662c40c635 100644
--- a/src/include/btmem.h
+++ b/src/include/btmem.h
@@ -242,6 +242,7 @@ struct __wt_page_modify {
/* The page has lookaside entries. */
uint64_t las_pageid;
+ uint64_t las_max_txn;
WT_DECL_TIMESTAMP(las_min_timestamp)
} r;
#undef mod_replace
@@ -250,6 +251,8 @@ struct __wt_page_modify {
#define mod_disk_image u1.r.disk_image
#undef mod_replace_las_pageid
#define mod_replace_las_pageid u1.r.las_pageid
+#undef mod_replace_las_max_txn
+#define mod_replace_las_max_txn u1.r.las_max_txn
#undef mod_replace_las_min_timestamp
#define mod_replace_las_min_timestamp u1.r.las_min_timestamp
@@ -298,6 +301,7 @@ struct __wt_page_modify {
uint32_t checksum;
uint64_t las_pageid;
+ uint64_t las_max_txn;
WT_DECL_TIMESTAMP(las_min_timestamp)
} *multi;
uint32_t multi_entries; /* Multiple blocks element count */
@@ -726,6 +730,8 @@ struct __wt_page_deleted {
*/
struct __wt_page_lookaside {
uint64_t las_pageid; /* Page ID in lookaside */
+ uint64_t las_max_txn; /* Maximum transaction ID in
+ lookaside */
WT_DECL_TIMESTAMP(min_timestamp) /* Oldest timestamp in
lookaside for the page */
};
diff --git a/src/include/cache.h b/src/include/cache.h
index 456cb0382e4..0a42853b95b 100644
--- a/src/include/cache.h
+++ b/src/include/cache.h
@@ -152,20 +152,28 @@ struct __wt_cache {
#define WT_EVICT_SCORE_BUMP 10
#define WT_EVICT_SCORE_CUTOFF 10
#define WT_EVICT_SCORE_MAX 100
- uint32_t evict_aggressive_score;/* Score of how aggressive eviction
- should be about selecting eviction
- candidates. If eviction is
- struggling to make progress, this
- score rises (up to a maximum of
- 100), at which point the cache is
- "stuck" and transaction will be
- rolled back. */
- uint32_t evict_empty_score; /* Score of how often LRU queues are
- empty on refill. This score varies
- between 0 (if the queue hasn't been
- empty for a long time) and 100 (if
- the queue has been empty the last 10
- times we filled up. */
+ /*
+ * Score of how aggressive eviction should be about selecting eviction
+ * candidates. If eviction is struggling to make progress, this score
+ * rises (up to a maximum of 100), at which point the cache is "stuck"
+ * and transaction will be rolled back.
+ */
+ uint32_t evict_aggressive_score;
+
+ /*
+ * Score of how often LRU queues are empty on refill. This score varies
+ * between 0 (if the queue hasn't been empty for a long time) and 100
+ * (if the queue has been empty the last 10 times we filled up.
+ */
+ uint32_t evict_empty_score;
+
+ /*
+ * Score of how much pressure storing historical versions is having on
+ * eviction. This score varies between 0, if reconciliation always
+ * sees updates that are globally visible and hence can be discarded,
+ * to 100 if no updates are globally visible.
+ */
+ int32_t evict_lookaside_score;
/*
* Cache pool information.
diff --git a/src/include/cache.i b/src/include/cache.i
index 33b1bf2a7af..e160dbf4d64 100644
--- a/src/include/cache.i
+++ b/src/include/cache.i
@@ -79,22 +79,6 @@ __wt_cache_read_gen_new(WT_SESSION_IMPL *session, WT_PAGE *page)
}
/*
- * __wt_cache_nearly_stuck --
- * Indicate if the cache is nearly stuck.
- */
-static inline bool
-__wt_cache_nearly_stuck(WT_SESSION_IMPL *session)
-{
- WT_CACHE *cache;
-
- cache = S2C(session)->cache;
- return (cache->evict_aggressive_score >=
- (WT_EVICT_SCORE_MAX - WT_EVICT_SCORE_BUMP) &&
- F_ISSET(cache,
- WT_CACHE_EVICT_CLEAN_HARD | WT_CACHE_EVICT_DIRTY_HARD));
-}
-
-/*
* __wt_cache_stuck --
* Indicate if the cache is stuck (i.e., not making progress).
*/
@@ -205,6 +189,43 @@ __wt_cache_bytes_other(WT_CACHE *cache)
}
/*
+ * __wt_cache_lookaside_score --
+ * Get the current lookaside score (between 0 and 100).
+ */
+static inline uint32_t
+__wt_cache_lookaside_score(WT_CACHE *cache)
+{
+ int32_t global_score;
+
+ global_score = cache->evict_lookaside_score;
+ return ((uint32_t)WT_MIN(WT_MAX(global_score, 0), 100));
+}
+
+/*
+ * __wt_cache_update_lookaside_score --
+ * Update the lookaside score based how many unstable updates are seen.
+ */
+static inline void
+__wt_cache_update_lookaside_score(
+ WT_SESSION_IMPL *session, u_int updates_seen, u_int updates_unstable)
+{
+ WT_CACHE *cache;
+ int32_t global_score, score;
+
+ if (updates_seen == 0)
+ return;
+
+ cache = S2C(session)->cache;
+ score = (int32_t)((100 * updates_unstable) / updates_seen);
+ global_score = cache->evict_lookaside_score;
+
+ if (score > global_score && global_score < 100)
+ __wt_atomic_addi32(&cache->evict_lookaside_score, 1);
+ else if (score < global_score && global_score > 0)
+ __wt_atomic_subi32(&cache->evict_lookaside_score, 1);
+}
+
+/*
* __wt_session_can_wait --
* Return if a session available for a potentially slow operation.
*/
diff --git a/src/include/stat.h b/src/include/stat.h
index 922b211bec4..12a7d532496 100644
--- a/src/include/stat.h
+++ b/src/include/stat.h
@@ -341,6 +341,7 @@ struct __wt_connection_stats {
int64_t cache_eviction_internal;
int64_t cache_eviction_split_internal;
int64_t cache_eviction_split_leaf;
+ int64_t cache_lookaside_score;
int64_t cache_lookaside_entries;
int64_t cache_lookaside_insert;
int64_t cache_lookaside_remove;
diff --git a/src/include/wiredtiger.in b/src/include/wiredtiger.in
index aeea3394015..41dd970d3ba 100644
--- a/src/include/wiredtiger.in
+++ b/src/include/wiredtiger.in
@@ -4854,456 +4854,458 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1082
/*! cache: leaf pages split during eviction */
#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1083
+/*! cache: lookaside score */
+#define WT_STAT_CONN_CACHE_LOOKASIDE_SCORE 1084
/*! cache: lookaside table entries */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_ENTRIES 1084
+#define WT_STAT_CONN_CACHE_LOOKASIDE_ENTRIES 1085
/*! cache: lookaside table insert calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1085
+#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1086
/*! cache: lookaside table remove calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1086
+#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1087
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1087
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1088
/*! cache: maximum page size at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1088
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1089
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1089
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1090
/*! cache: modified pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1090
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1091
/*! cache: overflow pages read into cache */
-#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1091
+#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1092
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1092
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1093
/*! cache: page written requiring lookaside records */
-#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1093
+#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1094
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1094
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1095
/*! cache: pages evicted because they exceeded the in-memory maximum count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1095
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1096
/*!
* cache: pages evicted because they exceeded the in-memory maximum time
* (usecs)
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_TIME 1096
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_TIME 1097
/*! cache: pages evicted because they had chains of deleted items count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1097
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1098
/*!
* cache: pages evicted because they had chains of deleted items time
* (usecs)
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE_TIME 1098
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE_TIME 1099
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1099
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1100
/*! cache: pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1100
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1101
/*! cache: pages queued for urgent eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1101
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1102
/*! cache: pages queued for urgent eviction during walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1102
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1103
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1103
+#define WT_STAT_CONN_CACHE_READ 1104
/*! cache: pages read into cache requiring lookaside entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1104
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1105
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1105
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1106
/*! cache: pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1106
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1107
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1107
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1108
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1108
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1109
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1109
+#define WT_STAT_CONN_CACHE_WRITE 1110
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1110
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1111
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1111
+#define WT_STAT_CONN_CACHE_OVERHEAD 1112
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1112
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1113
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1113
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1114
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1114
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1115
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1115
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1116
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1116
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1117
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1117
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1118
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1118
+#define WT_STAT_CONN_COND_AUTO_WAIT 1119
/*! connection: detected system time went backwards */
-#define WT_STAT_CONN_TIME_TRAVEL 1119
+#define WT_STAT_CONN_TIME_TRAVEL 1120
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1120
+#define WT_STAT_CONN_FILE_OPEN 1121
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1121
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1122
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1122
+#define WT_STAT_CONN_MEMORY_FREE 1123
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1123
+#define WT_STAT_CONN_MEMORY_GROW 1124
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1124
+#define WT_STAT_CONN_COND_WAIT 1125
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1125
+#define WT_STAT_CONN_RWLOCK_READ 1126
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1126
+#define WT_STAT_CONN_RWLOCK_WRITE 1127
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1127
+#define WT_STAT_CONN_FSYNC_IO 1128
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1128
+#define WT_STAT_CONN_READ_IO 1129
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1129
+#define WT_STAT_CONN_WRITE_IO 1130
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1130
+#define WT_STAT_CONN_CURSOR_CREATE 1131
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1131
+#define WT_STAT_CONN_CURSOR_INSERT 1132
/*! cursor: cursor modify calls */
-#define WT_STAT_CONN_CURSOR_MODIFY 1132
+#define WT_STAT_CONN_CURSOR_MODIFY 1133
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1133
+#define WT_STAT_CONN_CURSOR_NEXT 1134
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1134
+#define WT_STAT_CONN_CURSOR_PREV 1135
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1135
+#define WT_STAT_CONN_CURSOR_REMOVE 1136
/*! cursor: cursor reserve calls */
-#define WT_STAT_CONN_CURSOR_RESERVE 1136
+#define WT_STAT_CONN_CURSOR_RESERVE 1137
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1137
+#define WT_STAT_CONN_CURSOR_RESET 1138
/*! cursor: cursor restarted searches */
-#define WT_STAT_CONN_CURSOR_RESTART 1138
+#define WT_STAT_CONN_CURSOR_RESTART 1139
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1139
+#define WT_STAT_CONN_CURSOR_SEARCH 1140
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1140
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1141
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1141
+#define WT_STAT_CONN_CURSOR_UPDATE 1142
/*! cursor: truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1142
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1143
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1143
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1144
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1144
+#define WT_STAT_CONN_DH_SWEEP_REF 1145
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1145
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1146
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1146
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1147
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1147
+#define WT_STAT_CONN_DH_SWEEP_TOD 1148
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1148
+#define WT_STAT_CONN_DH_SWEEPS 1149
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1149
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1150
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1150
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1151
/*! lock: checkpoint lock acquisitions */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1151
+#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1152
/*! lock: checkpoint lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1152
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1153
/*! lock: checkpoint lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1153
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1154
/*!
* lock: dhandle lock application thread time waiting for the dhandle
* lock (usecs)
*/
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1154
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1155
/*!
* lock: dhandle lock internal thread time waiting for the dhandle lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1155
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1156
/*! lock: dhandle read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1156
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1157
/*! lock: dhandle write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1157
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1158
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1158
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1159
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1159
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1160
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1160
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1161
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1161
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1162
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1162
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1163
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1163
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1164
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1164
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1165
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1165
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1166
/*! lock: table read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1166
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1167
/*! lock: table write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1167
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1168
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1168
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1169
/*! log: force checkpoint calls slept */
-#define WT_STAT_CONN_LOG_FORCE_CKPT_SLEEP 1169
+#define WT_STAT_CONN_LOG_FORCE_CKPT_SLEEP 1170
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1170
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1171
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1171
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1172
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1172
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1173
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1173
+#define WT_STAT_CONN_LOG_FLUSH 1174
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1174
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1175
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1175
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1176
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1176
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1177
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1177
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1178
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1178
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1179
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1179
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1180
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1180
+#define WT_STAT_CONN_LOG_SCANS 1181
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1181
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1182
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1182
+#define WT_STAT_CONN_LOG_WRITE_LSN 1183
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1183
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1184
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1184
+#define WT_STAT_CONN_LOG_SYNC 1185
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1185
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1186
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1186
+#define WT_STAT_CONN_LOG_SYNC_DIR 1187
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1187
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1188
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1188
+#define WT_STAT_CONN_LOG_WRITES 1189
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1189
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1190
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1190
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1191
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1191
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1192
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1192
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1193
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1193
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1194
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1194
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1195
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1195
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1196
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1196
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1197
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1197
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1198
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1198
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1199
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1199
+#define WT_STAT_CONN_LOG_SLOT_RACES 1200
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1200
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1201
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1201
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1202
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1202
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1203
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1203
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1204
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1204
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1205
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1205
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1206
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1206
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1207
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1207
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1208
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1208
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1209
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1209
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1210
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1210
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1211
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1211
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1212
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1212
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1213
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1213
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1214
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1214
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1215
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1215
+#define WT_STAT_CONN_REC_PAGES 1216
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1216
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1217
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1217
+#define WT_STAT_CONN_REC_PAGE_DELETE 1218
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1218
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1219
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1219
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1220
/*! session: open cursor count */
-#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1220
+#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1221
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1221
+#define WT_STAT_CONN_SESSION_OPEN 1222
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1222
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1223
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1223
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1224
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1224
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1225
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1225
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1226
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1226
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1227
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1227
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1228
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1228
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1229
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1229
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1230
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1230
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1231
/*! session: table rebalance failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1231
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1232
/*! session: table rebalance successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1232
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1233
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1233
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1234
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1234
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1235
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1235
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1236
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1236
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1237
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1237
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1238
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1238
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1239
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1239
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1240
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1240
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1241
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1241
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1242
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1242
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1243
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1243
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1244
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1244
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1245
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1245
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1246
/*!
* thread-yield: connection close blocked waiting for transaction state
* stabilization
*/
-#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1246
+#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1247
/*! thread-yield: connection close yielded for lsm manager shutdown */
-#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1247
+#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1248
/*! thread-yield: data handle lock yielded */
-#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1248
+#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1249
/*!
* thread-yield: get reference for page index and slot time sleeping
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1249
+#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1250
/*! thread-yield: log server sync yielded for log write */
-#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1250
+#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1251
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1251
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1252
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1252
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1253
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1253
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1254
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1254
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1255
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1255
+#define WT_STAT_CONN_PAGE_SLEEP 1256
/*!
* thread-yield: page delete rollback time sleeping for state change
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1256
+#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1257
/*! thread-yield: page reconciliation yielded due to child modification */
-#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1257
+#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1258
/*!
* thread-yield: tree descend one level yielded for split page index
* update
*/
-#define WT_STAT_CONN_TREE_DESCEND_BLOCKED 1258
+#define WT_STAT_CONN_TREE_DESCEND_BLOCKED 1259
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1259
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1260
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1260
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1261
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1261
+#define WT_STAT_CONN_TXN_BEGIN 1262
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1262
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1263
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1263
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1264
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1264
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1265
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1265
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1266
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1266
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1267
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1267
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1268
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1268
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1269
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1269
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1270
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1270
+#define WT_STAT_CONN_TXN_CHECKPOINT 1271
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1271
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1272
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1272
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1273
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1273
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1274
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1274
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1275
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1275
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1276
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1276
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1277
/*!
* transaction: transaction range of IDs currently pinned by named
* snapshots
*/
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1277
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1278
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1278
+#define WT_STAT_CONN_TXN_SYNC 1279
/*! transaction: transactions commit timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1279
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1280
/*! transaction: transactions commit timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1280
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1281
/*! transaction: transactions commit timestamp queue length */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1281
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1282
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1282
+#define WT_STAT_CONN_TXN_COMMIT 1283
/*! transaction: transactions read timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1283
+#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1284
/*! transaction: transactions read timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1284
+#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1285
/*! transaction: transactions read timestamp queue length */
-#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1285
+#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1286
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1286
+#define WT_STAT_CONN_TXN_ROLLBACK 1287
/*! transaction: update conflicts */
-#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1287
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1288
/*!
* @}
diff --git a/src/reconcile/rec_write.c b/src/reconcile/rec_write.c
index ae856649ede..c3e0cb20ec1 100644
--- a/src/reconcile/rec_write.c
+++ b/src/reconcile/rec_write.c
@@ -50,6 +50,9 @@ typedef struct {
WT_DECL_TIMESTAMP(max_timestamp)
WT_DECL_TIMESTAMP(min_saved_timestamp)
+ u_int updates_seen; /* Count of updates seen. */
+ u_int updates_unstable; /* Count of updates not visible_all. */
+
bool update_uncommitted; /* An update was uncommitted */
bool update_used; /* An update could be used */
@@ -450,6 +453,15 @@ __wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref,
WT_ILLEGAL_VALUE_SET(session);
}
+ /*
+ * Update the global lookaside score. Only use observations during
+ * eviction, not checkpoints and don't count eviction of the lookaside
+ * table itself.
+ */
+ if (F_ISSET(r, WT_REC_EVICT) && !F_ISSET(btree, WT_BTREE_LOOKASIDE))
+ __wt_cache_update_lookaside_score(
+ session, r->updates_seen, r->updates_unstable);
+
/* Check for a successful reconciliation. */
WT_TRET(__rec_write_check_complete(session, r, ret, lookaside_retryp));
@@ -970,6 +982,7 @@ __rec_init(WT_SESSION_IMPL *session,
#endif
/* Track if updates were used and/or uncommitted. */
+ r->updates_seen = r->updates_unstable = 0;
r->update_uncommitted = r->update_used = false;
/* Track if the page can be marked clean. */
@@ -1255,6 +1268,7 @@ __rec_txn_read(WT_SESSION_IMPL *session, WT_RECONCILE *r,
if ((txnid = upd->txnid) == WT_TXN_ABORTED)
continue;
+ ++r->updates_seen;
upd_memsize += WT_UPDATE_MEMSIZE(upd);
/*
@@ -1297,10 +1311,28 @@ __rec_txn_read(WT_SESSION_IMPL *session, WT_RECONCILE *r,
* uncommitted updates). Lookaside eviction can save any
* committed update. Regular eviction checks that the maximum
* transaction ID and timestamp seen are stable.
+ *
+ * Lookaside eviction tries to choose the same version as a
+ * subsequent checkpoint, so that checkpoint can skip over
+ * pages with lookaside entries. If the application has
+ * supplied a stable timestamp, we assume (a) that it is old,
+ * and (b) that the next checkpoint will use it, so we wait to
+ * see a stable update. If there is no stable timestamp, we
+ * assume the next checkpoint will write the most recent
+ * version (but we save enough information that checkpoint can
+ * fix things up if we choose an update that is too new).
*/
+ if (*updp == NULL && F_ISSET(r, WT_REC_LOOKASIDE) &&
+ F_ISSET(r, WT_REC_VISIBLE_ALL) &&
+ !S2C(session)->txn_global.has_stable_timestamp)
+ *updp = upd;
+
if (F_ISSET(r, WT_REC_VISIBLE_ALL) ?
!__wt_txn_upd_visible_all(session, upd) :
!__wt_txn_upd_visible(session, upd)) {
+ if (F_ISSET(r, WT_REC_EVICT))
+ ++r->updates_unstable;
+
/*
* Rare case: when applications run at low isolation
* levels, update/restore eviction may see a stable
@@ -1441,12 +1473,14 @@ check_original_value:
/*
* Returning an update means the original on-page value might be lost,
* and that's a problem if there's a reader that needs it. There are
- * two cases: any lookaside table eviction (because the backing disk
- * image is rewritten), or any reconciliation of a backing overflow
- * record that will be physically removed once it's no longer needed.
- */
- if (*updp != NULL && (F_ISSET(r, WT_REC_LOOKASIDE) ||
- (vpack != NULL &&
+ * three cases: any update from a modify operation (because the modify
+ * has to be applied to a stable update, not the new on-page update),
+ * any lookaside table eviction (because the backing disk image is
+ * rewritten), or any reconciliation of a backing overflow record that
+ * will be physically removed once it's no longer needed.
+ */
+ if (*updp != NULL && ((*updp)->type == WT_UPDATE_MODIFIED ||
+ F_ISSET(r, WT_REC_LOOKASIDE) || (vpack != NULL &&
vpack->ovfl && vpack->raw != WT_CELL_VALUE_OVFL_RM)))
WT_RET(
__rec_append_orig_value(session, page, first_upd, vpack));
@@ -3301,6 +3335,12 @@ __rec_split_write_supd(WT_SESSION_IMPL *session,
r->supd_next = j;
}
+ /* Track the oldest timestamp seen so far. */
+#ifdef HAVE_TIMESTAMPS
+ multi->las_max_txn = r->max_txn;
+ __wt_timestamp_set(&multi->las_min_timestamp, &r->min_saved_timestamp);
+#endif
+
err: __wt_scr_free(session, &key);
return (ret);
}
@@ -5870,6 +5910,7 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
mod->mod_disk_image = r->multi->disk_image;
r->multi->disk_image = NULL;
mod->mod_replace_las_pageid = r->multi->las_pageid;
+ mod->mod_replace_las_max_txn = r->max_txn;
#ifdef HAVE_TIMESTAMPS
__wt_timestamp_set(&mod->mod_replace_las_min_timestamp,
&r->min_saved_timestamp);
diff --git a/src/support/stat.c b/src/support/stat.c
index 57dcd33c7f1..924afaa21d6 100644
--- a/src/support/stat.c
+++ b/src/support/stat.c
@@ -809,6 +809,7 @@ static const char * const __stats_connection_desc[] = {
"cache: internal pages evicted",
"cache: internal pages split during eviction",
"cache: leaf pages split during eviction",
+ "cache: lookaside score",
"cache: lookaside table entries",
"cache: lookaside table insert calls",
"cache: lookaside table remove calls",
@@ -1139,6 +1140,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_internal = 0;
stats->cache_eviction_split_internal = 0;
stats->cache_eviction_split_leaf = 0;
+ /* not clearing cache_lookaside_score */
/* not clearing cache_lookaside_entries */
stats->cache_lookaside_insert = 0;
stats->cache_lookaside_remove = 0;
@@ -1490,6 +1492,8 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, cache_eviction_split_internal);
to->cache_eviction_split_leaf +=
WT_STAT_READ(from, cache_eviction_split_leaf);
+ to->cache_lookaside_score +=
+ WT_STAT_READ(from, cache_lookaside_score);
to->cache_lookaside_entries +=
WT_STAT_READ(from, cache_lookaside_entries);
to->cache_lookaside_insert +=