summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger')
-rw-r--r--src/third_party/wiredtiger/dist/api_data.py7
-rwxr-xr-xsrc/third_party/wiredtiger/dist/s_clang-format56
-rw-r--r--src/third_party/wiredtiger/dist/s_string.ok4
-rw-r--r--src/third_party/wiredtiger/dist/stat_data.py8
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/block/block_compact.c19
-rw-r--r--src/third_party/wiredtiger/src/block_cache/block_cache.c4
-rw-r--r--src/third_party/wiredtiger/src/block_cache/block_mgr.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_compact.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c22
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c22
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_discard.c1
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_page.c5
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_random.c76
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_sync.c39
-rw-r--r--src/third_party/wiredtiger/src/btree/row_srch.c6
-rw-r--r--src/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.c8
-rw-r--r--src/third_party/wiredtiger/src/config/config_def.c178
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_cache.c3
-rw-r--r--src/third_party/wiredtiger/src/cursor/cur_file.c6
-rw-r--r--src/third_party/wiredtiger/src/docs/build-posix.dox2
-rw-r--r--src/third_party/wiredtiger/src/docs/build-windows.dox2
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_lru.c49
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_page.c53
-rw-r--r--src/third_party/wiredtiger/src/include/block.h2
-rw-r--r--src/third_party/wiredtiger/src/include/btmem.h30
-rw-r--r--src/third_party/wiredtiger/src/include/btree_inline.h61
-rw-r--r--src/third_party/wiredtiger/src/include/column_inline.h6
-rw-r--r--src/third_party/wiredtiger/src/include/compact.h3
-rw-r--r--src/third_party/wiredtiger/src/include/connection.h1
-rw-r--r--src/third_party/wiredtiger/src/include/cursor.h6
-rw-r--r--src/third_party/wiredtiger/src/include/extern.h14
-rw-r--r--src/third_party/wiredtiger/src/include/misc.h1
-rw-r--r--src/third_party/wiredtiger/src/include/os.h12
-rw-r--r--src/third_party/wiredtiger/src/include/stat.h11
-rw-r--r--src/third_party/wiredtiger/src/include/time_inline.h2
-rw-r--r--src/third_party/wiredtiger/src/include/timestamp_inline.h36
-rw-r--r--src/third_party/wiredtiger/src/include/txn.h46
-rw-r--r--src/third_party/wiredtiger/src/include/txn_inline.h37
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in1401
-rw-r--r--src/third_party/wiredtiger/src/include/wt_internal.h4
-rw-r--r--src/third_party/wiredtiger/src/log/log_sys.c12
-rw-r--r--src/third_party/wiredtiger/src/meta/meta_ckpt.c18
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_write.c135
-rw-r--r--src/third_party/wiredtiger/src/session/session_compact.c1
-rw-r--r--src/third_party/wiredtiger/src/support/rand.c49
-rw-r--r--src/third_party/wiredtiger/src/support/stat.c47
-rw-r--r--src/third_party/wiredtiger/src/txn/txn.c103
-rw-r--r--src/third_party/wiredtiger/src/txn/txn_ckpt.c10
-rw-r--r--src/third_party/wiredtiger/src/txn/txn_log.c6
-rw-r--r--src/third_party/wiredtiger/src/txn/txn_recover.c18
-rw-r--r--src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c4
-rwxr-xr-xsrc/third_party/wiredtiger/src/utilities/util_dump.c5
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/thread_manager.h2
-rwxr-xr-xsrc/third_party/wiredtiger/test/evergreen.yml88
-rw-r--r--src/third_party/wiredtiger/test/multiversion/wt_multiversion.sh2
-rw-r--r--src/third_party/wiredtiger/test/packing/intpack-test3.c2
-rw-r--r--src/third_party/wiredtiger/test/suite/test_app_thread_evict01.py85
-rw-r--r--src/third_party/wiredtiger/test/suite/test_checkpoint32.py116
-rw-r--r--src/third_party/wiredtiger/test/suite/test_cursor_random03.py77
-rw-r--r--src/third_party/wiredtiger/test/suite/test_scrub_eviction_prepare.py111
61 files changed, 2070 insertions, 1074 deletions
diff --git a/src/third_party/wiredtiger/dist/api_data.py b/src/third_party/wiredtiger/dist/api_data.py
index 7c759b87ca9..691288a5023 100644
--- a/src/third_party/wiredtiger/dist/api_data.py
+++ b/src/third_party/wiredtiger/dist/api_data.py
@@ -671,6 +671,10 @@ connection_runtime_config = [
pages from cache. The number of threads currently running will
vary depending on the current eviction load''',
min=1, max=20),
+ Config('evict_sample_inmem', 'true', r'''
+ If no in-memory ref is found on the root page, attempt to locate a random
+ in-memory page by examining all entries on the root page.''',
+ type='boolean'),
]),
Config('eviction_checkpoint_target', '1', r'''
perform eviction at the beginning of checkpoints to bring the dirty
@@ -1602,6 +1606,9 @@ methods = {
the object into \c next_random_sample_size equal-sized pieces,
and each retrieval returns a record from one of those pieces. See
@ref cursor_random for details'''),
+ Config('next_random_seed', '0', r'''
+ configure the cursor to set an initial random seed when using \c next_random configuration.
+ This is used for testing purposes only. See @ref cursor_random for details'''),
Config('raw', 'false', r'''
ignore the encodings for the key and value, manage data as if
the formats were \c "u". See @ref cursor_raw for details''',
diff --git a/src/third_party/wiredtiger/dist/s_clang-format b/src/third_party/wiredtiger/dist/s_clang-format
index 80de76b7c36..076e3302397 100755
--- a/src/third_party/wiredtiger/dist/s_clang-format
+++ b/src/third_party/wiredtiger/dist/s_clang-format
@@ -6,16 +6,33 @@ t=__wt.$$
trap 'rm -rf $t' 0 1 2 3 13 15
download_clang_format() {
- if [ `uname` = "Linux" ]; then
- curl https://s3.amazonaws.com/boxes.10gen.com/build/clang-format-llvm-10.0.0-x86_64-linux-gnu-ubuntu-20.04.tar-1.gz -o dist/clang-format.tar.gz
- tar --strip=1 -C dist/ -xf dist/clang-format.tar.gz clang-format-llvm-10.0.0-x86_64-linux-gnu-ubuntu-20.04/clang-format && rm dist/clang-format.tar.gz
- elif [ `uname` = "Darwin" ]; then
- curl https://s3.amazonaws.com/boxes.10gen.com/build/build/clang-format-llvm-10.0.0-x86_64-apple-darwin.tar.gz -o dist/clang-format.tar.gz
- tar --strip=1 -C dist/ -xf dist/clang-format.tar.gz clang-format-llvm-10.0.0-x86_64-apple-darwin/clang-format && rm dist/clang-format.tar.gz
- else
- echo "$0: unsupported environment $(uname)"
- exit 1
- fi
+ version=$1
+ arch_and_os="$(uname -m)-$(uname)"
+ archive=dist/clang-format.tar.gz
+
+ # Adding more clang-format binaries requires uploading them to boxes.10gen
+ # You can either get the clang-format binary from the llvm releases page
+ # (https://github.com/llvm/llvm-project/releases) or compile clang-format yourself.
+ # Place the binary in dist/ and confirm that s_clang_format runs correctly, then
+ # tar a folder containing just the clang-format binary with the format:
+ # clang-format-llvm-${version}-${arch_and_os}/
+ # clang-format
+ # into a tarball named clang-format-llvm-${version}-${arch_and_os}.tar.gz
+ # The tarball should extract using the tar command below.
+ # This tarball can then be uploaded via a Jira request to the BUILD team.
+ if [[ "$arch_and_os" =~ ^("aarch64-Linux"|"x86_64-Darwin"|"arm64-Darwin"|"x86_64-Linux")$ ]] ; then
+ curl https://s3.amazonaws.com/boxes.10gen.com/build/clang-format-llvm-"$version"-"$arch_and_os".tar.gz -o $archive
+ tar --strip=1 -C dist/ -xf $archive clang-format-llvm-"$version"-"$arch_and_os"/clang-format && rm $archive
+ chmod +x ./dist/clang-format
+
+ if [[ "$arch_and_os" =~ ^("x86_64-Darwin"|"arm64-Darwin")$ ]] ; then
+ # Needed to get around the macOS code signing issue.
+ xattr -c ./dist/clang-format
+ fi
+ else
+ echo "$0: unsupported architecture and OS combination '$arch_and_os' to run clang_format"
+ return 1
+ fi
}
# Find the top-level WiredTiger directory and move to there.
@@ -24,19 +41,12 @@ cd `git rev-parse --show-toplevel` || exit 1
# Override existing Clang Format versions in the PATH.
export PATH="${PWD}/dist":$PATH
-# Download the clang-format binary if it's not in place.
-[ ! -x "$(command -v clang-format)" ] && download_clang_format
-
-# Ensure that we have the correct version of clang-format.
-desired_version="10.0.0"
-
-# On macOS Catalina, users need to manually approve binaries.
-# If we're not allowed to run clang-format, let's exit (should be obvious from the dialog).
-current_version=`clang-format --version` || exit 1
-
-echo $current_version | grep "version $desired_version" >/dev/null 2>&1
-if test $? -ne 0; then
- download_clang_format
+# Check if Clang-Format is already available with the desired version.
+desired_version="12.0.1"
+if ! command -v clang-format &> /dev/null; then
+ download_clang_format $desired_version || exit 1
+elif ! clang-format --version | grep -q $desired_version; then
+ download_clang_format $desired_version || exit 1
fi
case $# in
diff --git a/src/third_party/wiredtiger/dist/s_string.ok b/src/third_party/wiredtiger/dist/s_string.ok
index 8c30d153783..54c3803a00e 100644
--- a/src/third_party/wiredtiger/dist/s_string.ok
+++ b/src/third_party/wiredtiger/dist/s_string.ok
@@ -291,6 +291,7 @@ MULTIBLOCK
MUTEX
Manos
MapViewOfFile
+Marsaglia
Marsaglia's
Mellor
Memrata
@@ -380,6 +381,7 @@ RLE
RLEs
RMW
RNG
+RNGs
RPC
RTS
RUNDIR
@@ -533,6 +535,7 @@ Wunused
XP
Xcode
Xcode/
+Xorshift
YCSB
Yann
ZSTD
@@ -984,6 +987,7 @@ iiii
iiu
ikey
im
+img
impl
incr
incrementals
diff --git a/src/third_party/wiredtiger/dist/stat_data.py b/src/third_party/wiredtiger/dist/stat_data.py
index 5d5c9f60690..ce41c46f427 100644
--- a/src/third_party/wiredtiger/dist/stat_data.py
+++ b/src/third_party/wiredtiger/dist/stat_data.py
@@ -288,6 +288,7 @@ conn_stats = [
CacheStat('cache_eviction_server_skip_trees_stick_in_cache', 'eviction server skips trees that are configured to stick in cache'),
CacheStat('cache_eviction_server_skip_trees_too_many_active_walks', 'eviction server skips trees because there are too many active walks'),
CacheStat('cache_eviction_server_skip_unwanted_pages', 'eviction server skips pages that we do not want to evict'),
+ CacheStat('cache_eviction_server_skip_unwanted_tree', 'eviction server skips tree that we do not want to evict'),
CacheStat('cache_eviction_server_slept', 'eviction server slept, because we did not make progress with eviction'),
CacheStat('cache_eviction_slow', 'eviction server unable to reach eviction goal'),
CacheStat('cache_eviction_stable_state_workers', 'eviction worker thread stable number', 'no_clear'),
@@ -638,6 +639,7 @@ conn_stats = [
##########################################
YieldStat('application_cache_time', 'application thread time waiting for cache (usecs)'),
YieldStat('application_evict_time', 'application thread time evicting (usecs)'),
+ YieldStat('application_evict_snapshot_refreshed', 'application thread snapshot refreshed for eviction'),
YieldStat('child_modify_blocked_page', 'page reconciliation yielded due to child modification'),
YieldStat('conn_close_blocked_lsm', 'connection close yielded for lsm manager shutdown'),
YieldStat('dhandle_lock_blocked', 'data handle lock yielded'),
@@ -676,6 +678,7 @@ dsrc_stats = [
# Btree statistics
##########################################
BtreeStat('btree_checkpoint_generation', 'btree checkpoint generation', 'no_clear,no_scale'),
+ BtreeStat('btree_checkpoint_pages_reconciled', 'btree number of pages reconciled during checkpoint', 'no_clear,no_scale'),
BtreeStat('btree_clean_checkpoint_timer', 'btree clean tree checkpoint expiration time', 'no_clear,no_scale'),
BtreeStat('btree_column_deleted', 'column-store variable-size deleted values', 'no_scale,tree_walk'),
BtreeStat('btree_column_fix', 'column-store fixed-size leaf pages', 'no_scale,tree_walk'),
@@ -842,6 +845,7 @@ conn_dsrc_stats = [
CacheStat('cache_eviction_hazard', 'hazard pointer blocked page eviction'),
CacheStat('cache_eviction_internal', 'internal pages evicted'),
CacheStat('cache_eviction_pages_seen', 'pages seen by eviction walk'),
+ CacheStat('cache_eviction_random_sample_inmem_root', 'locate a random in-mem ref by examining all entries on the root page'),
CacheStat('cache_eviction_split_internal', 'internal pages split during eviction'),
CacheStat('cache_eviction_split_leaf', 'leaf pages split during eviction'),
CacheStat('cache_eviction_target_page_ge128', 'eviction walk target pages histogram - 128 and higher'),
@@ -851,6 +855,7 @@ conn_dsrc_stats = [
CacheStat('cache_eviction_target_page_lt64', 'eviction walk target pages histogram - 32-63'),
CacheStat('cache_eviction_target_page_reduced', 'eviction walk target pages reduced due to history store cache pressure'),
CacheStat('cache_eviction_walk_from_root', 'eviction walks started from root of tree'),
+ CacheStat('cache_eviction_walk_random_returns_null_position', 'eviction walks random search fails to locate a page, results in a null position'),
CacheStat('cache_eviction_walk_restart', 'eviction walks restarted'),
CacheStat('cache_eviction_walk_saved_pos', 'eviction walks started from saved location in tree'),
CacheStat('cache_eviction_walks_abandoned', 'eviction walks abandoned'),
@@ -897,6 +902,9 @@ conn_dsrc_stats = [
CursorStat('cursor_prev_skip_total', 'Total number of entries skipped by cursor prev calls'),
CursorStat('cursor_search_near_prefix_fast_paths', 'Total number of times a search near has exited due to prefix config'),
CursorStat('cursor_skip_hs_cur_position', 'Total number of entries skipped to position the history store cursor'),
+ CursorStat('cursor_tree_walk_del_page_skip', 'Total number of deleted pages skipped during tree walk'),
+ CursorStat('cursor_tree_walk_inmem_del_page_skip', 'Total number of in-memory deleted pages skipped during tree walk'),
+
##########################################
# Checkpoint cleanup statistics
##########################################
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data
index 6d352e3b88f..b0aa7d17ed1 100644
--- a/src/third_party/wiredtiger/import.data
+++ b/src/third_party/wiredtiger/import.data
@@ -2,5 +2,5 @@
"vendor": "wiredtiger",
"github": "wiredtiger/wiredtiger.git",
"branch": "mongodb-6.0",
- "commit": "93800466f950e2b73be872df1ece864dba90caba"
+ "commit": "00bbcf7b544c4b51e9495088e32aaf9bd54db640"
}
diff --git a/src/third_party/wiredtiger/src/block/block_compact.c b/src/third_party/wiredtiger/src/block/block_compact.c
index 58deed3cb89..ac358e1a349 100644
--- a/src/third_party/wiredtiger/src/block/block_compact.c
+++ b/src/third_party/wiredtiger/src/block/block_compact.c
@@ -72,24 +72,25 @@ __wt_block_compact_get_progress_stats(WT_SESSION_IMPL *session, WT_BM *bm,
* Output compact progress message.
*/
void
-__wt_block_compact_progress(WT_SESSION_IMPL *session, WT_BLOCK *block, u_int *msg_countp)
+__wt_block_compact_progress(WT_SESSION_IMPL *session, WT_BLOCK *block)
{
struct timespec cur_time;
- uint64_t time_diff;
+ uint64_t time_diff_msg, time_diff_start;
if (!WT_VERBOSE_LEVEL_ISSET(session, WT_VERB_COMPACT_PROGRESS, WT_VERBOSE_DEBUG))
return;
__wt_epoch(session, &cur_time);
- /* Log one progress message every twenty seconds. */
- time_diff = WT_TIMEDIFF_SEC(cur_time, session->compact->begin);
- if (time_diff / WT_PROGRESS_MSG_PERIOD > *msg_countp) {
- ++*msg_countp;
+ /* Log one progress message periodically. */
+ time_diff_msg = WT_TIMEDIFF_SEC(cur_time, session->compact->last_progress);
+ time_diff_start = WT_TIMEDIFF_SEC(cur_time, session->compact->begin);
+ if (time_diff_msg > WT_PROGRESS_MSG_PERIOD) {
+ session->compact->last_progress = cur_time;
__wt_verbose_debug(session, WT_VERB_COMPACT_PROGRESS,
- " compacting %s for %" PRIu64 " seconds; reviewed %" PRIu64 " pages, skipped %" PRIu64
- " pages, rewritten %" PRIu64 "pages",
- block->name, time_diff, block->compact_pages_reviewed, block->compact_pages_skipped,
+ " compacting %s for %" PRIu64 " seconds; reviewed %" PRIu64 " pages, rewritten %" PRIu64
+ " pages",
+ block->name, time_diff_start, block->compact_pages_reviewed,
block->compact_pages_rewritten);
}
}
diff --git a/src/third_party/wiredtiger/src/block_cache/block_cache.c b/src/third_party/wiredtiger/src/block_cache/block_cache.c
index 800c65a7ce9..64ed2d09ec4 100644
--- a/src/third_party/wiredtiger/src/block_cache/block_cache.c
+++ b/src/third_party/wiredtiger/src/block_cache/block_cache.c
@@ -588,7 +588,9 @@ __blkcache_init(WT_SESSION_IMPL *session, size_t cache_size, u_int hash_size, u_
__wt_verbose(session, WT_VERB_BLKCACHE,
"block cache initialized: type=%s, size=%" WT_SIZET_FMT " path=%s",
- (type == BLKCACHE_NVRAM) ? "nvram" : (type == BLKCACHE_DRAM) ? "dram" : "unconfigured",
+ (type == BLKCACHE_NVRAM) ? "nvram" :
+ (type == BLKCACHE_DRAM) ? "dram" :
+ "unconfigured",
cache_size, (blkcache->nvram_device_path == NULL) ? "--" : blkcache->nvram_device_path);
return (ret);
diff --git a/src/third_party/wiredtiger/src/block_cache/block_mgr.c b/src/third_party/wiredtiger/src/block_cache/block_mgr.c
index 3e7df914f4d..14fd74253f3 100644
--- a/src/third_party/wiredtiger/src/block_cache/block_mgr.c
+++ b/src/third_party/wiredtiger/src/block_cache/block_mgr.c
@@ -340,9 +340,9 @@ __bm_compact_page_skip_readonly(
* Output compact progress message.
*/
static void
-__bm_compact_progress(WT_BM *bm, WT_SESSION_IMPL *session, u_int *msg_countp)
+__bm_compact_progress(WT_BM *bm, WT_SESSION_IMPL *session)
{
- __wt_block_compact_progress(session, bm->block, msg_countp);
+ __wt_block_compact_progress(session, bm->block);
}
/*
diff --git a/src/third_party/wiredtiger/src/btree/bt_compact.c b/src/third_party/wiredtiger/src/btree/bt_compact.c
index 0b7072a168e..0318ceca19a 100644
--- a/src/third_party/wiredtiger/src/btree/bt_compact.c
+++ b/src/third_party/wiredtiger/src/btree/bt_compact.c
@@ -300,7 +300,7 @@ __wt_compact(WT_SESSION_IMPL *session)
WT_BM *bm;
WT_DECL_RET;
WT_REF *ref;
- u_int i, msg_count;
+ u_int i;
bool skip;
uint64_t stats_pages_rewritten; /* Pages rewritten */
@@ -338,7 +338,7 @@ __wt_compact(WT_SESSION_IMPL *session)
* we're making the problem worse.
*/
if (++i > 100) {
- bm->compact_progress(bm, session, &msg_count);
+ bm->compact_progress(bm, session);
WT_ERR(__wt_session_compact_check_timeout(session));
if (__wt_cache_stuck(session))
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c
index 72ead9445fd..9584f0af2e1 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curnext.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c
@@ -733,6 +733,7 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating)
WT_CURSOR *cursor;
WT_DECL_RET;
WT_PAGE *page;
+ WT_PAGE_WALK_SKIP_STATS walk_skip_stats;
WT_SESSION_IMPL *session;
size_t total_skipped, skipped;
uint32_t flags;
@@ -742,6 +743,8 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating)
prefix_key_out_of_bounds = false;
session = CUR2S(cbt);
total_skipped = 0;
+ walk_skip_stats.total_del_pages_skipped = 0;
+ walk_skip_stats.total_inmem_del_pages_skipped = 0;
WT_STAT_CONN_DATA_INCR(session, cursor_next);
@@ -851,15 +854,16 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating)
LF_SET(WT_READ_VISIBLE_ALL);
/*
- * If we are running with snapshot isolation, and not interested in returning tombstones, we
- * could potentially skip pages. The skip function looks at the aggregated timestamp
- * information to determine if something is visible on the page. If nothing is, the page is
- * skipped.
+ * If we are running with snapshot isolation, have a snapshot, and are not interested in
+ * returning tombstones, we could potentially skip pages. The skip function looks at the
+ * aggregated timestamp information to determine if something is visible on the page. If
+ * nothing is, the page is skipped.
*/
if (session->txn->isolation == WT_ISO_SNAPSHOT &&
+ F_ISSET(session->txn, WT_TXN_HAS_SNAPSHOT) &&
!F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE))
- WT_ERR(
- __wt_tree_walk_custom_skip(session, &cbt->ref, __wt_btcur_skip_page, NULL, flags));
+ WT_ERR(__wt_tree_walk_custom_skip(
+ session, &cbt->ref, __wt_btcur_skip_page, &walk_skip_stats, flags));
else
WT_ERR(__wt_tree_walk(session, &cbt->ref, flags));
WT_ERR_TEST(cbt->ref == NULL, WT_NOTFOUND, false);
@@ -872,6 +876,12 @@ err:
WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_ge_100);
WT_STAT_CONN_DATA_INCRV(session, cursor_next_skip_total, total_skipped);
+ if (walk_skip_stats.total_del_pages_skipped != 0)
+ WT_STAT_CONN_DATA_INCRV(
+ session, cursor_tree_walk_del_page_skip, walk_skip_stats.total_del_pages_skipped);
+ if (walk_skip_stats.total_inmem_del_pages_skipped != 0)
+ WT_STAT_CONN_DATA_INCRV(session, cursor_tree_walk_inmem_del_page_skip,
+ walk_skip_stats.total_inmem_del_pages_skipped);
switch (ret) {
case 0:
diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c
index 597adb20c48..cb0d59f8ba8 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curprev.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c
@@ -675,6 +675,7 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
WT_CURSOR *cursor;
WT_DECL_RET;
WT_PAGE *page;
+ WT_PAGE_WALK_SKIP_STATS walk_skip_stats;
WT_SESSION_IMPL *session;
size_t total_skipped, skipped;
uint32_t flags;
@@ -683,6 +684,8 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
cursor = &cbt->iface;
session = CUR2S(cbt);
total_skipped = 0;
+ walk_skip_stats.total_del_pages_skipped = 0;
+ walk_skip_stats.total_inmem_del_pages_skipped = 0;
WT_STAT_CONN_DATA_INCR(session, cursor_prev);
@@ -792,16 +795,17 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
LF_SET(WT_READ_VISIBLE_ALL);
/*
- * If we are running with snapshot isolation, and not interested in returning tombstones, we
- * could potentially skip pages. The skip function looks at the aggregated timestamp
- * information to determine if something is visible on the page. If nothing is, the page is
- * skipped.
+ * If we are running with snapshot isolation, have a snapshot, and are not interested in
+ * returning tombstones, we could potentially skip pages. The skip function looks at the
+ * aggregated timestamp information to determine if something is visible on the page. If
+ * nothing is, the page is skipped.
*/
if (!F_ISSET(&cbt->iface, WT_CURSTD_KEY_ONLY) &&
session->txn->isolation == WT_ISO_SNAPSHOT &&
+ F_ISSET(session->txn, WT_TXN_HAS_SNAPSHOT) &&
!F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE))
- WT_ERR(
- __wt_tree_walk_custom_skip(session, &cbt->ref, __wt_btcur_skip_page, NULL, flags));
+ WT_ERR(__wt_tree_walk_custom_skip(
+ session, &cbt->ref, __wt_btcur_skip_page, &walk_skip_stats, flags));
else
WT_ERR(__wt_tree_walk(session, &cbt->ref, flags));
WT_ERR_TEST(cbt->ref == NULL, WT_NOTFOUND, false);
@@ -814,6 +818,12 @@ err:
WT_STAT_CONN_DATA_INCR(session, cursor_prev_skip_ge_100);
WT_STAT_CONN_DATA_INCRV(session, cursor_prev_skip_total, total_skipped);
+ if (walk_skip_stats.total_del_pages_skipped != 0)
+ WT_STAT_CONN_DATA_INCRV(
+ session, cursor_tree_walk_del_page_skip, walk_skip_stats.total_del_pages_skipped);
+ if (walk_skip_stats.total_inmem_del_pages_skipped != 0)
+ WT_STAT_CONN_DATA_INCRV(session, cursor_tree_walk_inmem_del_page_skip,
+ walk_skip_stats.total_inmem_del_pages_skipped);
switch (ret) {
case 0:
diff --git a/src/third_party/wiredtiger/src/btree/bt_discard.c b/src/third_party/wiredtiger/src/btree/bt_discard.c
index ee3d22c0c8c..e31cd7d29ea 100644
--- a/src/third_party/wiredtiger/src/btree/bt_discard.c
+++ b/src/third_party/wiredtiger/src/btree/bt_discard.c
@@ -230,6 +230,7 @@ __free_page_modify(WT_SESSION_IMPL *session, WT_PAGE *page)
__wt_ovfl_discard_free(session, page);
__wt_free(session, page->modify->ovfl_track);
+ __wt_free(session, page->modify->stop_ta);
__wt_spin_destroy(session, &page->modify->page_lock);
__wt_free(session, page->modify);
diff --git a/src/third_party/wiredtiger/src/btree/bt_page.c b/src/third_party/wiredtiger/src/btree/bt_page.c
index f559c00adfb..e30326efff1 100644
--- a/src/third_party/wiredtiger/src/btree/bt_page.c
+++ b/src/third_party/wiredtiger/src/btree/bt_page.c
@@ -316,6 +316,11 @@ __wt_page_inmem_prepare(WT_SESSION_IMPL *session, WT_REF *ref)
}
}
+ /*
+ * The data is written to the disk so we can mark the page clean after re-instantiating prepared
+ * updates to avoid reconciling the page every time.
+ */
+ __wt_page_modify_clear(session, page);
__wt_cache_page_inmem_incr(session, page, total_size);
if (0) {
diff --git a/src/third_party/wiredtiger/src/btree/bt_random.c b/src/third_party/wiredtiger/src/btree/bt_random.c
index 25cf73fc0b9..7f5db6acffb 100644
--- a/src/third_party/wiredtiger/src/btree/bt_random.c
+++ b/src/third_party/wiredtiger/src/btree/bt_random.c
@@ -106,14 +106,11 @@ static int
__random_leaf_skip(WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head, uint32_t entries, bool *validp)
{
WT_INSERT *ins, *saved_ins;
- WT_SESSION_IMPL *session;
uint32_t i;
int retry;
*validp = false;
- session = CUR2S(cbt);
-
/* This is a relatively expensive test, try a few times then quit. */
for (retry = 0; retry < WT_RANDOM_SKIP_RETRY; ++retry) {
/*
@@ -121,7 +118,7 @@ __random_leaf_skip(WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head, uint32_t entr
* records before our target so we can look around in case our chosen record isn't valid.
*/
saved_ins = NULL;
- i = __wt_random(&session->rnd) % entries;
+ i = __wt_random(&cbt->rnd) % entries;
for (ins = WT_SKIP_FIRST(ins_head); ins != NULL; ins = WT_SKIP_NEXT(ins)) {
if (--i == 0)
break;
@@ -165,13 +162,11 @@ __random_leaf_insert(WT_CURSOR_BTREE *cbt, bool *validp)
{
WT_INSERT_HEAD *ins_head;
WT_PAGE *page;
- WT_SESSION_IMPL *session;
uint32_t entries, slot, start;
*validp = false;
page = cbt->ref->page;
- session = CUR2S(cbt);
/* Check for a large insert list with no items, that's common when tables are newly created. */
ins_head = WT_ROW_INSERT_SMALLEST(page);
@@ -188,7 +183,7 @@ __random_leaf_insert(WT_CURSOR_BTREE *cbt, bool *validp)
* decrease the required number of records required to select from the list.
*/
if (page->entries > 0) {
- start = __wt_random(&session->rnd) % page->entries;
+ start = __wt_random(&cbt->rnd) % page->entries;
for (slot = start; slot < page->entries; ++slot) {
ins_head = WT_ROW_INSERT(page, &page->pg_row[slot]);
entries = __random_skip_entries(cbt, ins_head);
@@ -243,7 +238,7 @@ __random_leaf_disk(WT_CURSOR_BTREE *cbt, bool *validp)
/* This is a relatively cheap test, so try several times. */
for (retry = 0; retry < WT_RANDOM_DISK_RETRY; ++retry) {
- slot = __wt_random(&session->rnd) % entries;
+ slot = __wt_random(&cbt->rnd) % entries;
WT_RET(__wt_row_leaf_key(session, page, page->pg_row + slot, cbt->tmp, false));
WT_RET(__random_slot_valid(cbt, slot, validp));
if (*validp)
@@ -315,7 +310,7 @@ __random_leaf(WT_CURSOR_BTREE *cbt)
__cursor_pos_clear(cbt);
cbt->slot = 0;
next = true; /* Forward from the beginning of the page. */
- for (i = __wt_random(&session->rnd) % WT_RANDOM_CURSOR_MOVE;;) {
+ for (i = __wt_random(&cbt->rnd) % WT_RANDOM_CURSOR_MOVE;;) {
ret = next ? __wt_btcur_next(cbt, false) : __wt_btcur_prev(cbt, false);
if (ret == WT_NOTFOUND) {
next = !next; /* Reverse direction. */
@@ -339,7 +334,7 @@ __random_leaf(WT_CURSOR_BTREE *cbt)
if (WT_DATA_IN_ITEM(cbt->tmp) && cursor->key.size == cbt->tmp->size &&
memcmp(cursor->key.data, cbt->tmp->data, cbt->tmp->size) == 0) {
cbt->tmp->size = 0;
- i = __wt_random(&session->rnd) % WT_RANDOM_CURSOR_MOVE;
+ i = __wt_random(&cbt->rnd) % WT_RANDOM_CURSOR_MOVE;
} else {
WT_RET(__wt_buf_set(session, cbt->tmp, cursor->key.data, cursor->key.size));
break;
@@ -351,25 +346,58 @@ __random_leaf(WT_CURSOR_BTREE *cbt)
}
/*
+ * __random_root_inmem_ref --
+ * Return a random in-mem ref from a root page by applying reservoir sampling.
+ */
+static void
+__random_root_inmem_ref(
+ WT_SESSION_IMPL *session, WT_REF *current, WT_REF **refp, WT_RAND_STATE *rnd)
+{
+ WT_REF *ref, *ref_inmem;
+ uint64_t cnt;
+
+ cnt = 0;
+ ref_inmem = NULL;
+
+ WT_ASSERT(session, __wt_ref_is_root(current));
+
+ WT_STAT_CONN_INCR(session, cache_eviction_random_sample_inmem_root);
+ WT_STAT_DATA_INCR(session, cache_eviction_random_sample_inmem_root);
+
+ WT_INTL_FOREACH_BEGIN (session, current->page, ref)
+ if (ref->state == WT_REF_MEM) {
+ cnt++;
+ if ((__wt_random(rnd) % cnt) == 0)
+ ref_inmem = ref;
+ }
+ WT_INTL_FOREACH_END;
+
+ if (cnt != 0)
+ *refp = ref_inmem;
+}
+
+/*
* __wt_random_descent --
* Find a random page in a tree for either sampling or eviction.
*/
int
-__wt_random_descent(WT_SESSION_IMPL *session, WT_REF **refp, uint32_t flags)
+__wt_random_descent(WT_SESSION_IMPL *session, WT_REF **refp, uint32_t flags, WT_RAND_STATE *rnd)
{
WT_BTREE *btree;
WT_DECL_RET;
WT_PAGE *page;
WT_PAGE_INDEX *pindex;
WT_REF *current, *descent;
- uint32_t i, entries, retry;
- bool eviction;
+ uint32_t i, entries;
+ int retry;
+ bool eviction, sample_inmem_page;
*refp = NULL;
btree = S2BT(session);
current = NULL;
retry = 100;
+ sample_inmem_page = false;
/*
* This function is called by eviction to find a random page in the cache. That case is
* indicated by the WT_READ_CACHE flag. Ordinary lookups in a tree will read pages into cache as
@@ -397,7 +425,9 @@ restart:
/* Eviction just wants any random child. */
if (eviction) {
- descent = pindex->index[__wt_random(&session->rnd) % entries];
+ descent = pindex->index[__wt_random(rnd) % entries];
+ if (sample_inmem_page && __wt_ref_is_root(current))
+ __random_root_inmem_ref(session, current, &descent, rnd);
goto descend;
}
@@ -412,7 +442,7 @@ restart:
*/
descent = NULL;
for (i = 0; i < entries; ++i) {
- descent = pindex->index[__wt_random(&session->rnd) % entries];
+ descent = pindex->index[__wt_random(rnd) % entries];
if (descent->state == WT_REF_DISK || descent->state == WT_REF_MEM)
break;
}
@@ -449,10 +479,17 @@ descend:
}
/*
- * There is no point starting with the root page: the walk will exit immediately. In that case
- * we aren't holding a hazard pointer so there is nothing to release.
+ * There is no point starting with the root page: continue attempting the process until we
+ * encounter a non-root page.
*/
- if (!eviction || !__wt_ref_is_root(current))
+ if (eviction && __wt_ref_is_root(current)) {
+ if (--retry > 0)
+ goto restart;
+ else if (S2C(session)->evict_sample_inmem && !sample_inmem_page) {
+ sample_inmem_page = true;
+ goto restart;
+ }
+ } else
*refp = current;
return (0);
}
@@ -507,7 +544,8 @@ __wt_btcur_next_random(WT_CURSOR_BTREE *cbt)
*/
if (cbt->ref == NULL || cbt->next_random_sample_size == 0) {
WT_ERR(__wt_cursor_func_init(cbt, true));
- WT_WITH_PAGE_INDEX(session, ret = __wt_random_descent(session, &cbt->ref, read_flags));
+ WT_WITH_PAGE_INDEX(
+ session, ret = __wt_random_descent(session, &cbt->ref, read_flags, &cbt->rnd));
if (ret == 0) {
WT_ERR(__random_leaf(cbt));
return (0);
diff --git a/src/third_party/wiredtiger/src/btree/bt_sync.c b/src/third_party/wiredtiger/src/btree/bt_sync.c
index f8d8c21bc7f..3dce03d6901 100644
--- a/src/third_party/wiredtiger/src/btree/bt_sync.c
+++ b/src/third_party/wiredtiger/src/btree/bt_sync.c
@@ -44,7 +44,7 @@ __sync_checkpoint_can_skip(WT_SESSION_IMPL *session, WT_REF *ref)
return (false);
if (!F_ISSET(txn, WT_TXN_HAS_SNAPSHOT))
return (false);
- if (!WT_TXNID_LT(txn->snap_max, mod->first_dirty_txn))
+ if (!WT_TXNID_LT(txn->snapshot_data.snap_max, mod->first_dirty_txn))
return (false);
/*
@@ -115,12 +115,12 @@ __sync_dup_walk(WT_SESSION_IMPL *session, WT_REF *walk, uint32_t flags, WT_REF *
}
/*
- * __sync_ref_obsolete_check --
+ * __sync_delete_obsolete_ref --
* Check whether the ref is obsolete according to the newest stop time point and handle the
- * obsolete page.
+ * obsolete page by either remove it or mark it for urgent eviction.
*/
static int
-__sync_ref_obsolete_check(WT_SESSION_IMPL *session, WT_REF *ref)
+__sync_delete_obsolete_ref(WT_SESSION_IMPL *session, WT_REF *ref)
{
WT_ADDR_COPY addr;
WT_DECL_RET;
@@ -190,10 +190,9 @@ __sync_ref_obsolete_check(WT_SESSION_IMPL *session, WT_REF *ref)
}
if (obsolete) {
+ WT_RET(__wt_page_parent_modify_set(session, ref, true));
WT_REF_UNLOCK(ref, WT_REF_DELETED);
WT_STAT_CONN_DATA_INCR(session, cc_pages_removed);
-
- WT_RET(__wt_page_parent_modify_set(session, ref, true));
} else
WT_REF_UNLOCK(ref, previous_state);
@@ -228,9 +227,16 @@ __sync_ref_obsolete_check(WT_SESSION_IMPL *session, WT_REF *ref)
if (busy)
return (0);
+ /*
+ * Skip the modified pages as their reconciliation results are not valid any more. Check for the
+ * page modification only after acquiring the hazard pointer to protect against the page being
+ * freed in parallel.
+ */
WT_ASSERT(session, ref->page != NULL);
- mod = ref->page->modify;
+ if (__wt_page_is_modified(ref->page))
+ goto err;
+ mod = ref->page->modify;
if (mod != NULL && mod->rec_result == WT_PM_REC_EMPTY) {
tag = "reconciled empty";
@@ -283,11 +289,8 @@ __sync_ref_obsolete_check(WT_SESSION_IMPL *session, WT_REF *ref)
__wt_page_modify_set(session, ref->page);
}
- /*
- * Set the obsolete page read generation number to a lower value indicating as it is no
- * longer needed for any read operations to let the eviction to evict it sooner.
- */
- ref->page->read_gen = WT_READGEN_WONT_NEED;
+ /* Mark the obsolete page to evict soon. */
+ __wt_page_evict_soon(session, ref);
WT_STAT_CONN_DATA_INCR(session, cc_pages_evict);
}
@@ -323,7 +326,7 @@ __sync_ref_int_obsolete_cleanup(WT_SESSION_IMPL *session, WT_REF *parent)
for (slot = 0; slot < pindex->entries; slot++) {
ref = pindex->index[slot];
- WT_RET(__sync_ref_obsolete_check(session, ref));
+ WT_RET(__sync_delete_obsolete_ref(session, ref));
}
WT_STAT_CONN_DATA_INCRV(session, cc_pages_visited, pindex->entries);
@@ -523,9 +526,6 @@ __wt_sync_file(WT_SESSION_IMPL *session, WT_CACHE_OP syncop)
/* Write all dirty in-cache pages. */
LF_SET(WT_READ_NO_EVICT);
- /* Read pages with history store entries and evict them asap. */
- LF_SET(WT_READ_WONT_NEED);
-
/*
* Perform checkpoint cleanup when not in startup or shutdown phase by traversing internal
* pages looking for obsolete child pages. This is row-store specific, column-store pages
@@ -605,9 +605,8 @@ __wt_sync_file(WT_SESSION_IMPL *session, WT_CACHE_OP syncop)
*
* Regardless of whether eviction succeeds or fails, the walk continues from the
* previous location. We remember whether we tried eviction, and don't try again. Even
- * if eviction fails (the page may stay in cache clean but with history that cannot be
- * discarded), that is not wasted effort because checkpoint doesn't need to write the
- * page again.
+ * if eviction fails (the page may stay in cache clean), that is not a wasted effort
+ * because checkpoint doesn't need to write the page again.
*
* Once the transaction has given up it's snapshot it is no longer safe to reconcile
* pages. That happens prior to the final metadata checkpoint.
@@ -625,6 +624,8 @@ __wt_sync_file(WT_SESSION_IMPL *session, WT_CACHE_OP syncop)
}
tried_eviction = false;
+ WT_STAT_INCR(session, btree->dhandle->stats, btree_checkpoint_pages_reconciled);
+
WT_ERR(__wt_reconcile(session, walk, NULL, rec_flags));
/*
diff --git a/src/third_party/wiredtiger/src/btree/row_srch.c b/src/third_party/wiredtiger/src/btree/row_srch.c
index ca1f8d4c973..38d6091b248 100644
--- a/src/third_party/wiredtiger/src/btree/row_srch.c
+++ b/src/third_party/wiredtiger/src/btree/row_srch.c
@@ -53,9 +53,9 @@ __search_insert_append(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_INSERT
* serialized insert function.
*/
for (i = WT_SKIP_MAXDEPTH - 1; i >= 0; i--) {
- cbt->ins_stack[i] = (i == 0) ?
- &ins->next[0] :
- (ins_head->tail[i] != NULL) ? &ins_head->tail[i]->next[i] : &ins_head->head[i];
+ cbt->ins_stack[i] = (i == 0) ? &ins->next[0] :
+ (ins_head->tail[i] != NULL) ? &ins_head->tail[i]->next[i] :
+ &ins_head->head[i];
cbt->next_stack[i] = NULL;
}
cbt->compare = -cmp;
diff --git a/src/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.c b/src/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.c
index de13cd6878b..6f037f2b553 100644
--- a/src/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.c
+++ b/src/third_party/wiredtiger/src/checksum/arm64/crc32-arm64.c
@@ -39,16 +39,16 @@
#endif
#define CRC32CX(crc, value) \
- __asm__("crc32cx %w[c], %w[c], %x[v]" : [ c ] "+r"(*&crc) : [ v ] "r"(+value))
+ __asm__("crc32cx %w[c], %w[c], %x[v]" : [c] "+r"(*&crc) : [v] "r"(+value))
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-macros"
#define CRC32CW(crc, value) \
- __asm__("crc32cw %w[c], %w[c], %w[v]" : [ c ] "+r"(*&crc) : [ v ] "r"(+value))
+ __asm__("crc32cw %w[c], %w[c], %w[v]" : [c] "+r"(*&crc) : [v] "r"(+value))
#define CRC32CH(crc, value) \
- __asm__("crc32ch %w[c], %w[c], %w[v]" : [ c ] "+r"(*&crc) : [ v ] "r"(+value))
+ __asm__("crc32ch %w[c], %w[c], %w[v]" : [c] "+r"(*&crc) : [v] "r"(+value))
#pragma GCC diagnostic pop
#define CRC32CB(crc, value) \
- __asm__("crc32cb %w[c], %w[c], %w[v]" : [ c ] "+r"(*&crc) : [ v ] "r"(+value))
+ __asm__("crc32cb %w[c], %w[c], %w[v]" : [c] "+r"(*&crc) : [v] "r"(+value))
/*
* __wt_checksum_hw --
diff --git a/src/third_party/wiredtiger/src/config/config_def.c b/src/third_party/wiredtiger/src/config/config_def.c
index 1d46e8b01b6..11f4c84e6a7 100644
--- a/src/third_party/wiredtiger/src/config/config_def.c
+++ b/src/third_party/wiredtiger/src/config/config_def.c
@@ -72,6 +72,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_debug_mode_subconfigs[] = {
{"update_restore_evict", "boolean", NULL, NULL, NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0}};
static const WT_CONFIG_CHECK confchk_wiredtiger_open_eviction_subconfigs[] = {
+ {"evict_sample_inmem", "boolean", NULL, NULL, NULL, 0},
{"threads_max", "int", NULL, "min=1,max=20", NULL, 0},
{"threads_min", "int", NULL, "min=1,max=20", NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0}};
@@ -129,7 +130,7 @@ static const WT_CONFIG_CHECK confchk_WT_CONNECTION_reconfigure[] = {
confchk_WT_CONNECTION_reconfigure_compatibility_subconfigs, 1},
{"debug_mode", "category", NULL, NULL, confchk_wiredtiger_open_debug_mode_subconfigs, 11},
{"error_prefix", "string", NULL, NULL, NULL, 0},
- {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 2},
+ {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 3},
{"eviction_checkpoint_target", "int", NULL, "min=0,max=10TB", NULL, 0},
{"eviction_dirty_target", "int", NULL, "min=1,max=10TB", NULL, 0},
{"eviction_dirty_trigger", "int", NULL, "min=1,max=10TB", NULL, 0},
@@ -396,6 +397,7 @@ static const WT_CONFIG_CHECK confchk_WT_SESSION_open_cursor[] = {
{"incremental", "category", NULL, NULL, confchk_WT_SESSION_open_cursor_incremental_subconfigs, 7},
{"next_random", "boolean", NULL, NULL, NULL, 0},
{"next_random_sample_size", "string", NULL, NULL, NULL, 0},
+ {"next_random_seed", "string", NULL, NULL, NULL, 0},
{"overwrite", "boolean", NULL, NULL, NULL, 0}, {"prefix_search", "boolean", NULL, NULL, NULL, 0},
{"raw", "boolean", NULL, NULL, NULL, 0}, {"read_once", "boolean", NULL, NULL, NULL, 0},
{"readonly", "boolean", NULL, NULL, NULL, 0}, {"skip_sort_check", "boolean", NULL, NULL, NULL, 0},
@@ -863,7 +865,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open[] = {
{"direct_io", "list", NULL, "choices=[\"checkpoint\",\"data\",\"log\"]", NULL, 0},
{"encryption", "category", NULL, NULL, confchk_wiredtiger_open_encryption_subconfigs, 3},
{"error_prefix", "string", NULL, NULL, NULL, 0},
- {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 2},
+ {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 3},
{"eviction_checkpoint_target", "int", NULL, "min=0,max=10TB", NULL, 0},
{"eviction_dirty_target", "int", NULL, "min=1,max=10TB", NULL, 0},
{"eviction_dirty_trigger", "int", NULL, "min=1,max=10TB", NULL, 0},
@@ -949,7 +951,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_all[] = {
{"direct_io", "list", NULL, "choices=[\"checkpoint\",\"data\",\"log\"]", NULL, 0},
{"encryption", "category", NULL, NULL, confchk_wiredtiger_open_encryption_subconfigs, 3},
{"error_prefix", "string", NULL, NULL, NULL, 0},
- {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 2},
+ {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 3},
{"eviction_checkpoint_target", "int", NULL, "min=0,max=10TB", NULL, 0},
{"eviction_dirty_target", "int", NULL, "min=1,max=10TB", NULL, 0},
{"eviction_dirty_trigger", "int", NULL, "min=1,max=10TB", NULL, 0},
@@ -1034,7 +1036,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_basecfg[] = {
{"direct_io", "list", NULL, "choices=[\"checkpoint\",\"data\",\"log\"]", NULL, 0},
{"encryption", "category", NULL, NULL, confchk_wiredtiger_open_encryption_subconfigs, 3},
{"error_prefix", "string", NULL, NULL, NULL, 0},
- {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 2},
+ {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 3},
{"eviction_checkpoint_target", "int", NULL, "min=0,max=10TB", NULL, 0},
{"eviction_dirty_target", "int", NULL, "min=1,max=10TB", NULL, 0},
{"eviction_dirty_trigger", "int", NULL, "min=1,max=10TB", NULL, 0},
@@ -1116,7 +1118,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_usercfg[] = {
{"direct_io", "list", NULL, "choices=[\"checkpoint\",\"data\",\"log\"]", NULL, 0},
{"encryption", "category", NULL, NULL, confchk_wiredtiger_open_encryption_subconfigs, 3},
{"error_prefix", "string", NULL, NULL, NULL, 0},
- {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 2},
+ {"eviction", "category", NULL, NULL, confchk_wiredtiger_open_eviction_subconfigs, 3},
{"eviction_checkpoint_target", "int", NULL, "min=0,max=10TB", NULL, 0},
{"eviction_dirty_target", "int", NULL, "min=1,max=10TB", NULL, 0},
{"eviction_dirty_trigger", "int", NULL, "min=1,max=10TB", NULL, 0},
@@ -1213,7 +1215,7 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"log_retention=0,realloc_exact=false,rollback_error=0,"
"slow_checkpoint=false,table_logging=false,"
"update_restore_evict=false),error_prefix=,"
- "eviction=(threads_max=8,threads_min=1),"
+ "eviction=(evict_sample_inmem=true,threads_max=8,threads_min=1),"
"eviction_checkpoint_target=1,eviction_dirty_target=5,"
"eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
",eviction_updates_target=0,eviction_updates_trigger=0,"
@@ -1303,10 +1305,10 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"debug=(dump_version=false,release_evict=false),dump=,"
"incremental=(consolidate=false,enabled=false,file=,"
"force_stop=false,granularity=16MB,src_id=,this_id=),"
- "next_random=false,next_random_sample_size=0,overwrite=true,"
- "prefix_search=false,raw=false,read_once=false,readonly=false,"
- "skip_sort_check=false,statistics=,target=",
- confchk_WT_SESSION_open_cursor, 17},
+ "next_random=false,next_random_sample_size=0,next_random_seed=0,"
+ "overwrite=true,prefix_search=false,raw=false,read_once=false,"
+ "readonly=false,skip_sort_check=false,statistics=,target=",
+ confchk_WT_SESSION_open_cursor, 18},
{"WT_SESSION.prepare_transaction", "prepare_timestamp=", confchk_WT_SESSION_prepare_transaction,
1},
{"WT_SESSION.query_timestamp", "get=read", confchk_WT_SESSION_query_timestamp, 1},
@@ -1492,26 +1494,26 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"flush_checkpoint=false,log_retention=0,realloc_exact=false,"
"rollback_error=0,slow_checkpoint=false,table_logging=false,"
"update_restore_evict=false),direct_io=,encryption=(keyid=,name=,"
- "secretkey=),error_prefix=,eviction=(threads_max=8,threads_min=1)"
- ",eviction_checkpoint_target=1,eviction_dirty_target=5,"
- "eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
- ",eviction_updates_target=0,eviction_updates_trigger=0,"
- "exclusive=false,extensions=,file_extend=,"
- "file_manager=(close_handle_minimum=250,close_idle_time=30,"
- "close_scan_interval=10),hash=(buckets=512,dhandle_buckets=512),"
- "hazard_max=1000,history_store=(file_max=0),in_memory=false,"
- "io_capacity=(total=0),json_output=[],log=(archive=true,"
- "compressor=,enabled=false,file_max=100MB,force_write_wait=0,"
- "os_cache_dirty_pct=0,path=\".\",prealloc=true,recover=on,"
- "remove=true,zero_fill=false),lsm_manager=(merge=true,"
- "worker_thread_max=4),mmap=true,mmap_all=false,multiprocess=false"
- ",operation_timeout_ms=0,operation_tracking=(enabled=false,"
- "path=\".\"),readonly=false,salvage=false,session_max=100,"
- "session_scratch_max=2MB,session_table_cache=true,"
- "shared_cache=(chunk=10MB,name=,quota=0,reserve=0,size=500MB),"
- "statistics=none,statistics_log=(json=false,on_close=false,"
- "path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\",wait=0),"
- "tiered_manager=(threads_max=8,threads_min=1,wait=0),"
+ "secretkey=),error_prefix=,eviction=(evict_sample_inmem=true,"
+ "threads_max=8,threads_min=1),eviction_checkpoint_target=1,"
+ "eviction_dirty_target=5,eviction_dirty_trigger=20,"
+ "eviction_target=80,eviction_trigger=95,eviction_updates_target=0"
+ ",eviction_updates_trigger=0,exclusive=false,extensions=,"
+ "file_extend=,file_manager=(close_handle_minimum=250,"
+ "close_idle_time=30,close_scan_interval=10),hash=(buckets=512,"
+ "dhandle_buckets=512),hazard_max=1000,history_store=(file_max=0),"
+ "in_memory=false,io_capacity=(total=0),json_output=[],"
+ "log=(archive=true,compressor=,enabled=false,file_max=100MB,"
+ "force_write_wait=0,os_cache_dirty_pct=0,path=\".\",prealloc=true"
+ ",recover=on,remove=true,zero_fill=false),lsm_manager=(merge=true"
+ ",worker_thread_max=4),mmap=true,mmap_all=false,"
+ "multiprocess=false,operation_timeout_ms=0,"
+ "operation_tracking=(enabled=false,path=\".\"),readonly=false,"
+ "salvage=false,session_max=100,session_scratch_max=2MB,"
+ "session_table_cache=true,shared_cache=(chunk=10MB,name=,quota=0,"
+ "reserve=0,size=500MB),statistics=none,statistics_log=(json=false"
+ ",on_close=false,path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\""
+ ",wait=0),tiered_manager=(threads_max=8,threads_min=1,wait=0),"
"tiered_storage=(auth_token=,bucket=,bucket_prefix=,"
"cache_directory=,local_retention=300,name=),"
"timing_stress_for_test=,transaction_sync=(enabled=false,"
@@ -1533,26 +1535,26 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"flush_checkpoint=false,log_retention=0,realloc_exact=false,"
"rollback_error=0,slow_checkpoint=false,table_logging=false,"
"update_restore_evict=false),direct_io=,encryption=(keyid=,name=,"
- "secretkey=),error_prefix=,eviction=(threads_max=8,threads_min=1)"
- ",eviction_checkpoint_target=1,eviction_dirty_target=5,"
- "eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
- ",eviction_updates_target=0,eviction_updates_trigger=0,"
- "exclusive=false,extensions=,file_extend=,"
- "file_manager=(close_handle_minimum=250,close_idle_time=30,"
- "close_scan_interval=10),hash=(buckets=512,dhandle_buckets=512),"
- "hazard_max=1000,history_store=(file_max=0),in_memory=false,"
- "io_capacity=(total=0),json_output=[],log=(archive=true,"
- "compressor=,enabled=false,file_max=100MB,force_write_wait=0,"
- "os_cache_dirty_pct=0,path=\".\",prealloc=true,recover=on,"
- "remove=true,zero_fill=false),lsm_manager=(merge=true,"
- "worker_thread_max=4),mmap=true,mmap_all=false,multiprocess=false"
- ",operation_timeout_ms=0,operation_tracking=(enabled=false,"
- "path=\".\"),readonly=false,salvage=false,session_max=100,"
- "session_scratch_max=2MB,session_table_cache=true,"
- "shared_cache=(chunk=10MB,name=,quota=0,reserve=0,size=500MB),"
- "statistics=none,statistics_log=(json=false,on_close=false,"
- "path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\",wait=0),"
- "tiered_manager=(threads_max=8,threads_min=1,wait=0),"
+ "secretkey=),error_prefix=,eviction=(evict_sample_inmem=true,"
+ "threads_max=8,threads_min=1),eviction_checkpoint_target=1,"
+ "eviction_dirty_target=5,eviction_dirty_trigger=20,"
+ "eviction_target=80,eviction_trigger=95,eviction_updates_target=0"
+ ",eviction_updates_trigger=0,exclusive=false,extensions=,"
+ "file_extend=,file_manager=(close_handle_minimum=250,"
+ "close_idle_time=30,close_scan_interval=10),hash=(buckets=512,"
+ "dhandle_buckets=512),hazard_max=1000,history_store=(file_max=0),"
+ "in_memory=false,io_capacity=(total=0),json_output=[],"
+ "log=(archive=true,compressor=,enabled=false,file_max=100MB,"
+ "force_write_wait=0,os_cache_dirty_pct=0,path=\".\",prealloc=true"
+ ",recover=on,remove=true,zero_fill=false),lsm_manager=(merge=true"
+ ",worker_thread_max=4),mmap=true,mmap_all=false,"
+ "multiprocess=false,operation_timeout_ms=0,"
+ "operation_tracking=(enabled=false,path=\".\"),readonly=false,"
+ "salvage=false,session_max=100,session_scratch_max=2MB,"
+ "session_table_cache=true,shared_cache=(chunk=10MB,name=,quota=0,"
+ "reserve=0,size=500MB),statistics=none,statistics_log=(json=false"
+ ",on_close=false,path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\""
+ ",wait=0),tiered_manager=(threads_max=8,threads_min=1,wait=0),"
"tiered_storage=(auth_token=,bucket=,bucket_prefix=,"
"cache_directory=,local_retention=300,name=),"
"timing_stress_for_test=,transaction_sync=(enabled=false,"
@@ -1575,25 +1577,25 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"log_retention=0,realloc_exact=false,rollback_error=0,"
"slow_checkpoint=false,table_logging=false,"
"update_restore_evict=false),direct_io=,encryption=(keyid=,name=,"
- "secretkey=),error_prefix=,eviction=(threads_max=8,threads_min=1)"
- ",eviction_checkpoint_target=1,eviction_dirty_target=5,"
- "eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
- ",eviction_updates_target=0,eviction_updates_trigger=0,"
- "extensions=,file_extend=,file_manager=(close_handle_minimum=250,"
- "close_idle_time=30,close_scan_interval=10),hash=(buckets=512,"
- "dhandle_buckets=512),hazard_max=1000,history_store=(file_max=0),"
- "io_capacity=(total=0),json_output=[],log=(archive=true,"
- "compressor=,enabled=false,file_max=100MB,force_write_wait=0,"
- "os_cache_dirty_pct=0,path=\".\",prealloc=true,recover=on,"
- "remove=true,zero_fill=false),lsm_manager=(merge=true,"
- "worker_thread_max=4),mmap=true,mmap_all=false,multiprocess=false"
- ",operation_timeout_ms=0,operation_tracking=(enabled=false,"
- "path=\".\"),readonly=false,salvage=false,session_max=100,"
- "session_scratch_max=2MB,session_table_cache=true,"
- "shared_cache=(chunk=10MB,name=,quota=0,reserve=0,size=500MB),"
- "statistics=none,statistics_log=(json=false,on_close=false,"
- "path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\",wait=0),"
- "tiered_manager=(threads_max=8,threads_min=1,wait=0),"
+ "secretkey=),error_prefix=,eviction=(evict_sample_inmem=true,"
+ "threads_max=8,threads_min=1),eviction_checkpoint_target=1,"
+ "eviction_dirty_target=5,eviction_dirty_trigger=20,"
+ "eviction_target=80,eviction_trigger=95,eviction_updates_target=0"
+ ",eviction_updates_trigger=0,extensions=,file_extend=,"
+ "file_manager=(close_handle_minimum=250,close_idle_time=30,"
+ "close_scan_interval=10),hash=(buckets=512,dhandle_buckets=512),"
+ "hazard_max=1000,history_store=(file_max=0),io_capacity=(total=0)"
+ ",json_output=[],log=(archive=true,compressor=,enabled=false,"
+ "file_max=100MB,force_write_wait=0,os_cache_dirty_pct=0,"
+ "path=\".\",prealloc=true,recover=on,remove=true,zero_fill=false)"
+ ",lsm_manager=(merge=true,worker_thread_max=4),mmap=true,"
+ "mmap_all=false,multiprocess=false,operation_timeout_ms=0,"
+ "operation_tracking=(enabled=false,path=\".\"),readonly=false,"
+ "salvage=false,session_max=100,session_scratch_max=2MB,"
+ "session_table_cache=true,shared_cache=(chunk=10MB,name=,quota=0,"
+ "reserve=0,size=500MB),statistics=none,statistics_log=(json=false"
+ ",on_close=false,path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\""
+ ",wait=0),tiered_manager=(threads_max=8,threads_min=1,wait=0),"
"tiered_storage=(auth_token=,bucket=,bucket_prefix=,"
"cache_directory=,local_retention=300,name=),"
"timing_stress_for_test=,transaction_sync=(enabled=false,"
@@ -1615,25 +1617,25 @@ static const WT_CONFIG_ENTRY config_entries[] = {{"WT_CONNECTION.add_collator",
"log_retention=0,realloc_exact=false,rollback_error=0,"
"slow_checkpoint=false,table_logging=false,"
"update_restore_evict=false),direct_io=,encryption=(keyid=,name=,"
- "secretkey=),error_prefix=,eviction=(threads_max=8,threads_min=1)"
- ",eviction_checkpoint_target=1,eviction_dirty_target=5,"
- "eviction_dirty_trigger=20,eviction_target=80,eviction_trigger=95"
- ",eviction_updates_target=0,eviction_updates_trigger=0,"
- "extensions=,file_extend=,file_manager=(close_handle_minimum=250,"
- "close_idle_time=30,close_scan_interval=10),hash=(buckets=512,"
- "dhandle_buckets=512),hazard_max=1000,history_store=(file_max=0),"
- "io_capacity=(total=0),json_output=[],log=(archive=true,"
- "compressor=,enabled=false,file_max=100MB,force_write_wait=0,"
- "os_cache_dirty_pct=0,path=\".\",prealloc=true,recover=on,"
- "remove=true,zero_fill=false),lsm_manager=(merge=true,"
- "worker_thread_max=4),mmap=true,mmap_all=false,multiprocess=false"
- ",operation_timeout_ms=0,operation_tracking=(enabled=false,"
- "path=\".\"),readonly=false,salvage=false,session_max=100,"
- "session_scratch_max=2MB,session_table_cache=true,"
- "shared_cache=(chunk=10MB,name=,quota=0,reserve=0,size=500MB),"
- "statistics=none,statistics_log=(json=false,on_close=false,"
- "path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\",wait=0),"
- "tiered_manager=(threads_max=8,threads_min=1,wait=0),"
+ "secretkey=),error_prefix=,eviction=(evict_sample_inmem=true,"
+ "threads_max=8,threads_min=1),eviction_checkpoint_target=1,"
+ "eviction_dirty_target=5,eviction_dirty_trigger=20,"
+ "eviction_target=80,eviction_trigger=95,eviction_updates_target=0"
+ ",eviction_updates_trigger=0,extensions=,file_extend=,"
+ "file_manager=(close_handle_minimum=250,close_idle_time=30,"
+ "close_scan_interval=10),hash=(buckets=512,dhandle_buckets=512),"
+ "hazard_max=1000,history_store=(file_max=0),io_capacity=(total=0)"
+ ",json_output=[],log=(archive=true,compressor=,enabled=false,"
+ "file_max=100MB,force_write_wait=0,os_cache_dirty_pct=0,"
+ "path=\".\",prealloc=true,recover=on,remove=true,zero_fill=false)"
+ ",lsm_manager=(merge=true,worker_thread_max=4),mmap=true,"
+ "mmap_all=false,multiprocess=false,operation_timeout_ms=0,"
+ "operation_tracking=(enabled=false,path=\".\"),readonly=false,"
+ "salvage=false,session_max=100,session_scratch_max=2MB,"
+ "session_table_cache=true,shared_cache=(chunk=10MB,name=,quota=0,"
+ "reserve=0,size=500MB),statistics=none,statistics_log=(json=false"
+ ",on_close=false,path=\".\",sources=,timestamp=\"%b %d %H:%M:%S\""
+ ",wait=0),tiered_manager=(threads_max=8,threads_min=1,wait=0),"
"tiered_storage=(auth_token=,bucket=,bucket_prefix=,"
"cache_directory=,local_retention=300,name=),"
"timing_stress_for_test=,transaction_sync=(enabled=false,"
diff --git a/src/third_party/wiredtiger/src/conn/conn_cache.c b/src/third_party/wiredtiger/src/conn/conn_cache.c
index 8d008dcd0fc..90234099c62 100644
--- a/src/third_party/wiredtiger/src/conn/conn_cache.c
+++ b/src/third_party/wiredtiger/src/conn/conn_cache.c
@@ -151,6 +151,9 @@ __cache_config_local(WT_SESSION_IMPL *session, bool shared, const char *cfg[])
conn->evict_threads_max = evict_threads_max;
conn->evict_threads_min = evict_threads_min;
+ WT_RET(__wt_config_gets(session, cfg, "eviction.evict_sample_inmem", &cval));
+ conn->evict_sample_inmem = cval.val != 0;
+
/* Retrieve the wait time and convert from milliseconds */
WT_RET(__wt_config_gets(session, cfg, "cache_max_wait_ms", &cval));
cache->cache_max_wait_us = (uint64_t)(cval.val * WT_THOUSAND);
diff --git a/src/third_party/wiredtiger/src/cursor/cur_file.c b/src/third_party/wiredtiger/src/cursor/cur_file.c
index 9e2213d164d..60b7277509a 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_file.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_file.c
@@ -733,6 +733,12 @@ __curfile_create(WT_SESSION_IMPL *session, WT_CURSOR *owner, const char *cfg[],
*/
WT_ERR(__wt_config_gets_def(session, cfg, "next_random", 0, &cval));
if (cval.val != 0) {
+ WT_ERR(__wt_config_gets_def(session, cfg, "next_random_seed", 0, &cval));
+ if (cval.val != 0)
+ __wt_random_init_custom_seed(&cbt->rnd, (uint64_t)cval.val);
+ else
+ __wt_random_init_seed(session, &cbt->rnd);
+
if (WT_CURSOR_RECNO(cursor))
WT_ERR_MSG(
session, ENOTSUP, "next_random configuration not supported for column-store objects");
diff --git a/src/third_party/wiredtiger/src/docs/build-posix.dox b/src/third_party/wiredtiger/src/docs/build-posix.dox
index 75f9969e7b9..b201257ab79 100644
--- a/src/third_party/wiredtiger/src/docs/build-posix.dox
+++ b/src/third_party/wiredtiger/src/docs/build-posix.dox
@@ -17,7 +17,7 @@ We also suggest <a href="https://ninja-build.org/">Ninja</a> and
First, clone the repository:
@code
-git clone git://github.com/wiredtiger/wiredtiger.git
+git clone https://github.com/wiredtiger/wiredtiger.git
@endcode
Now proceed with @ref posix_building.
diff --git a/src/third_party/wiredtiger/src/docs/build-windows.dox b/src/third_party/wiredtiger/src/docs/build-windows.dox
index 918eed85ff0..a44a4db4bc2 100644
--- a/src/third_party/wiredtiger/src/docs/build-windows.dox
+++ b/src/third_party/wiredtiger/src/docs/build-windows.dox
@@ -8,7 +8,7 @@ and proceed with @ref windows_building
First, clone the repository:
@code
-git clone git://github.com/wiredtiger/wiredtiger.git
+git clone https://github.com/wiredtiger/wiredtiger.git
@endcode
Now proceed with @ref windows_building
diff --git a/src/third_party/wiredtiger/src/evict/evict_lru.c b/src/third_party/wiredtiger/src/evict/evict_lru.c
index d883eb2ad9d..18459d5bc9f 100644
--- a/src/third_party/wiredtiger/src/evict/evict_lru.c
+++ b/src/third_party/wiredtiger/src/evict/evict_lru.c
@@ -1673,10 +1673,12 @@ static uint32_t
__evict_walk_target(WT_SESSION_IMPL *session)
{
WT_CACHE *cache;
- uint64_t btree_inuse, bytes_per_slot, cache_inuse;
+ uint64_t btree_clean_inuse, btree_dirty_inuse, btree_updates_inuse, bytes_per_slot, cache_inuse;
uint32_t target_pages, target_pages_clean, target_pages_dirty, target_pages_updates;
+ bool want_tree;
cache = S2C(session)->cache;
+ btree_clean_inuse = btree_dirty_inuse = btree_updates_inuse = 0;
target_pages_clean = target_pages_dirty = target_pages_updates = 0;
/*
@@ -1690,24 +1692,25 @@ __evict_walk_target(WT_SESSION_IMPL *session)
* 99+% of the cache (and only have to walk it once).
*/
if (F_ISSET(cache, WT_CACHE_EVICT_CLEAN)) {
- btree_inuse = __wt_btree_bytes_evictable(session);
+ btree_clean_inuse = __wt_btree_bytes_evictable(session);
cache_inuse = __wt_cache_bytes_inuse(cache);
bytes_per_slot = 1 + cache_inuse / cache->evict_slots;
- target_pages_clean = (uint32_t)((btree_inuse + bytes_per_slot / 2) / bytes_per_slot);
+ target_pages_clean = (uint32_t)((btree_clean_inuse + bytes_per_slot / 2) / bytes_per_slot);
}
if (F_ISSET(cache, WT_CACHE_EVICT_DIRTY)) {
- btree_inuse = __wt_btree_dirty_leaf_inuse(session);
+ btree_dirty_inuse = __wt_btree_dirty_leaf_inuse(session);
cache_inuse = __wt_cache_dirty_leaf_inuse(cache);
bytes_per_slot = 1 + cache_inuse / cache->evict_slots;
- target_pages_dirty = (uint32_t)((btree_inuse + bytes_per_slot / 2) / bytes_per_slot);
+ target_pages_dirty = (uint32_t)((btree_dirty_inuse + bytes_per_slot / 2) / bytes_per_slot);
}
if (F_ISSET(cache, WT_CACHE_EVICT_UPDATES)) {
- btree_inuse = __wt_btree_bytes_updates(session);
+ btree_updates_inuse = __wt_btree_bytes_updates(session);
cache_inuse = __wt_cache_bytes_updates(cache);
bytes_per_slot = 1 + cache_inuse / cache->evict_slots;
- target_pages_updates = (uint32_t)((btree_inuse + bytes_per_slot / 2) / bytes_per_slot);
+ target_pages_updates =
+ (uint32_t)((btree_updates_inuse + bytes_per_slot / 2) / bytes_per_slot);
}
target_pages = WT_MAX(target_pages_clean, target_pages_dirty);
@@ -1719,12 +1722,14 @@ __evict_walk_target(WT_SESSION_IMPL *session)
* interest.
*/
if (target_pages == 0) {
- btree_inuse = F_ISSET(cache, WT_CACHE_EVICT_CLEAN | WT_CACHE_EVICT_UPDATES) ?
- __wt_btree_bytes_evictable(session) :
- __wt_btree_dirty_leaf_inuse(session);
+ want_tree = (F_ISSET(cache, WT_CACHE_EVICT_CLEAN) && (btree_clean_inuse > 0)) ||
+ (F_ISSET(cache, WT_CACHE_EVICT_DIRTY) && (btree_dirty_inuse > 0)) ||
+ (F_ISSET(cache, WT_CACHE_EVICT_UPDATES) && (btree_updates_inuse > 0));
- if (btree_inuse == 0)
+ if (!want_tree) {
+ WT_STAT_CONN_INCR(session, cache_eviction_server_skip_unwanted_tree);
return (0);
+ }
}
/*
@@ -1774,8 +1779,17 @@ __evict_walk_tree(WT_SESSION_IMPL *session, WT_EVICT_QUEUE *queue, u_int max_ent
*/
start = queue->evict_queue + *slotp;
remaining_slots = max_entries - *slotp;
- if (btree->evict_walk_progress >= btree->evict_walk_target) {
- btree->evict_walk_target = __evict_walk_target(session);
+
+ /*
+ * For this handle, calculate the number of target pages to evict. If the number of target pages
+ * is zero, then simply return early from this function.
+ *
+ * If the progress has not met the previous target, continue using the previous target.
+ */
+ target_pages = __evict_walk_target(session);
+
+ if ((target_pages == 0) || btree->evict_walk_progress >= btree->evict_walk_target) {
+ btree->evict_walk_target = target_pages;
btree->evict_walk_progress = 0;
}
target_pages = btree->evict_walk_target - btree->evict_walk_progress;
@@ -1871,14 +1885,19 @@ __evict_walk_tree(WT_SESSION_IMPL *session, WT_EVICT_QUEUE *queue, u_int max_ent
if (btree->evict_ref == NULL) {
for (;;) {
/* Ensure internal pages indexes remain valid */
- WT_WITH_PAGE_INDEX(
- session, ret = __wt_random_descent(session, &btree->evict_ref, read_flags));
+ WT_WITH_PAGE_INDEX(session,
+ ret = __wt_random_descent(session, &btree->evict_ref, read_flags, &session->rnd));
if (ret != WT_RESTART)
break;
WT_STAT_CONN_INCR(session, cache_eviction_walk_restart);
WT_STAT_DATA_INCR(session, cache_eviction_walk_restart);
}
WT_RET_NOTFOUND_OK(ret);
+
+ if (btree->evict_ref == NULL) {
+ WT_STAT_CONN_INCR(session, cache_eviction_walk_random_returns_null_position);
+ WT_STAT_DATA_INCR(session, cache_eviction_walk_random_returns_null_position);
+ }
}
break;
}
diff --git a/src/third_party/wiredtiger/src/evict/evict_page.c b/src/third_party/wiredtiger/src/evict/evict_page.c
index 887a1579652..df604936941 100644
--- a/src/third_party/wiredtiger/src/evict/evict_page.c
+++ b/src/third_party/wiredtiger/src/evict/evict_page.c
@@ -179,14 +179,13 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32
WT_DECL_RET;
WT_PAGE *page;
uint8_t stats_flags;
- bool clean_page, closing, inmem_split, tree_dead, local_gen;
+ bool clean_page, closing, inmem_split, tree_dead;
conn = S2C(session);
page = ref->page;
closing = LF_ISSET(WT_EVICT_CALL_CLOSING);
stats_flags = 0;
clean_page = false;
- local_gen = false;
__wt_verbose(
session, WT_VERB_EVICT, "page %p (%s)", (void *)page, __wt_page_type_string(page->type));
@@ -197,7 +196,6 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32
/* As re-entry into eviction is possible, only clear the statistics on the first entry. */
if (__wt_session_gen((session), (WT_GEN_EVICT)) == 0) {
- WT_CLEAR(session->reconcile_timeline);
WT_CLEAR(session->evict_timeline);
session->evict_timeline.evict_start = __wt_clock(session);
} else {
@@ -206,13 +204,12 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32
}
/*
- * Enter the eviction generation. If we re-enter eviction, leave the previous generation (which
- * must be as low as the current generation), untouched.
+ * Enter the eviction and split generation. If we re-enter eviction, leave the previous
+ * generation (eviction or split) generation (which must be as low as the current generation),
+ * untouched.
*/
- if (__wt_session_gen(session, WT_GEN_EVICT) == 0) {
- local_gen = true;
- __wt_session_gen_enter(session, WT_GEN_EVICT);
- }
+ WT_ENTER_GENERATION(session, WT_GEN_EVICT);
+ WT_ENTER_GENERATION(session, WT_GEN_SPLIT);
/*
* Immediately increment the forcible eviction counter, we might do an in-memory split and not
@@ -327,8 +324,8 @@ done:
__evict_stats_update(session, stats_flags);
/* Leave any local eviction generation. */
- if (local_gen)
- __wt_session_gen_leave(session, WT_GEN_EVICT);
+ WT_LEAVE_GENERATION(session, WT_GEN_SPLIT);
+ WT_LEAVE_GENERATION(session, WT_GEN_EVICT);
return (ret);
}
@@ -688,7 +685,8 @@ __evict_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags)
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
uint32_t flags;
- bool closing, is_eviction_thread, use_snapshot_for_app_thread;
+ bool closing, is_eviction_thread, use_snapshot_for_app_thread,
+ is_application_thread_snapshot_refreshed;
btree = S2BT(session);
conn = S2C(session);
@@ -696,6 +694,7 @@ __evict_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags)
closing = FLD_ISSET(evict_flags, WT_EVICT_CALL_CLOSING);
cache = conn->cache;
+ is_application_thread_snapshot_refreshed = false;
/*
* Urgent eviction and forced eviction want two different behaviors for inefficient update
@@ -739,12 +738,12 @@ __evict_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags)
/*
* Acquire a snapshot if coming through the eviction thread route. Also, if we have entered
- * eviction through application threads and we have a transaction snapshot, we will use our
- * existing snapshot to evict pages that are not globally visible based on the last_running
- * transaction. Avoid using snapshots when application transactions are in the final stages of
- * commit or rollback as they have already released the snapshot. Otherwise, it becomes harder
- * in the later part of the code to detect updates that belonged to the last running application
- * transaction.
+ * eviction through application threads then we save the existing snapshot and refresh to
+ * acquire a new snapshot, once the application threads are done with eviction then we switch
+ * back the snapshot to its original. Avoid using snapshots when application transactions are in
+ * the final stages of commit or rollback as they have already released the snapshot. Otherwise,
+ * it becomes harder in the later part of the code to detect updates that belonged to the last
+ * running application transaction.
*/
use_snapshot_for_app_thread = !F_ISSET(session, WT_SESSION_INTERNAL) &&
!WT_IS_METADATA(session->dhandle) && WT_SESSION_TXN_SHARED(session)->id != WT_TXN_NONE &&
@@ -770,9 +769,21 @@ __evict_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags)
* outside world.
*/
__wt_txn_bump_snapshot(session);
- else if (use_snapshot_for_app_thread)
+ else if (use_snapshot_for_app_thread) {
+ /*
+ * If we couldn't make progress with the application thread's existing snapshot, save the
+ * existing snapshot and refresh to acquire a new one. Then try eviction again. Once the
+ * application threads are done with eviction, the application thread's snapshot is switched
+ * back to the original.
+ */
+ if (F_ISSET(session->txn, WT_TXN_REFRESH_SNAPSHOT)) {
+ WT_RET(__wt_txn_snapshot_save_and_refresh(session));
+ is_application_thread_snapshot_refreshed = true;
+ WT_STAT_CONN_INCR(session, application_evict_snapshot_refreshed);
+ }
+
LF_SET(WT_REC_APP_EVICTION_SNAPSHOT);
- else if (!WT_SESSION_BTREE_SYNC(session))
+ } else if (!WT_SESSION_BTREE_SYNC(session))
LF_SET(WT_REC_VISIBLE_ALL);
WT_ASSERT(session, LF_ISSET(WT_REC_VISIBLE_ALL) || F_ISSET(session->txn, WT_TXN_HAS_SNAPSHOT));
@@ -792,6 +803,8 @@ __evict_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags)
if (is_eviction_thread)
__wt_txn_release_snapshot(session);
+ else if (is_application_thread_snapshot_refreshed)
+ __wt_txn_snapshot_release_and_restore(session);
WT_RET(ret);
diff --git a/src/third_party/wiredtiger/src/include/block.h b/src/third_party/wiredtiger/src/include/block.h
index f0aed0a3aac..961b7746428 100644
--- a/src/third_party/wiredtiger/src/include/block.h
+++ b/src/third_party/wiredtiger/src/include/block.h
@@ -186,7 +186,7 @@ struct __wt_bm {
int (*compact_page_rewrite)(WT_BM *, WT_SESSION_IMPL *, uint8_t *, size_t *, bool *);
int (*compact_page_skip)(WT_BM *, WT_SESSION_IMPL *, const uint8_t *, size_t, bool *);
int (*compact_skip)(WT_BM *, WT_SESSION_IMPL *, bool *);
- void (*compact_progress)(WT_BM *, WT_SESSION_IMPL *, u_int *);
+ void (*compact_progress)(WT_BM *, WT_SESSION_IMPL *);
int (*compact_start)(WT_BM *, WT_SESSION_IMPL *);
int (*corrupt)(WT_BM *, WT_SESSION_IMPL *, const uint8_t *, size_t);
int (*free)(WT_BM *, WT_SESSION_IMPL *, const uint8_t *, size_t);
diff --git a/src/third_party/wiredtiger/src/include/btmem.h b/src/third_party/wiredtiger/src/include/btmem.h
index 650cc54ca14..58a69308135 100644
--- a/src/third_party/wiredtiger/src/include/btmem.h
+++ b/src/third_party/wiredtiger/src/include/btmem.h
@@ -441,6 +441,13 @@ struct __wt_page_modify {
/* Overflow record tracking for reconciliation. */
WT_OVFL_TRACK *ovfl_track;
+ /*
+ * Stop aggregated timestamp information when all the keys on the page are removed. This time
+ * aggregate information is used to skip these deleted pages as part of the tree walk if the
+ * delete operation is visible to the reader.
+ */
+ WT_TIME_AGGREGATE *stop_ta;
+
#define WT_PAGE_LOCK(s, p) __wt_spin_lock((s), &(p)->modify->page_lock)
#define WT_PAGE_TRYLOCK(s, p) __wt_spin_trylock((s), &(p)->modify->page_lock)
#define WT_PAGE_UNLOCK(s, p) __wt_spin_unlock((s), &(p)->modify->page_lock)
@@ -747,6 +754,15 @@ struct __wt_page {
#define WT_PAGE_REF_OFFSET(page, o) ((void *)((uint8_t *)((page)->dsk) + (o)))
/*
+ * WT_PAGE_WALK_SKIP_STATS --
+ * Statistics to track how many deleted pages are skipped as part of the tree walk.
+ */
+struct __wt_page_walk_skip_stats {
+ size_t total_del_pages_skipped;
+ size_t total_inmem_del_pages_skipped;
+};
+
+/*
* Prepare update states.
*
* Prepare update synchronization is based on the state field, which has the
@@ -1445,17 +1461,9 @@ struct __wt_col_fix_auxiliary_header {
* examining an index, we don't want the oldest split generation to move forward and potentially
* free it.
*/
-#define WT_ENTER_PAGE_INDEX(session) \
- do { \
- uint64_t __prev_split_gen = __wt_session_gen(session, WT_GEN_SPLIT); \
- if (__prev_split_gen == 0) \
- __wt_session_gen_enter(session, WT_GEN_SPLIT);
-
-#define WT_LEAVE_PAGE_INDEX(session) \
- if (__prev_split_gen == 0) \
- __wt_session_gen_leave(session, WT_GEN_SPLIT); \
- } \
- while (0)
+#define WT_ENTER_PAGE_INDEX(session) WT_ENTER_GENERATION((session), WT_GEN_SPLIT);
+
+#define WT_LEAVE_PAGE_INDEX(session) WT_LEAVE_GENERATION((session), WT_GEN_SPLIT);
#define WT_WITH_PAGE_INDEX(session, e) \
WT_ENTER_PAGE_INDEX(session); \
diff --git a/src/third_party/wiredtiger/src/include/btree_inline.h b/src/third_party/wiredtiger/src/include/btree_inline.h
index 0e456c960cb..5da689084ca 100644
--- a/src/third_party/wiredtiger/src/include/btree_inline.h
+++ b/src/third_party/wiredtiger/src/include/btree_inline.h
@@ -1507,6 +1507,26 @@ __wt_ref_addr_copy(WT_SESSION_IMPL *session, WT_REF *ref, WT_ADDR_COPY *copy)
}
/*
+ * __wt_get_page_modify_ta --
+ * Returns the page modify stop time aggregate information if exists.
+ */
+static inline bool
+__wt_get_page_modify_ta(WT_SESSION_IMPL *session, WT_PAGE *page, WT_TIME_AGGREGATE **ta)
+{
+ WT_ASSERT(session, __wt_session_gen(session, WT_GEN_SPLIT) != 0);
+
+ /* If NULL, there is no information. */
+ if (page->modify == NULL)
+ return (false);
+
+ if (page->modify->stop_ta == NULL)
+ return (false);
+
+ WT_ORDERED_READ(*ta, page->modify->stop_ta);
+ return (*ta != NULL);
+}
+
+/*
* __wt_ref_block_free --
* Free the on-disk block for a reference and clear the address.
*/
@@ -2084,13 +2104,19 @@ __wt_btcur_skip_page(
WT_SESSION_IMPL *session, WT_REF *ref, void *context, bool visible_all, bool *skipp)
{
WT_ADDR_COPY addr;
+ WT_PAGE_WALK_SKIP_STATS *walk_skip_stats;
+ WT_TIME_AGGREGATE *ta;
uint8_t previous_state;
+ bool clean_page;
- WT_UNUSED(context);
WT_UNUSED(visible_all);
*skipp = false; /* Default to reading */
+ walk_skip_stats = (WT_PAGE_WALK_SKIP_STATS *)context;
+ ta = NULL;
+ clean_page = false;
+
/* Don't skip pages in FLCS trees; deleted records need to read back as 0. */
if (S2BT(session)->type == BTREE_COL_FIX)
return (0);
@@ -2115,15 +2141,36 @@ __wt_btcur_skip_page(
return (0);
WT_REF_LOCK(session, ref, &previous_state);
- if ((previous_state == WT_REF_DISK || previous_state == WT_REF_DELETED ||
- (previous_state == WT_REF_MEM && !__wt_page_is_modified(ref->page))) &&
- __wt_ref_addr_copy(session, ref, &addr) && addr.ta.newest_stop_txn != WT_TXN_MAX &&
- addr.ta.newest_stop_ts != WT_TS_MAX &&
+
+ if (previous_state == WT_REF_MEM && !__wt_page_is_modified(ref->page))
+ clean_page = true;
+
+ /* Look at the disk address, if it exists. */
+ if ((previous_state == WT_REF_DISK || previous_state == WT_REF_DELETED || clean_page) &&
+ __wt_ref_addr_copy(session, ref, &addr)) {
+ /*
+ * Otherwise, check the timestamp information. We base this decision on the aggregate stop
+ * point added to the page during the last reconciliation.
+ */
+ if (WT_TIME_AGGREGATE_HAS_STOP(&addr.ta) &&
+ __wt_txn_snap_min_visible(session, addr.ta.newest_stop_txn, addr.ta.newest_stop_ts,
+ addr.ta.newest_stop_durable_ts)) {
+ *skipp = true;
+ walk_skip_stats->total_del_pages_skipped++;
+ }
+ } else if (clean_page && __wt_get_page_modify_ta(session, ref->page, &ta) &&
__wt_txn_snap_min_visible(
- session, addr.ta.newest_stop_txn, addr.ta.newest_stop_ts, addr.ta.newest_stop_durable_ts))
+ session, ta->newest_stop_txn, ta->newest_stop_ts, ta->newest_stop_durable_ts)) {
+ /*
+ * If the reader can see all of the deleted content, they can skip a deleted clean page.
+ * Before determining whether the deleted page is visible, copy the stop time aggregate
+ * information pointer because as part of the checkpoint operation, this pointer can be
+ * released in parallel.
+ */
*skipp = true;
+ walk_skip_stats->total_inmem_del_pages_skipped++;
+ }
WT_REF_UNLOCK(ref, previous_state);
-
return (0);
}
diff --git a/src/third_party/wiredtiger/src/include/column_inline.h b/src/third_party/wiredtiger/src/include/column_inline.h
index 262f86a33bd..22c4e1ec9f9 100644
--- a/src/third_party/wiredtiger/src/include/column_inline.h
+++ b/src/third_party/wiredtiger/src/include/column_inline.h
@@ -221,9 +221,9 @@ __col_insert_search(
/* Fast path appends. */
if (recno >= WT_INSERT_RECNO(ret_ins)) {
for (i = 0; i < WT_SKIP_MAXDEPTH; i++) {
- ins_stack[i] = (i == 0) ?
- &ret_ins->next[0] :
- (ins_head->tail[i] != NULL) ? &ins_head->tail[i]->next[i] : &ins_head->head[i];
+ ins_stack[i] = (i == 0) ? &ret_ins->next[0] :
+ (ins_head->tail[i] != NULL) ? &ins_head->tail[i]->next[i] :
+ &ins_head->head[i];
next_stack[i] = NULL;
}
return (ret_ins);
diff --git a/src/third_party/wiredtiger/src/include/compact.h b/src/third_party/wiredtiger/src/include/compact.h
index bf1a31b2167..d163ae9bb74 100644
--- a/src/third_party/wiredtiger/src/include/compact.h
+++ b/src/third_party/wiredtiger/src/include/compact.h
@@ -11,5 +11,6 @@ struct __wt_compact_state {
uint32_t file_count; /* Number of files seen */
uint64_t max_time; /* Configured timeout */
- struct timespec begin; /* Starting time */
+ struct timespec begin; /* Starting time */
+ struct timespec last_progress; /* Last time a progress message was logged. */
};
diff --git a/src/third_party/wiredtiger/src/include/connection.h b/src/third_party/wiredtiger/src/include/connection.h
index dceef9b6a92..fe21564d7a0 100644
--- a/src/third_party/wiredtiger/src/include/connection.h
+++ b/src/third_party/wiredtiger/src/include/connection.h
@@ -438,6 +438,7 @@ struct __wt_connection_impl {
WT_THREAD_GROUP evict_threads;
uint32_t evict_threads_max; /* Max eviction threads */
uint32_t evict_threads_min; /* Min eviction threads */
+ bool evict_sample_inmem;
#define WT_STATLOG_FILENAME "WiredTigerStat.%d.%H"
WT_SESSION_IMPL *stat_session; /* Statistics log session */
diff --git a/src/third_party/wiredtiger/src/include/cursor.h b/src/third_party/wiredtiger/src/include/cursor.h
index 9155582eac5..19b2735c8a0 100644
--- a/src/third_party/wiredtiger/src/include/cursor.h
+++ b/src/third_party/wiredtiger/src/include/cursor.h
@@ -209,6 +209,12 @@ struct __wt_cursor_btree {
*/
enum { WT_CBT_RETRY_NOTSET = 0, WT_CBT_RETRY_INSERT, WT_CBT_RETRY_PAGE } iter_retry;
+ /*
+ * The random number state is used for random cursor operations. The random number can be seeded
+ * by the user or is randomly set based on the time and thread ID.
+ */
+ WT_RAND_STATE rnd; /* Random number generation state */
+
#ifdef HAVE_DIAGNOSTIC
/* Check that cursor next/prev never returns keys out-of-order. */
WT_ITEM *lastkey, _lastkey;
diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h
index 343f11f06d9..1f9226aa0df 100644
--- a/src/third_party/wiredtiger/src/include/extern.h
+++ b/src/third_party/wiredtiger/src/include/extern.h
@@ -1194,8 +1194,8 @@ extern int __wt_panic_func(WT_SESSION_IMPL *session, int error, const char *func
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_progress(WT_SESSION_IMPL *session, const char *s, uint64_t v)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_random_descent(WT_SESSION_IMPL *session, WT_REF **refp, uint32_t flags)
- WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_random_descent(WT_SESSION_IMPL *session, WT_REF **refp, uint32_t flags,
+ WT_RAND_STATE *rnd) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_range_truncate(WT_CURSOR *start, WT_CURSOR *stop)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_raw_to_esc_hex(WT_SESSION_IMPL *session, const uint8_t *from, size_t size,
@@ -1594,6 +1594,8 @@ extern int __wt_txn_set_timestamp(WT_SESSION_IMPL *session, const char *cfg[], b
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_txn_set_timestamp_uint(WT_SESSION_IMPL *session, WT_TS_TXN_TYPE which,
wt_timestamp_t ts) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_txn_snapshot_save_and_refresh(WT_SESSION_IMPL *session)
+ WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_txn_truncate_log(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *start,
WT_CURSOR_BTREE *stop) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_txn_ts_log(WT_SESSION_IMPL *session)
@@ -1684,8 +1686,7 @@ extern void __wt_blkcache_set_readonly(WT_SESSION_IMPL *session) WT_GCC_FUNC_DEC
extern void __wt_block_ckpt_destroy(WT_SESSION_IMPL *session, WT_BLOCK_CKPT *ci);
extern void __wt_block_compact_get_progress_stats(WT_SESSION_IMPL *session, WT_BM *bm,
uint64_t *pages_reviewedp, uint64_t *pages_skippedp, uint64_t *pages_rewrittenp);
-extern void __wt_block_compact_progress(
- WT_SESSION_IMPL *session, WT_BLOCK *block, u_int *msg_countp);
+extern void __wt_block_compact_progress(WT_SESSION_IMPL *session, WT_BLOCK *block);
extern void __wt_block_configure_first_fit(WT_BLOCK *block, bool on);
extern void __wt_block_ext_free(WT_SESSION_IMPL *session, WT_EXT *ext);
extern void __wt_block_extlist_free(WT_SESSION_IMPL *session, WT_EXTLIST *el);
@@ -1809,6 +1810,8 @@ extern void __wt_page_out(WT_SESSION_IMPL *session, WT_PAGE **pagep);
extern void __wt_print_huffman_code(void *huffman_arg, uint16_t symbol);
extern void __wt_random_init(WT_RAND_STATE volatile *rnd_state)
WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
+extern void __wt_random_init_custom_seed(WT_RAND_STATE volatile *rnd_state, uint64_t v)
+ WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
extern void __wt_random_init_seed(WT_SESSION_IMPL *session, WT_RAND_STATE volatile *rnd_state)
WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
extern void __wt_read_row_time_window(
@@ -1873,6 +1876,7 @@ extern void __wt_txn_publish_durable_timestamp(WT_SESSION_IMPL *session);
extern void __wt_txn_release(WT_SESSION_IMPL *session);
extern void __wt_txn_release_resources(WT_SESSION_IMPL *session);
extern void __wt_txn_release_snapshot(WT_SESSION_IMPL *session);
+extern void __wt_txn_snapshot_release_and_restore(WT_SESSION_IMPL *session);
extern void __wt_txn_stats_update(WT_SESSION_IMPL *session);
extern void __wt_txn_truncate_end(WT_SESSION_IMPL *session);
extern void __wt_update_vector_clear(WT_UPDATE_VECTOR *updates);
@@ -1925,6 +1929,8 @@ static inline bool __wt_eviction_updates_needed(WT_SESSION_IMPL *session, double
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_failpoint(WT_SESSION_IMPL *session, uint64_t conn_flag, u_int probability)
WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+static inline bool __wt_get_page_modify_ta(WT_SESSION_IMPL *session, WT_PAGE *page,
+ WT_TIME_AGGREGATE **ta) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_isalnum(u_char c) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_isalpha(u_char c) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_isascii(u_char c) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
diff --git a/src/third_party/wiredtiger/src/include/misc.h b/src/third_party/wiredtiger/src/include/misc.h
index 93c81f0d7fb..1d506627bed 100644
--- a/src/third_party/wiredtiger/src/include/misc.h
+++ b/src/third_party/wiredtiger/src/include/misc.h
@@ -42,6 +42,7 @@
#define WT_MILLION (1000000)
#define WT_BILLION (1000000000)
+#define WT_DAY (86400)
#define WT_MINUTE (60)
#define WT_PROGRESS_MSG_PERIOD (20) /* Seconds. */
diff --git a/src/third_party/wiredtiger/src/include/os.h b/src/third_party/wiredtiger/src/include/os.h
index f3d6602fbbc..15cc76d70eb 100644
--- a/src/third_party/wiredtiger/src/include/os.h
+++ b/src/third_party/wiredtiger/src/include/os.h
@@ -71,12 +71,12 @@
#define WT_CLOCKDIFF_MS(end, begin) (WT_CLOCKDIFF_NS(end, begin) / WT_MILLION)
#define WT_CLOCKDIFF_SEC(end, begin) (WT_CLOCKDIFF_NS(end, begin) / WT_BILLION)
-#define WT_TIMECMP(t1, t2) \
- ((t1).tv_sec < (t2).tv_sec ? \
- -1 : \
- (t1).tv_sec == (t2).tv_sec ? \
- (t1).tv_nsec < (t2).tv_nsec ? -1 : (t1).tv_nsec == (t2).tv_nsec ? 0 : 1 : \
- 1)
+#define WT_TIMECMP(t1, t2) \
+ ((t1).tv_sec < (t2).tv_sec ? -1 : \
+ (t1).tv_sec == (t2).tv_sec ? (t1).tv_nsec < (t2).tv_nsec ? -1 : \
+ (t1).tv_nsec == (t2).tv_nsec ? 0 : \
+ 1 : \
+ 1)
/*
* Macros to ensure a file handle is inserted or removed from both the main and the hashed queue,
diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h
index 1daa47ca256..d81c163221f 100644
--- a/src/third_party/wiredtiger/src/include/stat.h
+++ b/src/third_party/wiredtiger/src/include/stat.h
@@ -419,6 +419,7 @@ struct __wt_connection_stats {
int64_t cache_eviction_server_skip_pages_last_running;
int64_t cache_eviction_server_skip_pages_retry;
int64_t cache_eviction_server_skip_unwanted_pages;
+ int64_t cache_eviction_server_skip_unwanted_tree;
int64_t cache_eviction_server_skip_trees_too_many_active_walks;
int64_t cache_eviction_server_skip_checkpointing_trees;
int64_t cache_eviction_server_skip_trees_stick_in_cache;
@@ -442,6 +443,7 @@ struct __wt_connection_stats {
int64_t cache_eviction_walks_stopped;
int64_t cache_eviction_walks_gave_up_no_targets;
int64_t cache_eviction_walks_gave_up_ratio;
+ int64_t cache_eviction_walk_random_returns_null_position;
int64_t cache_eviction_walks_ended;
int64_t cache_eviction_walk_restart;
int64_t cache_eviction_walk_from_root;
@@ -494,6 +496,7 @@ struct __wt_connection_stats {
int64_t cache_eviction_internal_pages_already_queued;
int64_t cache_eviction_split_internal;
int64_t cache_eviction_split_leaf;
+ int64_t cache_eviction_random_sample_inmem_root;
int64_t cache_bytes_max;
int64_t cache_eviction_maximum_milliseconds;
int64_t cache_eviction_maximum_page_size;
@@ -568,9 +571,11 @@ struct __wt_connection_stats {
int64_t fsync_io;
int64_t read_io;
int64_t write_io;
+ int64_t cursor_tree_walk_del_page_skip;
int64_t cursor_next_skip_total;
int64_t cursor_prev_skip_total;
int64_t cursor_skip_hs_cur_position;
+ int64_t cursor_tree_walk_inmem_del_page_skip;
int64_t cursor_search_near_prefix_fast_paths;
int64_t cursor_bulk_count;
int64_t cursor_cached_count;
@@ -786,6 +791,7 @@ struct __wt_connection_stats {
int64_t thread_fsync_active;
int64_t thread_read_active;
int64_t thread_write_active;
+ int64_t application_evict_snapshot_refreshed;
int64_t application_evict_time;
int64_t application_cache_time;
int64_t txn_release_blocked;
@@ -911,6 +917,7 @@ struct __wt_dsrc_stats {
int64_t btree_compact_pages_reviewed;
int64_t btree_compact_pages_rewritten;
int64_t btree_compact_pages_skipped;
+ int64_t btree_checkpoint_pages_reconciled;
int64_t btree_compact_skipped;
int64_t btree_column_fix;
int64_t btree_column_tws;
@@ -952,6 +959,7 @@ struct __wt_dsrc_stats {
int64_t cache_eviction_walks_stopped;
int64_t cache_eviction_walks_gave_up_no_targets;
int64_t cache_eviction_walks_gave_up_ratio;
+ int64_t cache_eviction_walk_random_returns_null_position;
int64_t cache_eviction_walks_ended;
int64_t cache_eviction_walk_restart;
int64_t cache_eviction_walk_from_root;
@@ -975,6 +983,7 @@ struct __wt_dsrc_stats {
int64_t cache_eviction_internal;
int64_t cache_eviction_split_internal;
int64_t cache_eviction_split_leaf;
+ int64_t cache_eviction_random_sample_inmem_root;
int64_t cache_eviction_dirty;
int64_t cache_read_overflow;
int64_t cache_eviction_deepen;
@@ -1028,9 +1037,11 @@ struct __wt_dsrc_stats {
int64_t compress_hist_ratio_8;
int64_t compress_write_fail;
int64_t compress_write_too_small;
+ int64_t cursor_tree_walk_del_page_skip;
int64_t cursor_next_skip_total;
int64_t cursor_prev_skip_total;
int64_t cursor_skip_hs_cur_position;
+ int64_t cursor_tree_walk_inmem_del_page_skip;
int64_t cursor_search_near_prefix_fast_paths;
int64_t cursor_insert_bulk;
int64_t cursor_reopen;
diff --git a/src/third_party/wiredtiger/src/include/time_inline.h b/src/third_party/wiredtiger/src/include/time_inline.h
index fe4a7ae82d7..e1c39c6b8ab 100644
--- a/src/third_party/wiredtiger/src/include/time_inline.h
+++ b/src/third_party/wiredtiger/src/include/time_inline.h
@@ -36,6 +36,8 @@ __wt_rdtsc(void)
__asm__ volatile("mrs %0, cntvct_el0" : "=r"(t));
return (t);
}
+#elif defined(_M_AMD64)
+ return (__rdtsc());
#else
return (0);
#endif
diff --git a/src/third_party/wiredtiger/src/include/timestamp_inline.h b/src/third_party/wiredtiger/src/include/timestamp_inline.h
index 6ccb7d3b5e3..0af27ad2174 100644
--- a/src/third_party/wiredtiger/src/include/timestamp_inline.h
+++ b/src/third_party/wiredtiger/src/include/timestamp_inline.h
@@ -182,3 +182,39 @@
if ((source)->prepare != 0) \
(dest)->prepare = 1; \
} while (0)
+
+/* Abstract away checking whether all records in an aggregated time window have been deleted. */
+#define WT_TIME_AGGREGATE_ALL_DELETED(ta) ((ta)->newest_stop_ts != WT_TS_MAX)
+
+/*
+ * Update a time aggregate in preparation for an obsolete visibility check. This deserves a macro,
+ * since the mechanism for identifying whether an aggregated time window contains only obsolete (i.e
+ * deleted) data requires checking two different timestamps. Note the output time aggregate might be
+ * either empty initialized, or have been populated via prior calls to this macro with other
+ * aggregated windows.
+ */
+#define WT_TIME_AGGREGATE_MERGE_OBSOLETE_VISIBLE(session, out_ta, in_ta) \
+ do { \
+ WT_ASSERT(session, (out_ta)->init_merge == 1); \
+ (out_ta)->newest_stop_durable_ts = \
+ WT_MAX((out_ta)->newest_stop_durable_ts, (in_ta)->newest_stop_durable_ts); \
+ /* \
+ * The durable and non-durable stop timestamps are interestingly different in that the \
+ * non-durable version encodes whether all records are deleted by setting WT_TS_MAX in \
+ * there are non-deleted records (the common case), but durable doesn't and records the \
+ * largest timestamp associated with any deleted record. Use this copy-macro to abstract \
+ * that subtlety away. Since obsolete checks always want to know whether all content was \
+ * removed, copy that semantic into the durable stop timestamp to make visibility \
+ * checking sensible. \
+ */ \
+ if (!WT_TIME_AGGREGATE_ALL_DELETED((in_ta))) \
+ (out_ta)->newest_stop_durable_ts = WT_TS_MAX; \
+ \
+ (out_ta)->newest_txn = WT_MAX((out_ta)->newest_txn, (in_ta)->newest_txn); \
+ (out_ta)->newest_stop_ts = WT_MAX((out_ta)->newest_stop_ts, (in_ta)->newest_stop_ts); \
+ (out_ta)->newest_stop_txn = WT_MAX((out_ta)->newest_stop_txn, (in_ta)->newest_stop_txn); \
+ } while (0)
+
+/* Check if the stop time aggregate is set. */
+#define WT_TIME_AGGREGATE_HAS_STOP(ta) \
+ ((ta)->newest_stop_txn != WT_TXN_MAX || (ta)->newest_stop_ts != WT_TS_MAX)
diff --git a/src/third_party/wiredtiger/src/include/txn.h b/src/third_party/wiredtiger/src/include/txn.h
index 7c60dfc23bb..29d5756a40f 100644
--- a/src/third_party/wiredtiger/src/include/txn.h
+++ b/src/third_party/wiredtiger/src/include/txn.h
@@ -242,6 +242,22 @@ struct __wt_txn_op {
uint32_t flags;
};
+/*
+ * WT_TXN_SNAPSHOT --
+ * A structure to store the transactions snapshot details.
+ */
+struct __wt_txn_snapshot {
+ /*
+ * Snapshot data:
+ * txn_ids >= snap_max are invisible,
+ * txn_ids < snap_min are visible,
+ * everything else is visible unless it is in the snapshot.
+ */
+ uint64_t snap_max, snap_min;
+ uint64_t *snapshot;
+ uint32_t snapshot_count;
+};
+
#define WT_TS_VERBOSE_PREFIX "unexpected timestamp usage: "
/*
@@ -255,17 +271,14 @@ struct __wt_txn {
uint32_t forced_iso; /* Isolation is currently forced. */
- /*
- * Snapshot data:
- * ids >= snap_max are invisible,
- * ids < snap_min are visible,
- * everything else is visible unless it is in the snapshot.
- */
- uint64_t snap_min, snap_max;
- uint64_t *snapshot;
- uint32_t snapshot_count;
uint32_t txn_logsync; /* Log sync configuration */
+ /* Snapshot data. */
+ WT_TXN_SNAPSHOT snapshot_data;
+
+ /* Backup snapshot data. */
+ WT_TXN_SNAPSHOT *backup_snapshot_data;
+
/*
* Timestamp copied into updates created by this transaction.
*
@@ -336,13 +349,14 @@ struct __wt_txn {
#define WT_TXN_PREPARE 0x00100u
#define WT_TXN_PREPARE_IGNORE_API_CHECK 0x00200u
#define WT_TXN_READONLY 0x00400u
-#define WT_TXN_RUNNING 0x00800u
-#define WT_TXN_SHARED_TS_DURABLE 0x01000u
-#define WT_TXN_SHARED_TS_READ 0x02000u
-#define WT_TXN_SYNC_SET 0x04000u
-#define WT_TXN_TS_ROUND_PREPARED 0x08000u
-#define WT_TXN_TS_ROUND_READ 0x10000u
-#define WT_TXN_UPDATE 0x20000u
+#define WT_TXN_REFRESH_SNAPSHOT 0x00800u
+#define WT_TXN_RUNNING 0x01000u
+#define WT_TXN_SHARED_TS_DURABLE 0x02000u
+#define WT_TXN_SHARED_TS_READ 0x04000u
+#define WT_TXN_SYNC_SET 0x08000u
+#define WT_TXN_TS_ROUND_PREPARED 0x10000u
+#define WT_TXN_TS_ROUND_READ 0x20000u
+#define WT_TXN_UPDATE 0x40000u
/* AUTOMATIC FLAG VALUE GENERATION STOP 32 */
uint32_t flags;
diff --git a/src/third_party/wiredtiger/src/include/txn_inline.h b/src/third_party/wiredtiger/src/include/txn_inline.h
index b40885113e4..266986dc50d 100644
--- a/src/third_party/wiredtiger/src/include/txn_inline.h
+++ b/src/third_party/wiredtiger/src/include/txn_inline.h
@@ -183,6 +183,20 @@ __txn_next_op(WT_SESSION_IMPL *session, WT_TXN_OP **opp)
}
/*
+ * __txn_swap_snapshot --
+ * Swap the snapshot pointers.
+ */
+static inline void
+__txn_swap_snapshot(uint64_t **snap_a, uint64_t **snap_b)
+{
+ uint64_t *temp;
+
+ temp = *snap_a;
+ *snap_a = *snap_b;
+ *snap_b = temp;
+}
+
+/*
* __wt_txn_unmodify --
* If threads race making updates, they may discard the last referenced WT_UPDATE item while the
* transaction is still active. This function removes the last update item from the "log".
@@ -700,8 +714,8 @@ __txn_visible_id(WT_SESSION_IMPL *session, uint64_t id)
/* Otherwise, we should be called with a snapshot or we are in a checkpoint cursor. */
WT_ASSERT(session, F_ISSET(txn, WT_TXN_HAS_SNAPSHOT) || session->dhandle->checkpoint != NULL);
- return (__wt_txn_visible_id_snapshot(
- id, txn->snap_min, txn->snap_max, txn->snapshot, txn->snapshot_count));
+ return (__wt_txn_visible_id_snapshot(id, txn->snapshot_data.snap_min,
+ txn->snapshot_data.snap_max, txn->snapshot_data.snapshot, txn->snapshot_data.snapshot_count));
}
/*
@@ -737,8 +751,10 @@ __wt_txn_snap_min_visible(
/* Not needed since 6.0 doesn't support checkpoint cursors. */
WT_UNUSED(durable_timestamp);
+ WT_ASSERT(session, F_ISSET(session->txn, WT_TXN_HAS_SNAPSHOT));
+
/* Transaction snapshot minimum check. */
- if (!WT_TXNID_LT(id, session->txn->snap_min))
+ if (!WT_TXNID_LT(id, session->txn->snapshot_data.snap_min))
return (false);
/* Transactions read their writes, regardless of timestamps. */
@@ -1440,13 +1456,16 @@ __wt_txn_modify_block(
WT_ERR(__wt_scr_alloc(session, 1024, &buf));
WT_ERR(__wt_buf_fmt(session, buf,
"snapshot_min=%" PRIu64 ", snapshot_max=%" PRIu64 ", snapshot_count=%" PRIu32,
- txn->snap_min, txn->snap_max, txn->snapshot_count));
- if (txn->snapshot_count > 0) {
+ txn->snapshot_data.snap_min, txn->snapshot_data.snap_max,
+ txn->snapshot_data.snapshot_count));
+ if (txn->snapshot_data.snapshot_count > 0) {
WT_ERR(__wt_buf_catfmt(session, buf, ", snapshots=["));
- for (snap_count = 0; snap_count < txn->snapshot_count - 1; ++snap_count)
- WT_ERR(
- __wt_buf_catfmt(session, buf, "%" PRIu64 ",", txn->snapshot[snap_count]));
- WT_ERR(__wt_buf_catfmt(session, buf, "%" PRIu64 "]", txn->snapshot[snap_count]));
+ for (snap_count = 0; snap_count < txn->snapshot_data.snapshot_count - 1;
+ ++snap_count)
+ WT_ERR(__wt_buf_catfmt(
+ session, buf, "%" PRIu64 ",", txn->snapshot_data.snapshot[snap_count]));
+ WT_ERR(__wt_buf_catfmt(
+ session, buf, "%" PRIu64 "]", txn->snapshot_data.snapshot[snap_count]));
}
__wt_verbose_debug(session, WT_VERB_TRANSACTION, "%s", (const char *)buf->data);
}
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index 9fd50de2d76..673601c26bb 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -974,6 +974,9 @@ struct __wt_session {
* object into \c next_random_sample_size equal-sized pieces\, and each retrieval returns a
* record from one of those pieces. See @ref cursor_random for details., a string; default
* \c 0.}
+ * @config{next_random_seed, configure the cursor to set an initial random seed when using
+ * \c next_random configuration. This is used for testing purposes only. See @ref
+ * cursor_random for details., a string; default \c 0.}
* @config{overwrite, configures whether the cursor's insert and update methods check the
* existing state of the record. If \c overwrite is \c false\, WT_CURSOR::insert fails with
* ::WT_DUPLICATE_KEY if the record exists\, WT_CURSOR::update fails with ::WT_NOTFOUND if
@@ -2202,14 +2205,16 @@ struct __wt_connection {
* @config{error_prefix, prefix string for error messages., a string; default empty.}
* @config{eviction = (, eviction configuration options., a set of related configuration
* options defined below.}
- * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_max, maximum number of
- * threads WiredTiger will start to help evict pages from cache. The number of threads
- * started will vary depending on the current eviction load. Each eviction worker thread
- * uses a session from the configured session_max., an integer between 1 and 20; default \c
- * 8.}
- * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_min, minimum number of threads WiredTiger
- * will start to help evict pages from cache. The number of threads currently running will
- * vary depending on the current eviction load., an integer between 1 and 20; default \c 1.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;evict_sample_inmem, If no
+ * in-memory ref is found on the root page\, attempt to locate a random in-memory page by
+ * examining all entries on the root page., a boolean flag; default \c true.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_max, maximum number of threads WiredTiger will
+ * start to help evict pages from cache. The number of threads started will vary depending
+ * on the current eviction load. Each eviction worker thread uses a session from the
+ * configured session_max., an integer between 1 and 20; default \c 8.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_min, minimum number of threads WiredTiger will
+ * start to help evict pages from cache. The number of threads currently running will vary
+ * depending on the current eviction load., an integer between 1 and 20; default \c 1.}
* @config{ ),,}
* @config{eviction_checkpoint_target, perform eviction at the beginning of checkpoints to
* bring the dirty content in cache to this level. It is a percentage of the cache size if
@@ -2949,14 +2954,16 @@ struct __wt_connection {
* @config{error_prefix, prefix string for error messages., a string; default empty.}
* @config{eviction = (, eviction configuration options., a set of related configuration options
* defined below.}
- * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_max, maximum number of threads WiredTiger
- * will start to help evict pages from cache. The number of threads started will vary depending on
- * the current eviction load. Each eviction worker thread uses a session from the configured
- * session_max., an integer between 1 and 20; default \c 8.}
- * @config{&nbsp;&nbsp;&nbsp;&nbsp;
- * threads_min, minimum number of threads WiredTiger will start to help evict pages from cache. The
- * number of threads currently running will vary depending on the current eviction load., an integer
- * between 1 and 20; default \c 1.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;evict_sample_inmem, If no in-memory ref is found
+ * on the root page\, attempt to locate a random in-memory page by examining all entries on the root
+ * page., a boolean flag; default \c true.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_max, maximum
+ * number of threads WiredTiger will start to help evict pages from cache. The number of threads
+ * started will vary depending on the current eviction load. Each eviction worker thread uses a
+ * session from the configured session_max., an integer between 1 and 20; default \c 8.}
+ * @config{&nbsp;&nbsp;&nbsp;&nbsp;threads_min, minimum number of threads WiredTiger will start to
+ * help evict pages from cache. The number of threads currently running will vary depending on the
+ * current eviction load., an integer between 1 and 20; default \c 1.}
* @config{ ),,}
* @config{eviction_checkpoint_target, perform eviction at the beginning of checkpoints to bring the
* dirty content in cache to this level. It is a percentage of the cache size if the value is
@@ -5362,1125 +5369,1146 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_PAGES_RETRY 1078
/*! cache: eviction server skips pages that we do not want to evict */
#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_UNWANTED_PAGES 1079
+/*! cache: eviction server skips tree that we do not want to evict */
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_UNWANTED_TREE 1080
/*!
* cache: eviction server skips trees because there are too many active
* walks
*/
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_TOO_MANY_ACTIVE_WALKS 1080
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_TOO_MANY_ACTIVE_WALKS 1081
/*! cache: eviction server skips trees that are being checkpointed */
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_CHECKPOINTING_TREES 1081
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_CHECKPOINTING_TREES 1082
/*!
* cache: eviction server skips trees that are configured to stick in
* cache
*/
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_STICK_IN_CACHE 1082
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_STICK_IN_CACHE 1083
/*! cache: eviction server skips trees that disable eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_EVICTION_DISABLED 1083
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_EVICTION_DISABLED 1084
/*! cache: eviction server skips trees that were not useful before */
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_NOT_USEFUL_BEFORE 1084
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SKIP_TREES_NOT_USEFUL_BEFORE 1085
/*!
* cache: eviction server slept, because we did not make progress with
* eviction
*/
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1085
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1086
/*! cache: eviction server unable to reach eviction goal */
-#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1086
+#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1087
/*! cache: eviction server waiting for a leaf page */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_LEAF_NOTFOUND 1087
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_LEAF_NOTFOUND 1088
/*! cache: eviction state */
-#define WT_STAT_CONN_CACHE_EVICTION_STATE 1088
+#define WT_STAT_CONN_CACHE_EVICTION_STATE 1089
/*!
* cache: eviction walk most recent sleeps for checkpoint handle
* gathering
*/
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_SLEEPS 1089
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_SLEEPS 1090
/*! cache: eviction walk target pages histogram - 0-9 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1090
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1091
/*! cache: eviction walk target pages histogram - 10-31 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1091
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1092
/*! cache: eviction walk target pages histogram - 128 and higher */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1092
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1093
/*! cache: eviction walk target pages histogram - 32-63 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1093
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1094
/*! cache: eviction walk target pages histogram - 64-128 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1094
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1095
/*!
* cache: eviction walk target pages reduced due to history store cache
* pressure
*/
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_REDUCED 1095
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_REDUCED 1096
/*! cache: eviction walk target strategy both clean and dirty pages */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_BOTH_CLEAN_AND_DIRTY 1096
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_BOTH_CLEAN_AND_DIRTY 1097
/*! cache: eviction walk target strategy only clean pages */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_CLEAN 1097
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_CLEAN 1098
/*! cache: eviction walk target strategy only dirty pages */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_DIRTY 1098
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_STRATEGY_DIRTY 1099
/*! cache: eviction walks abandoned */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1099
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1100
/*! cache: eviction walks gave up because they restarted their walk twice */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1100
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1101
/*!
* cache: eviction walks gave up because they saw too many pages and
* found no candidates
*/
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 1101
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 1102
/*!
* cache: eviction walks gave up because they saw too many pages and
* found too few candidates
*/
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 1102
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 1103
+/*!
+ * cache: eviction walks random search fails to locate a page, results in
+ * a null position
+ */
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_RANDOM_RETURNS_NULL_POSITION 1104
/*! cache: eviction walks reached end of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1103
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1105
/*! cache: eviction walks restarted */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_RESTART 1104
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_RESTART 1106
/*! cache: eviction walks started from root of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1105
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1107
/*! cache: eviction walks started from saved location in tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1106
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1108
/*! cache: eviction worker thread active */
-#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1107
+#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1109
/*! cache: eviction worker thread created */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1108
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1110
/*! cache: eviction worker thread evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1109
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1111
/*! cache: eviction worker thread removed */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1110
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1112
/*! cache: eviction worker thread stable number */
-#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1111
+#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1113
/*! cache: files with active eviction walks */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1112
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1114
/*! cache: files with new eviction walks started */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1113
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1115
/*! cache: force re-tuning of eviction workers once in a while */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1114
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1116
/*!
* cache: forced eviction - do not retry count to evict pages selected to
* evict during reconciliation
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_NO_RETRY 1115
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_NO_RETRY 1117
/*!
* cache: forced eviction - history store pages failed to evict while
* session has history store cursor open
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_FAIL 1116
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_FAIL 1118
/*!
* cache: forced eviction - history store pages selected while session
* has history store cursor open
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS 1117
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS 1119
/*!
* cache: forced eviction - history store pages successfully evicted
* while session has history store cursor open
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_SUCCESS 1118
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_SUCCESS 1120
/*! cache: forced eviction - pages evicted that were clean count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN 1119
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN 1121
/*! cache: forced eviction - pages evicted that were clean time (usecs) */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN_TIME 1120
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN_TIME 1122
/*! cache: forced eviction - pages evicted that were dirty count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY 1121
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY 1123
/*! cache: forced eviction - pages evicted that were dirty time (usecs) */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY_TIME 1122
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY_TIME 1124
/*!
* cache: forced eviction - pages selected because of a large number of
* updates to a single item
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_LONG_UPDATE_LIST 1123
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_LONG_UPDATE_LIST 1125
/*!
* cache: forced eviction - pages selected because of too many deleted
* items count
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1124
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1126
/*! cache: forced eviction - pages selected count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1125
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1127
/*! cache: forced eviction - pages selected unable to be evicted count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1126
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1128
/*! cache: forced eviction - pages selected unable to be evicted time */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1127
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1129
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1128
+#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1130
/*! cache: hazard pointer check calls */
-#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1129
+#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1131
/*! cache: hazard pointer check entries walked */
-#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1130
+#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1132
/*! cache: hazard pointer maximum array length */
-#define WT_STAT_CONN_CACHE_HAZARD_MAX 1131
+#define WT_STAT_CONN_CACHE_HAZARD_MAX 1133
/*! cache: history store table insert calls */
-#define WT_STAT_CONN_CACHE_HS_INSERT 1132
+#define WT_STAT_CONN_CACHE_HS_INSERT 1134
/*! cache: history store table insert calls that returned restart */
-#define WT_STAT_CONN_CACHE_HS_INSERT_RESTART 1133
+#define WT_STAT_CONN_CACHE_HS_INSERT_RESTART 1135
/*! cache: history store table max on-disk size */
-#define WT_STAT_CONN_CACHE_HS_ONDISK_MAX 1134
+#define WT_STAT_CONN_CACHE_HS_ONDISK_MAX 1136
/*! cache: history store table on-disk size */
-#define WT_STAT_CONN_CACHE_HS_ONDISK 1135
+#define WT_STAT_CONN_CACHE_HS_ONDISK 1137
/*!
* cache: history store table out-of-order resolved updates that lose
* their durable timestamp
*/
-#define WT_STAT_CONN_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 1136
+#define WT_STAT_CONN_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 1138
/*!
* cache: history store table out-of-order updates that were fixed up by
* reinserting with the fixed timestamp
*/
-#define WT_STAT_CONN_CACHE_HS_ORDER_REINSERT 1137
+#define WT_STAT_CONN_CACHE_HS_ORDER_REINSERT 1139
/*! cache: history store table reads */
-#define WT_STAT_CONN_CACHE_HS_READ 1138
+#define WT_STAT_CONN_CACHE_HS_READ 1140
/*! cache: history store table reads missed */
-#define WT_STAT_CONN_CACHE_HS_READ_MISS 1139
+#define WT_STAT_CONN_CACHE_HS_READ_MISS 1141
/*! cache: history store table reads requiring squashed modifies */
-#define WT_STAT_CONN_CACHE_HS_READ_SQUASH 1140
+#define WT_STAT_CONN_CACHE_HS_READ_SQUASH 1142
/*!
* cache: history store table truncation by rollback to stable to remove
* an unstable update
*/
-#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 1141
+#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 1143
/*!
* cache: history store table truncation by rollback to stable to remove
* an update
*/
-#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_RTS 1142
+#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_RTS 1144
/*! cache: history store table truncation to remove an update */
-#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE 1143
+#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE 1145
/*!
* cache: history store table truncation to remove range of updates due
* to key being removed from the data page during reconciliation
*/
-#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 1144
+#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 1146
/*!
* cache: history store table truncation to remove range of updates due
* to out-of-order timestamp update on data page
*/
-#define WT_STAT_CONN_CACHE_HS_ORDER_REMOVE 1145
+#define WT_STAT_CONN_CACHE_HS_ORDER_REMOVE 1147
/*! cache: history store table writes requiring squashed modifies */
-#define WT_STAT_CONN_CACHE_HS_WRITE_SQUASH 1146
+#define WT_STAT_CONN_CACHE_HS_WRITE_SQUASH 1148
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1147
+#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1149
/*! cache: in-memory page splits */
-#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1148
+#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1150
/*! cache: internal pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1149
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1151
/*! cache: internal pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_QUEUED 1150
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_QUEUED 1152
/*! cache: internal pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_SEEN 1151
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_SEEN 1153
/*! cache: internal pages seen by eviction walk that are already queued */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_ALREADY_QUEUED 1152
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_ALREADY_QUEUED 1154
/*! cache: internal pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1153
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1155
/*! cache: leaf pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1154
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1156
+/*!
+ * cache: locate a random in-mem ref by examining all entries on the root
+ * page
+ */
+#define WT_STAT_CONN_CACHE_EVICTION_RANDOM_SAMPLE_INMEM_ROOT 1157
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1155
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1158
/*! cache: maximum milliseconds spent at a single eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_MILLISECONDS 1156
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_MILLISECONDS 1159
/*! cache: maximum page size seen at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1157
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1160
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1158
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1161
/*! cache: modified pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1159
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1162
/*! cache: operations timed out waiting for space in cache */
-#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1160
+#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1163
/*! cache: overflow pages read into cache */
-#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1161
+#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1164
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1162
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1165
/*! cache: page written requiring history store records */
-#define WT_STAT_CONN_CACHE_WRITE_HS 1163
+#define WT_STAT_CONN_CACHE_WRITE_HS 1166
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1164
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1167
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1165
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1168
/*! cache: pages evicted in parallel with checkpoint */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_IN_PARALLEL_WITH_CHECKPOINT 1166
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_IN_PARALLEL_WITH_CHECKPOINT 1169
/*! cache: pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1167
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1170
/*! cache: pages queued for eviction post lru sorting */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_POST_LRU 1168
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_POST_LRU 1171
/*! cache: pages queued for urgent eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1169
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1172
/*! cache: pages queued for urgent eviction during walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1170
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1173
/*!
* cache: pages queued for urgent eviction from history store due to high
* dirty content
*/
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT_HS_DIRTY 1171
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT_HS_DIRTY 1174
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1172
+#define WT_STAT_CONN_CACHE_READ 1175
/*! cache: pages read into cache after truncate */
-#define WT_STAT_CONN_CACHE_READ_DELETED 1173
+#define WT_STAT_CONN_CACHE_READ_DELETED 1176
/*! cache: pages read into cache after truncate in prepare state */
-#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1174
+#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1177
/*!
* cache: pages removed from the ordinary queue to be queued for urgent
* eviction
*/
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAR_ORDINARY 1175
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAR_ORDINARY 1178
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1176
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1179
/*! cache: pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1177
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1180
/*! cache: pages seen by eviction walk that are already queued */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_ALREADY_QUEUED 1178
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_ALREADY_QUEUED 1181
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1179
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1182
/*!
* cache: pages selected for eviction unable to be evicted because of
* active children on an internal page
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL_ACTIVE_CHILDREN_ON_AN_INTERNAL_PAGE 1180
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL_ACTIVE_CHILDREN_ON_AN_INTERNAL_PAGE 1183
/*!
* cache: pages selected for eviction unable to be evicted because of
* failure in reconciliation
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL_IN_RECONCILIATION 1181
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL_IN_RECONCILIATION 1184
/*!
* cache: pages selected for eviction unable to be evicted because of
* race between checkpoint and out of order timestamps handling
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL_CHECKPOINT_OUT_OF_ORDER_TS 1182
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL_CHECKPOINT_OUT_OF_ORDER_TS 1185
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1183
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1186
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1184
+#define WT_STAT_CONN_CACHE_WRITE 1187
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1185
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1188
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1186
+#define WT_STAT_CONN_CACHE_OVERHEAD 1189
/*! cache: the number of times full update inserted to history store */
-#define WT_STAT_CONN_CACHE_HS_INSERT_FULL_UPDATE 1187
+#define WT_STAT_CONN_CACHE_HS_INSERT_FULL_UPDATE 1190
/*! cache: the number of times reverse modify inserted to history store */
-#define WT_STAT_CONN_CACHE_HS_INSERT_REVERSE_MODIFY 1188
+#define WT_STAT_CONN_CACHE_HS_INSERT_REVERSE_MODIFY 1191
/*!
* cache: total milliseconds spent inside reentrant history store
* evictions in a reconciliation
*/
-#define WT_STAT_CONN_CACHE_REENTRY_HS_EVICTION_MILLISECONDS 1189
+#define WT_STAT_CONN_CACHE_REENTRY_HS_EVICTION_MILLISECONDS 1192
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1190
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1193
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1191
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1194
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1192
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1195
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1193
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1196
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1194
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1197
/*! capacity: background fsync file handles considered */
-#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1195
+#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1198
/*! capacity: background fsync file handles synced */
-#define WT_STAT_CONN_FSYNC_ALL_FH 1196
+#define WT_STAT_CONN_FSYNC_ALL_FH 1199
/*! capacity: background fsync time (msecs) */
-#define WT_STAT_CONN_FSYNC_ALL_TIME 1197
+#define WT_STAT_CONN_FSYNC_ALL_TIME 1200
/*! capacity: bytes read */
-#define WT_STAT_CONN_CAPACITY_BYTES_READ 1198
+#define WT_STAT_CONN_CAPACITY_BYTES_READ 1201
/*! capacity: bytes written for checkpoint */
-#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1199
+#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1202
/*! capacity: bytes written for eviction */
-#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1200
+#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1203
/*! capacity: bytes written for log */
-#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1201
+#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1204
/*! capacity: bytes written total */
-#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1202
+#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1205
/*! capacity: threshold to call fsync */
-#define WT_STAT_CONN_CAPACITY_THRESHOLD 1203
+#define WT_STAT_CONN_CAPACITY_THRESHOLD 1206
/*! capacity: time waiting due to total capacity (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1204
+#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1207
/*! capacity: time waiting during checkpoint (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1205
+#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1208
/*! capacity: time waiting during eviction (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1206
+#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1209
/*! capacity: time waiting during logging (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_LOG 1207
+#define WT_STAT_CONN_CAPACITY_TIME_LOG 1210
/*! capacity: time waiting during read (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_READ 1208
+#define WT_STAT_CONN_CAPACITY_TIME_READ 1211
/*! checkpoint-cleanup: pages added for eviction */
-#define WT_STAT_CONN_CC_PAGES_EVICT 1209
+#define WT_STAT_CONN_CC_PAGES_EVICT 1212
/*! checkpoint-cleanup: pages removed */
-#define WT_STAT_CONN_CC_PAGES_REMOVED 1210
+#define WT_STAT_CONN_CC_PAGES_REMOVED 1213
/*! checkpoint-cleanup: pages skipped during tree walk */
-#define WT_STAT_CONN_CC_PAGES_WALK_SKIPPED 1211
+#define WT_STAT_CONN_CC_PAGES_WALK_SKIPPED 1214
/*! checkpoint-cleanup: pages visited */
-#define WT_STAT_CONN_CC_PAGES_VISITED 1212
+#define WT_STAT_CONN_CC_PAGES_VISITED 1215
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1213
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1216
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1214
+#define WT_STAT_CONN_COND_AUTO_WAIT 1217
/*!
* connection: auto adjusting condition wait raced to update timeout and
* skipped updating
*/
-#define WT_STAT_CONN_COND_AUTO_WAIT_SKIPPED 1215
+#define WT_STAT_CONN_COND_AUTO_WAIT_SKIPPED 1218
/*! connection: detected system time went backwards */
-#define WT_STAT_CONN_TIME_TRAVEL 1216
+#define WT_STAT_CONN_TIME_TRAVEL 1219
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1217
+#define WT_STAT_CONN_FILE_OPEN 1220
/*! connection: hash bucket array size for data handles */
-#define WT_STAT_CONN_BUCKETS_DH 1218
+#define WT_STAT_CONN_BUCKETS_DH 1221
/*! connection: hash bucket array size general */
-#define WT_STAT_CONN_BUCKETS 1219
+#define WT_STAT_CONN_BUCKETS 1222
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1220
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1223
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1221
+#define WT_STAT_CONN_MEMORY_FREE 1224
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1222
+#define WT_STAT_CONN_MEMORY_GROW 1225
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1223
+#define WT_STAT_CONN_COND_WAIT 1226
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1224
+#define WT_STAT_CONN_RWLOCK_READ 1227
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1225
+#define WT_STAT_CONN_RWLOCK_WRITE 1228
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1226
+#define WT_STAT_CONN_FSYNC_IO 1229
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1227
+#define WT_STAT_CONN_READ_IO 1230
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1228
+#define WT_STAT_CONN_WRITE_IO 1231
+/*! cursor: Total number of deleted pages skipped during tree walk */
+#define WT_STAT_CONN_CURSOR_TREE_WALK_DEL_PAGE_SKIP 1232
/*! cursor: Total number of entries skipped by cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_TOTAL 1229
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_TOTAL 1233
/*! cursor: Total number of entries skipped by cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_TOTAL 1230
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_TOTAL 1234
/*!
* cursor: Total number of entries skipped to position the history store
* cursor
*/
-#define WT_STAT_CONN_CURSOR_SKIP_HS_CUR_POSITION 1231
+#define WT_STAT_CONN_CURSOR_SKIP_HS_CUR_POSITION 1235
+/*!
+ * cursor: Total number of in-memory deleted pages skipped during tree
+ * walk
+ */
+#define WT_STAT_CONN_CURSOR_TREE_WALK_INMEM_DEL_PAGE_SKIP 1236
/*!
* cursor: Total number of times a search near has exited due to prefix
* config
*/
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 1232
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 1237
/*! cursor: bulk cursor count */
-#define WT_STAT_CONN_CURSOR_BULK_COUNT 1233
+#define WT_STAT_CONN_CURSOR_BULK_COUNT 1238
/*! cursor: cached cursor count */
-#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1234
+#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1239
/*! cursor: cursor bulk loaded cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT_BULK 1235
+#define WT_STAT_CONN_CURSOR_INSERT_BULK 1240
/*! cursor: cursor close calls that result in cache */
-#define WT_STAT_CONN_CURSOR_CACHE 1236
+#define WT_STAT_CONN_CURSOR_CACHE 1241
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1237
+#define WT_STAT_CONN_CURSOR_CREATE 1242
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1238
+#define WT_STAT_CONN_CURSOR_INSERT 1243
/*! cursor: cursor insert key and value bytes */
-#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1239
+#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1244
/*! cursor: cursor modify calls */
-#define WT_STAT_CONN_CURSOR_MODIFY 1240
+#define WT_STAT_CONN_CURSOR_MODIFY 1245
/*! cursor: cursor modify key and value bytes affected */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1241
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1246
/*! cursor: cursor modify value bytes modified */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1242
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1247
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1243
+#define WT_STAT_CONN_CURSOR_NEXT 1248
/*!
* cursor: cursor next calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1244
+#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1249
/*!
* cursor: cursor next calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1245
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1250
/*! cursor: cursor next calls that skip less than 100 entries */
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1246
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1251
/*! cursor: cursor operation restarted */
-#define WT_STAT_CONN_CURSOR_RESTART 1247
+#define WT_STAT_CONN_CURSOR_RESTART 1252
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1248
+#define WT_STAT_CONN_CURSOR_PREV 1253
/*!
* cursor: cursor prev calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1249
+#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1254
/*!
* cursor: cursor prev calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1250
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1255
/*! cursor: cursor prev calls that skip less than 100 entries */
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1251
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1256
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1252
+#define WT_STAT_CONN_CURSOR_REMOVE 1257
/*! cursor: cursor remove key bytes removed */
-#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1253
+#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1258
/*! cursor: cursor reserve calls */
-#define WT_STAT_CONN_CURSOR_RESERVE 1254
+#define WT_STAT_CONN_CURSOR_RESERVE 1259
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1255
+#define WT_STAT_CONN_CURSOR_RESET 1260
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1256
+#define WT_STAT_CONN_CURSOR_SEARCH 1261
/*! cursor: cursor search history store calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_HS 1257
+#define WT_STAT_CONN_CURSOR_SEARCH_HS 1262
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1258
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1263
/*! cursor: cursor sweep buckets */
-#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1259
+#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1264
/*! cursor: cursor sweep cursors closed */
-#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1260
+#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1265
/*! cursor: cursor sweep cursors examined */
-#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1261
+#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1266
/*! cursor: cursor sweeps */
-#define WT_STAT_CONN_CURSOR_SWEEP 1262
+#define WT_STAT_CONN_CURSOR_SWEEP 1267
/*! cursor: cursor truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1263
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1268
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1264
+#define WT_STAT_CONN_CURSOR_UPDATE 1269
/*! cursor: cursor update key and value bytes */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1265
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1270
/*! cursor: cursor update value size change */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1266
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1271
/*! cursor: cursors reused from cache */
-#define WT_STAT_CONN_CURSOR_REOPEN 1267
+#define WT_STAT_CONN_CURSOR_REOPEN 1272
/*! cursor: open cursor count */
-#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1268
+#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1273
/*! data-handle: connection data handle size */
-#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1269
+#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1274
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1270
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1275
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1271
+#define WT_STAT_CONN_DH_SWEEP_REF 1276
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1272
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1277
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1273
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1278
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1274
+#define WT_STAT_CONN_DH_SWEEP_TOD 1279
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1275
+#define WT_STAT_CONN_DH_SWEEPS 1280
/*!
* data-handle: connection sweeps skipped due to checkpoint gathering
* handles
*/
-#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1276
+#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1281
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1277
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1282
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1278
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1283
/*! lock: checkpoint lock acquisitions */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1279
+#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1284
/*! lock: checkpoint lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1280
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1285
/*! lock: checkpoint lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1281
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1286
/*! lock: dhandle lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1282
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1287
/*! lock: dhandle lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1283
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1288
/*! lock: dhandle read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1284
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1289
/*! lock: dhandle write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1285
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1290
/*!
* lock: durable timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1286
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1291
/*!
* lock: durable timestamp queue lock internal thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1287
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1292
/*! lock: durable timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1288
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1293
/*! lock: durable timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1289
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1294
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1290
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1295
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1291
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1296
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1292
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1297
/*!
* lock: read timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1293
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1298
/*! lock: read timestamp queue lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1294
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1299
/*! lock: read timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1295
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1300
/*! lock: read timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1296
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1301
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1297
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1302
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1298
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1303
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1299
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1304
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1300
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1305
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1301
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1306
/*! lock: table read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1302
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1307
/*! lock: table write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1303
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1308
/*! lock: txn global lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1304
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1309
/*! lock: txn global lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1305
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1310
/*! lock: txn global read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1306
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1311
/*! lock: txn global write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1307
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1312
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1308
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1313
/*! log: force log remove time sleeping (usecs) */
-#define WT_STAT_CONN_LOG_FORCE_REMOVE_SLEEP 1309
+#define WT_STAT_CONN_LOG_FORCE_REMOVE_SLEEP 1314
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1310
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1315
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1311
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1316
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1312
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1317
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1313
+#define WT_STAT_CONN_LOG_FLUSH 1318
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1314
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1319
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1315
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1320
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1316
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1321
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1317
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1322
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1318
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1323
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1319
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1324
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1320
+#define WT_STAT_CONN_LOG_SCANS 1325
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1321
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1326
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1322
+#define WT_STAT_CONN_LOG_WRITE_LSN 1327
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1323
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1328
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1324
+#define WT_STAT_CONN_LOG_SYNC 1329
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1325
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1330
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1326
+#define WT_STAT_CONN_LOG_SYNC_DIR 1331
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1327
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1332
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1328
+#define WT_STAT_CONN_LOG_WRITES 1333
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1329
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1334
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1330
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1335
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1331
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1336
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1332
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1337
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1333
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1338
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1334
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1339
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1335
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1340
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1336
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1341
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1337
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1342
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1338
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1343
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1339
+#define WT_STAT_CONN_LOG_SLOT_RACES 1344
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1340
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1345
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1341
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1346
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1342
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1347
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1343
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1348
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1344
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1349
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1345
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1350
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1346
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1351
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1347
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1352
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1348
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1353
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1349
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1354
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1350
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1355
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1351
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1356
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1352
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1357
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1353
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1358
/*! perf: file system read latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1354
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1359
/*! perf: file system read latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1355
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1360
/*! perf: file system read latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1356
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1361
/*! perf: file system read latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1357
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1362
/*! perf: file system read latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1358
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1363
/*! perf: file system read latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1359
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1364
/*! perf: file system write latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1360
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1365
/*! perf: file system write latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1361
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1366
/*! perf: file system write latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1362
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1367
/*! perf: file system write latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1363
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1368
/*! perf: file system write latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1364
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1369
/*! perf: file system write latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1365
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1370
/*! perf: operation read latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1366
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1371
/*! perf: operation read latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1367
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1372
/*! perf: operation read latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1368
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1373
/*! perf: operation read latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1369
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1374
/*! perf: operation read latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1370
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1375
/*! perf: operation write latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1371
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1376
/*! perf: operation write latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1372
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1377
/*! perf: operation write latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1373
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1378
/*! perf: operation write latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1374
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1379
/*! perf: operation write latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1375
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1380
/*! reconciliation: approximate byte size of timestamps in pages written */
-#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1376
+#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1381
/*!
* reconciliation: approximate byte size of transaction IDs in pages
* written
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1377
+#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1382
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1378
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1383
/*! reconciliation: leaf-page overflow keys */
-#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1379
+#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1384
/*! reconciliation: maximum milliseconds spent in a reconciliation call */
-#define WT_STAT_CONN_REC_MAXIMUM_MILLISECONDS 1380
+#define WT_STAT_CONN_REC_MAXIMUM_MILLISECONDS 1385
/*!
* reconciliation: maximum milliseconds spent in building a disk image in
* a reconciliation
*/
-#define WT_STAT_CONN_REC_MAXIMUM_IMAGE_BUILD_MILLISECONDS 1381
+#define WT_STAT_CONN_REC_MAXIMUM_IMAGE_BUILD_MILLISECONDS 1386
/*!
* reconciliation: maximum milliseconds spent in moving updates to the
* history store in a reconciliation
*/
-#define WT_STAT_CONN_REC_MAXIMUM_HS_WRAPUP_MILLISECONDS 1382
+#define WT_STAT_CONN_REC_MAXIMUM_HS_WRAPUP_MILLISECONDS 1387
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1383
+#define WT_STAT_CONN_REC_PAGES 1388
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1384
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1389
/*!
* reconciliation: page reconciliation calls that resulted in values with
* prepared transaction metadata
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1385
+#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1390
/*!
* reconciliation: page reconciliation calls that resulted in values with
* timestamps
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_TS 1386
+#define WT_STAT_CONN_REC_PAGES_WITH_TS 1391
/*!
* reconciliation: page reconciliation calls that resulted in values with
* transaction ids
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1387
+#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1392
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1388
+#define WT_STAT_CONN_REC_PAGE_DELETE 1393
/*!
* reconciliation: pages written including an aggregated newest start
* durable timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1389
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1394
/*!
* reconciliation: pages written including an aggregated newest stop
* durable timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1390
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1395
/*!
* reconciliation: pages written including an aggregated newest stop
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1391
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1396
/*!
* reconciliation: pages written including an aggregated newest stop
* transaction ID
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1392
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1397
/*!
* reconciliation: pages written including an aggregated newest
* transaction ID
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1393
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1398
/*!
* reconciliation: pages written including an aggregated oldest start
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1394
+#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1399
/*! reconciliation: pages written including an aggregated prepare */
-#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1395
+#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1400
/*! reconciliation: pages written including at least one prepare state */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1396
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1401
/*!
* reconciliation: pages written including at least one start durable
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1397
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1402
/*! reconciliation: pages written including at least one start timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1398
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1403
/*!
* reconciliation: pages written including at least one start transaction
* ID
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1399
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1404
/*!
* reconciliation: pages written including at least one stop durable
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1400
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1405
/*! reconciliation: pages written including at least one stop timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1401
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1406
/*!
* reconciliation: pages written including at least one stop transaction
* ID
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1402
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1407
/*! reconciliation: records written including a prepare state */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1403
+#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1408
/*! reconciliation: records written including a start durable timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1404
+#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1409
/*! reconciliation: records written including a start timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1405
+#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1410
/*! reconciliation: records written including a start transaction ID */
-#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1406
+#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1411
/*! reconciliation: records written including a stop durable timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1407
+#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1412
/*! reconciliation: records written including a stop timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1408
+#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1413
/*! reconciliation: records written including a stop transaction ID */
-#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1409
+#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1414
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1410
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1415
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1411
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1416
/*! session: attempts to remove a local object and the object is in use */
-#define WT_STAT_CONN_LOCAL_OBJECTS_INUSE 1412
+#define WT_STAT_CONN_LOCAL_OBJECTS_INUSE 1417
/*! session: flush_tier operation calls */
-#define WT_STAT_CONN_FLUSH_TIER 1413
+#define WT_STAT_CONN_FLUSH_TIER 1418
/*! session: flush_tier tables skipped due to no checkpoint */
-#define WT_STAT_CONN_FLUSH_TIER_SKIPPED 1414
+#define WT_STAT_CONN_FLUSH_TIER_SKIPPED 1419
/*! session: flush_tier tables switched */
-#define WT_STAT_CONN_FLUSH_TIER_SWITCHED 1415
+#define WT_STAT_CONN_FLUSH_TIER_SWITCHED 1420
/*! session: local objects removed */
-#define WT_STAT_CONN_LOCAL_OBJECTS_REMOVED 1416
+#define WT_STAT_CONN_LOCAL_OBJECTS_REMOVED 1421
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1417
+#define WT_STAT_CONN_SESSION_OPEN 1422
/*! session: session query timestamp calls */
-#define WT_STAT_CONN_SESSION_QUERY_TS 1418
+#define WT_STAT_CONN_SESSION_QUERY_TS 1423
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1419
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1424
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1420
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1425
/*! session: table alter triggering checkpoint calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1421
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1426
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1422
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1427
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1423
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1428
/*! session: table compact failed calls due to cache pressure */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL_CACHE_PRESSURE 1424
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL_CACHE_PRESSURE 1429
/*! session: table compact running */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_RUNNING 1425
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_RUNNING 1430
/*! session: table compact skipped as process would not reduce file size */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SKIPPED 1426
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SKIPPED 1431
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1427
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1432
/*! session: table compact timeout */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_TIMEOUT 1428
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_TIMEOUT 1433
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1429
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1434
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1430
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1435
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1431
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1436
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1432
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1437
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1433
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1438
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1434
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1439
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1435
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1440
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1436
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1441
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1437
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1442
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1438
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1443
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1439
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1444
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1440
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1445
/*! session: tiered operations dequeued and processed */
-#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1441
+#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1446
/*! session: tiered operations scheduled */
-#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1442
+#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1447
/*! session: tiered storage local retention time (secs) */
-#define WT_STAT_CONN_TIERED_RETENTION 1443
+#define WT_STAT_CONN_TIERED_RETENTION 1448
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1444
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1449
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1445
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1450
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1446
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1451
+/*! thread-yield: application thread snapshot refreshed for eviction */
+#define WT_STAT_CONN_APPLICATION_EVICT_SNAPSHOT_REFRESHED 1452
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1447
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1453
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1448
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1454
/*!
* thread-yield: connection close blocked waiting for transaction state
* stabilization
*/
-#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1449
+#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1455
/*! thread-yield: connection close yielded for lsm manager shutdown */
-#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1450
+#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1456
/*! thread-yield: data handle lock yielded */
-#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1451
+#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1457
/*!
* thread-yield: get reference for page index and slot time sleeping
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1452
+#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1458
/*! thread-yield: page access yielded due to prepare state change */
-#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1453
+#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1459
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1454
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1460
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1455
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1461
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1456
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1462
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1457
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1463
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1458
+#define WT_STAT_CONN_PAGE_SLEEP 1464
/*!
* thread-yield: page delete rollback time sleeping for state change
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1459
+#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1465
/*! thread-yield: page reconciliation yielded due to child modification */
-#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1460
+#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1466
/*! transaction: Number of prepared updates */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1461
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1467
/*! transaction: Number of prepared updates committed */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1462
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1468
/*! transaction: Number of prepared updates repeated on the same key */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1463
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1469
/*! transaction: Number of prepared updates rolled back */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1464
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1470
/*!
* transaction: a reader raced with a prepared transaction commit and
* skipped an update or updates
*/
-#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_COMMIT 1465
+#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_COMMIT 1471
/*! transaction: checkpoint has acquired a snapshot for its transaction */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SNAPSHOT_ACQUIRED 1466
+#define WT_STAT_CONN_TXN_CHECKPOINT_SNAPSHOT_ACQUIRED 1472
/*! transaction: oldest pinned transaction ID rolled back for eviction */
-#define WT_STAT_CONN_TXN_ROLLBACK_OLDEST_PINNED 1467
+#define WT_STAT_CONN_TXN_ROLLBACK_OLDEST_PINNED 1473
/*! transaction: prepared transactions */
-#define WT_STAT_CONN_TXN_PREPARE 1468
+#define WT_STAT_CONN_TXN_PREPARE 1474
/*! transaction: prepared transactions committed */
-#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1469
+#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1475
/*! transaction: prepared transactions currently active */
-#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1470
+#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1476
/*! transaction: prepared transactions rolled back */
-#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1471
+#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1477
/*! transaction: query timestamp calls */
-#define WT_STAT_CONN_TXN_QUERY_TS 1472
+#define WT_STAT_CONN_TXN_QUERY_TS 1478
/*! transaction: race to read prepared update retry */
-#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1473
+#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1479
/*! transaction: rollback to stable calls */
-#define WT_STAT_CONN_TXN_RTS 1474
+#define WT_STAT_CONN_TXN_RTS 1480
/*!
* transaction: rollback to stable history store records with stop
* timestamps older than newer records
*/
-#define WT_STAT_CONN_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 1475
+#define WT_STAT_CONN_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 1481
/*! transaction: rollback to stable inconsistent checkpoint */
-#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1476
+#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1482
/*! transaction: rollback to stable keys removed */
-#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1477
+#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1483
/*! transaction: rollback to stable keys restored */
-#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1478
+#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1484
/*! transaction: rollback to stable pages visited */
-#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1479
+#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1485
/*! transaction: rollback to stable restored tombstones from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1480
+#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1486
/*! transaction: rollback to stable restored updates from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1481
+#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1487
/*! transaction: rollback to stable skipping delete rle */
-#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1482
+#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1488
/*! transaction: rollback to stable skipping stable rle */
-#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1483
+#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1489
/*! transaction: rollback to stable sweeping history store keys */
-#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1484
+#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1490
/*! transaction: rollback to stable tree walk skipping pages */
-#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1485
+#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1491
/*! transaction: rollback to stable updates aborted */
-#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1486
+#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1492
/*! transaction: rollback to stable updates removed from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1487
+#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1493
/*! transaction: sessions scanned in each walk of concurrent sessions */
-#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1488
+#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1494
/*! transaction: set timestamp calls */
-#define WT_STAT_CONN_TXN_SET_TS 1489
+#define WT_STAT_CONN_TXN_SET_TS 1495
/*! transaction: set timestamp durable calls */
-#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1490
+#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1496
/*! transaction: set timestamp durable updates */
-#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1491
+#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1497
/*! transaction: set timestamp oldest calls */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1492
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1498
/*! transaction: set timestamp oldest updates */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1493
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1499
/*! transaction: set timestamp stable calls */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE 1494
+#define WT_STAT_CONN_TXN_SET_TS_STABLE 1500
/*! transaction: set timestamp stable updates */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1495
+#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1501
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1496
+#define WT_STAT_CONN_TXN_BEGIN 1502
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1497
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1503
/*!
* transaction: transaction checkpoint currently running for history
* store file
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1498
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1504
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1499
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1505
/*!
* transaction: transaction checkpoint history store file duration
* (usecs)
*/
-#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1500
+#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1506
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1501
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1507
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1502
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1508
/*!
* transaction: transaction checkpoint most recent duration for gathering
* all handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1503
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1509
/*!
* transaction: transaction checkpoint most recent duration for gathering
* applied handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1504
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1510
/*!
* transaction: transaction checkpoint most recent duration for gathering
* skipped handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1505
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1511
/*! transaction: transaction checkpoint most recent handles applied */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1506
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1512
/*! transaction: transaction checkpoint most recent handles skipped */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1507
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1513
/*! transaction: transaction checkpoint most recent handles walked */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1508
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1514
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1509
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1515
/*! transaction: transaction checkpoint prepare currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1510
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1516
/*! transaction: transaction checkpoint prepare max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1511
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1517
/*! transaction: transaction checkpoint prepare min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1512
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1518
/*! transaction: transaction checkpoint prepare most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1513
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1519
/*! transaction: transaction checkpoint prepare total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1514
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1520
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1515
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1521
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1516
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1522
/*! transaction: transaction checkpoint stop timing stress active */
-#define WT_STAT_CONN_TXN_CHECKPOINT_STOP_STRESS_ACTIVE 1517
+#define WT_STAT_CONN_TXN_CHECKPOINT_STOP_STRESS_ACTIVE 1523
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1518
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1524
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1519
+#define WT_STAT_CONN_TXN_CHECKPOINT 1525
/*! transaction: transaction checkpoints due to obsolete pages */
-#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1520
+#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1526
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1521
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1527
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1522
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1528
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1523
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1529
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1524
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1530
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1525
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1531
/*! transaction: transaction range of timestamps currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1526
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1532
/*! transaction: transaction range of timestamps pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1527
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1533
/*!
* transaction: transaction range of timestamps pinned by the oldest
* active read timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1528
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1534
/*!
* transaction: transaction range of timestamps pinned by the oldest
* timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1529
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1535
/*! transaction: transaction read timestamp of the oldest active reader */
-#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1530
+#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1536
/*! transaction: transaction rollback to stable currently running */
-#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1531
+#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1537
/*! transaction: transaction walk of concurrent sessions */
-#define WT_STAT_CONN_TXN_WALK_SESSIONS 1532
+#define WT_STAT_CONN_TXN_WALK_SESSIONS 1538
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1533
+#define WT_STAT_CONN_TXN_COMMIT 1539
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1534
+#define WT_STAT_CONN_TXN_ROLLBACK 1540
/*! transaction: update conflicts */
-#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1535
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1541
/*!
* @}
@@ -6549,627 +6577,646 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_REWRITTEN 2027
/*! btree: btree compact pages skipped */
#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_SKIPPED 2028
+/*! btree: btree number of pages reconciled during checkpoint */
+#define WT_STAT_DSRC_BTREE_CHECKPOINT_PAGES_RECONCILED 2029
/*! btree: btree skipped by compaction as process would not reduce size */
-#define WT_STAT_DSRC_BTREE_COMPACT_SKIPPED 2029
+#define WT_STAT_DSRC_BTREE_COMPACT_SKIPPED 2030
/*!
* btree: column-store fixed-size leaf pages, only reported if tree_walk
* or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_FIX 2030
+#define WT_STAT_DSRC_BTREE_COLUMN_FIX 2031
/*!
* btree: column-store fixed-size time windows, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_TWS 2031
+#define WT_STAT_DSRC_BTREE_COLUMN_TWS 2032
/*!
* btree: column-store internal pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_INTERNAL 2032
+#define WT_STAT_DSRC_BTREE_COLUMN_INTERNAL 2033
/*!
* btree: column-store variable-size RLE encoded values, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_RLE 2033
+#define WT_STAT_DSRC_BTREE_COLUMN_RLE 2034
/*!
* btree: column-store variable-size deleted values, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_DELETED 2034
+#define WT_STAT_DSRC_BTREE_COLUMN_DELETED 2035
/*!
* btree: column-store variable-size leaf pages, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_VARIABLE 2035
+#define WT_STAT_DSRC_BTREE_COLUMN_VARIABLE 2036
/*! btree: fixed-record size */
-#define WT_STAT_DSRC_BTREE_FIXED_LEN 2036
+#define WT_STAT_DSRC_BTREE_FIXED_LEN 2037
/*! btree: maximum internal page size */
-#define WT_STAT_DSRC_BTREE_MAXINTLPAGE 2037
+#define WT_STAT_DSRC_BTREE_MAXINTLPAGE 2038
/*! btree: maximum leaf page key size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFKEY 2038
+#define WT_STAT_DSRC_BTREE_MAXLEAFKEY 2039
/*! btree: maximum leaf page size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFPAGE 2039
+#define WT_STAT_DSRC_BTREE_MAXLEAFPAGE 2040
/*! btree: maximum leaf page value size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFVALUE 2040
+#define WT_STAT_DSRC_BTREE_MAXLEAFVALUE 2041
/*! btree: maximum tree depth */
-#define WT_STAT_DSRC_BTREE_MAXIMUM_DEPTH 2041
+#define WT_STAT_DSRC_BTREE_MAXIMUM_DEPTH 2042
/*!
* btree: number of key/value pairs, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ENTRIES 2042
+#define WT_STAT_DSRC_BTREE_ENTRIES 2043
/*!
* btree: overflow pages, only reported if tree_walk or all statistics
* are enabled
*/
-#define WT_STAT_DSRC_BTREE_OVERFLOW 2043
+#define WT_STAT_DSRC_BTREE_OVERFLOW 2044
/*!
* btree: row-store empty values, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_EMPTY_VALUES 2044
+#define WT_STAT_DSRC_BTREE_ROW_EMPTY_VALUES 2045
/*!
* btree: row-store internal pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_INTERNAL 2045
+#define WT_STAT_DSRC_BTREE_ROW_INTERNAL 2046
/*!
* btree: row-store leaf pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_LEAF 2046
+#define WT_STAT_DSRC_BTREE_ROW_LEAF 2047
/*! cache: bytes currently in the cache */
-#define WT_STAT_DSRC_CACHE_BYTES_INUSE 2047
+#define WT_STAT_DSRC_CACHE_BYTES_INUSE 2048
/*! cache: bytes dirty in the cache cumulative */
-#define WT_STAT_DSRC_CACHE_BYTES_DIRTY_TOTAL 2048
+#define WT_STAT_DSRC_CACHE_BYTES_DIRTY_TOTAL 2049
/*! cache: bytes read into cache */
-#define WT_STAT_DSRC_CACHE_BYTES_READ 2049
+#define WT_STAT_DSRC_CACHE_BYTES_READ 2050
/*! cache: bytes written from cache */
-#define WT_STAT_DSRC_CACHE_BYTES_WRITE 2050
+#define WT_STAT_DSRC_CACHE_BYTES_WRITE 2051
/*! cache: checkpoint blocked page eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_CHECKPOINT 2051
+#define WT_STAT_DSRC_CACHE_EVICTION_CHECKPOINT 2052
/*!
* cache: checkpoint of history store file blocked non-history store page
* eviction
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_CHECKPOINT_HS 2052
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_CHECKPOINT_HS 2053
/*! cache: data source pages selected for eviction unable to be evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_FAIL 2053
+#define WT_STAT_DSRC_CACHE_EVICTION_FAIL 2054
/*!
* cache: eviction gave up due to detecting an out of order on disk value
* behind the last update on the chain
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_1 2054
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_1 2055
/*!
* cache: eviction gave up due to detecting an out of order tombstone
* ahead of the selected on disk update
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_2 2055
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_2 2056
/*!
* cache: eviction gave up due to detecting an out of order tombstone
* ahead of the selected on disk update after validating the update chain
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_3 2056
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_3 2057
/*!
* cache: eviction gave up due to detecting out of order timestamps on
* the update chain after the selected on disk update
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_4 2057
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_4 2058
/*!
* cache: eviction gave up due to needing to remove a record from the
* history store but checkpoint is running
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_REMOVE_HS_RACE_WITH_CHECKPOINT 2058
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_REMOVE_HS_RACE_WITH_CHECKPOINT 2059
/*! cache: eviction walk passes of a file */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_PASSES 2059
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_PASSES 2060
/*! cache: eviction walk target pages histogram - 0-9 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT10 2060
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT10 2061
/*! cache: eviction walk target pages histogram - 10-31 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT32 2061
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT32 2062
/*! cache: eviction walk target pages histogram - 128 and higher */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_GE128 2062
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_GE128 2063
/*! cache: eviction walk target pages histogram - 32-63 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT64 2063
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT64 2064
/*! cache: eviction walk target pages histogram - 64-128 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT128 2064
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT128 2065
/*!
* cache: eviction walk target pages reduced due to history store cache
* pressure
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_REDUCED 2065
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_REDUCED 2066
/*! cache: eviction walks abandoned */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ABANDONED 2066
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ABANDONED 2067
/*! cache: eviction walks gave up because they restarted their walk twice */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_STOPPED 2067
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_STOPPED 2068
/*!
* cache: eviction walks gave up because they saw too many pages and
* found no candidates
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 2068
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 2069
/*!
* cache: eviction walks gave up because they saw too many pages and
* found too few candidates
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 2069
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 2070
+/*!
+ * cache: eviction walks random search fails to locate a page, results in
+ * a null position
+ */
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_RANDOM_RETURNS_NULL_POSITION 2071
/*! cache: eviction walks reached end of tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ENDED 2070
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ENDED 2072
/*! cache: eviction walks restarted */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_RESTART 2071
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_RESTART 2073
/*! cache: eviction walks started from root of tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_FROM_ROOT 2072
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_FROM_ROOT 2074
/*! cache: eviction walks started from saved location in tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_SAVED_POS 2073
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_SAVED_POS 2075
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_HAZARD 2074
+#define WT_STAT_DSRC_CACHE_EVICTION_HAZARD 2076
/*! cache: history store table insert calls */
-#define WT_STAT_DSRC_CACHE_HS_INSERT 2075
+#define WT_STAT_DSRC_CACHE_HS_INSERT 2077
/*! cache: history store table insert calls that returned restart */
-#define WT_STAT_DSRC_CACHE_HS_INSERT_RESTART 2076
+#define WT_STAT_DSRC_CACHE_HS_INSERT_RESTART 2078
/*!
* cache: history store table out-of-order resolved updates that lose
* their durable timestamp
*/
-#define WT_STAT_DSRC_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 2077
+#define WT_STAT_DSRC_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 2079
/*!
* cache: history store table out-of-order updates that were fixed up by
* reinserting with the fixed timestamp
*/
-#define WT_STAT_DSRC_CACHE_HS_ORDER_REINSERT 2078
+#define WT_STAT_DSRC_CACHE_HS_ORDER_REINSERT 2080
/*! cache: history store table reads */
-#define WT_STAT_DSRC_CACHE_HS_READ 2079
+#define WT_STAT_DSRC_CACHE_HS_READ 2081
/*! cache: history store table reads missed */
-#define WT_STAT_DSRC_CACHE_HS_READ_MISS 2080
+#define WT_STAT_DSRC_CACHE_HS_READ_MISS 2082
/*! cache: history store table reads requiring squashed modifies */
-#define WT_STAT_DSRC_CACHE_HS_READ_SQUASH 2081
+#define WT_STAT_DSRC_CACHE_HS_READ_SQUASH 2083
/*!
* cache: history store table truncation by rollback to stable to remove
* an unstable update
*/
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 2082
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 2084
/*!
* cache: history store table truncation by rollback to stable to remove
* an update
*/
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS 2083
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS 2085
/*! cache: history store table truncation to remove an update */
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE 2084
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE 2086
/*!
* cache: history store table truncation to remove range of updates due
* to key being removed from the data page during reconciliation
*/
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 2085
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 2087
/*!
* cache: history store table truncation to remove range of updates due
* to out-of-order timestamp update on data page
*/
-#define WT_STAT_DSRC_CACHE_HS_ORDER_REMOVE 2086
+#define WT_STAT_DSRC_CACHE_HS_ORDER_REMOVE 2088
/*! cache: history store table writes requiring squashed modifies */
-#define WT_STAT_DSRC_CACHE_HS_WRITE_SQUASH 2087
+#define WT_STAT_DSRC_CACHE_HS_WRITE_SQUASH 2089
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_DSRC_CACHE_INMEM_SPLITTABLE 2088
+#define WT_STAT_DSRC_CACHE_INMEM_SPLITTABLE 2090
/*! cache: in-memory page splits */
-#define WT_STAT_DSRC_CACHE_INMEM_SPLIT 2089
+#define WT_STAT_DSRC_CACHE_INMEM_SPLIT 2091
/*! cache: internal pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_INTERNAL 2090
+#define WT_STAT_DSRC_CACHE_EVICTION_INTERNAL 2092
/*! cache: internal pages split during eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_INTERNAL 2091
+#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_INTERNAL 2093
/*! cache: leaf pages split during eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_LEAF 2092
+#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_LEAF 2094
+/*!
+ * cache: locate a random in-mem ref by examining all entries on the root
+ * page
+ */
+#define WT_STAT_DSRC_CACHE_EVICTION_RANDOM_SAMPLE_INMEM_ROOT 2095
/*! cache: modified pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_DIRTY 2093
+#define WT_STAT_DSRC_CACHE_EVICTION_DIRTY 2096
/*! cache: overflow pages read into cache */
-#define WT_STAT_DSRC_CACHE_READ_OVERFLOW 2094
+#define WT_STAT_DSRC_CACHE_READ_OVERFLOW 2097
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_DEEPEN 2095
+#define WT_STAT_DSRC_CACHE_EVICTION_DEEPEN 2098
/*! cache: page written requiring history store records */
-#define WT_STAT_DSRC_CACHE_WRITE_HS 2096
+#define WT_STAT_DSRC_CACHE_WRITE_HS 2099
/*! cache: pages read into cache */
-#define WT_STAT_DSRC_CACHE_READ 2097
+#define WT_STAT_DSRC_CACHE_READ 2100
/*! cache: pages read into cache after truncate */
-#define WT_STAT_DSRC_CACHE_READ_DELETED 2098
+#define WT_STAT_DSRC_CACHE_READ_DELETED 2101
/*! cache: pages read into cache after truncate in prepare state */
-#define WT_STAT_DSRC_CACHE_READ_DELETED_PREPARED 2099
+#define WT_STAT_DSRC_CACHE_READ_DELETED_PREPARED 2102
/*! cache: pages requested from the cache */
-#define WT_STAT_DSRC_CACHE_PAGES_REQUESTED 2100
+#define WT_STAT_DSRC_CACHE_PAGES_REQUESTED 2103
/*! cache: pages seen by eviction walk */
-#define WT_STAT_DSRC_CACHE_EVICTION_PAGES_SEEN 2101
+#define WT_STAT_DSRC_CACHE_EVICTION_PAGES_SEEN 2104
/*! cache: pages written from cache */
-#define WT_STAT_DSRC_CACHE_WRITE 2102
+#define WT_STAT_DSRC_CACHE_WRITE 2105
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_DSRC_CACHE_WRITE_RESTORE 2103
+#define WT_STAT_DSRC_CACHE_WRITE_RESTORE 2106
/*! cache: the number of times full update inserted to history store */
-#define WT_STAT_DSRC_CACHE_HS_INSERT_FULL_UPDATE 2104
+#define WT_STAT_DSRC_CACHE_HS_INSERT_FULL_UPDATE 2107
/*! cache: the number of times reverse modify inserted to history store */
-#define WT_STAT_DSRC_CACHE_HS_INSERT_REVERSE_MODIFY 2105
+#define WT_STAT_DSRC_CACHE_HS_INSERT_REVERSE_MODIFY 2108
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_DSRC_CACHE_BYTES_DIRTY 2106
+#define WT_STAT_DSRC_CACHE_BYTES_DIRTY 2109
/*! cache: unmodified pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_CLEAN 2107
+#define WT_STAT_DSRC_CACHE_EVICTION_CLEAN 2110
/*!
* cache_walk: Average difference between current eviction generation
* when the page was last considered, only reported if cache_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_GEN_AVG_GAP 2108
+#define WT_STAT_DSRC_CACHE_STATE_GEN_AVG_GAP 2111
/*!
* cache_walk: Average on-disk page image size seen, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_AVG_WRITTEN_SIZE 2109
+#define WT_STAT_DSRC_CACHE_STATE_AVG_WRITTEN_SIZE 2112
/*!
* cache_walk: Average time in cache for pages that have been visited by
* the eviction server, only reported if cache_walk or all statistics are
* enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_AVG_VISITED_AGE 2110
+#define WT_STAT_DSRC_CACHE_STATE_AVG_VISITED_AGE 2113
/*!
* cache_walk: Average time in cache for pages that have not been visited
* by the eviction server, only reported if cache_walk or all statistics
* are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_AVG_UNVISITED_AGE 2111
+#define WT_STAT_DSRC_CACHE_STATE_AVG_UNVISITED_AGE 2114
/*!
* cache_walk: Clean pages currently in cache, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_PAGES_CLEAN 2112
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_CLEAN 2115
/*!
* cache_walk: Current eviction generation, only reported if cache_walk
* or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_GEN_CURRENT 2113
+#define WT_STAT_DSRC_CACHE_STATE_GEN_CURRENT 2116
/*!
* cache_walk: Dirty pages currently in cache, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_PAGES_DIRTY 2114
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_DIRTY 2117
/*!
* cache_walk: Entries in the root page, only reported if cache_walk or
* all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_ROOT_ENTRIES 2115
+#define WT_STAT_DSRC_CACHE_STATE_ROOT_ENTRIES 2118
/*!
* cache_walk: Internal pages currently in cache, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_PAGES_INTERNAL 2116
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_INTERNAL 2119
/*!
* cache_walk: Leaf pages currently in cache, only reported if cache_walk
* or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_PAGES_LEAF 2117
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_LEAF 2120
/*!
* cache_walk: Maximum difference between current eviction generation
* when the page was last considered, only reported if cache_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_GEN_MAX_GAP 2118
+#define WT_STAT_DSRC_CACHE_STATE_GEN_MAX_GAP 2121
/*!
* cache_walk: Maximum page size seen, only reported if cache_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_MAX_PAGESIZE 2119
+#define WT_STAT_DSRC_CACHE_STATE_MAX_PAGESIZE 2122
/*!
* cache_walk: Minimum on-disk page image size seen, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_MIN_WRITTEN_SIZE 2120
+#define WT_STAT_DSRC_CACHE_STATE_MIN_WRITTEN_SIZE 2123
/*!
* cache_walk: Number of pages never visited by eviction server, only
* reported if cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_UNVISITED_COUNT 2121
+#define WT_STAT_DSRC_CACHE_STATE_UNVISITED_COUNT 2124
/*!
* cache_walk: On-disk page image sizes smaller than a single allocation
* unit, only reported if cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_SMALLER_ALLOC_SIZE 2122
+#define WT_STAT_DSRC_CACHE_STATE_SMALLER_ALLOC_SIZE 2125
/*!
* cache_walk: Pages created in memory and never written, only reported
* if cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_MEMORY 2123
+#define WT_STAT_DSRC_CACHE_STATE_MEMORY 2126
/*!
* cache_walk: Pages currently queued for eviction, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_QUEUED 2124
+#define WT_STAT_DSRC_CACHE_STATE_QUEUED 2127
/*!
* cache_walk: Pages that could not be queued for eviction, only reported
* if cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_NOT_QUEUEABLE 2125
+#define WT_STAT_DSRC_CACHE_STATE_NOT_QUEUEABLE 2128
/*!
* cache_walk: Refs skipped during cache traversal, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_REFS_SKIPPED 2126
+#define WT_STAT_DSRC_CACHE_STATE_REFS_SKIPPED 2129
/*!
* cache_walk: Size of the root page, only reported if cache_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_ROOT_SIZE 2127
+#define WT_STAT_DSRC_CACHE_STATE_ROOT_SIZE 2130
/*!
* cache_walk: Total number of pages currently in cache, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_PAGES 2128
+#define WT_STAT_DSRC_CACHE_STATE_PAGES 2131
/*! checkpoint-cleanup: pages added for eviction */
-#define WT_STAT_DSRC_CC_PAGES_EVICT 2129
+#define WT_STAT_DSRC_CC_PAGES_EVICT 2132
/*! checkpoint-cleanup: pages removed */
-#define WT_STAT_DSRC_CC_PAGES_REMOVED 2130
+#define WT_STAT_DSRC_CC_PAGES_REMOVED 2133
/*! checkpoint-cleanup: pages skipped during tree walk */
-#define WT_STAT_DSRC_CC_PAGES_WALK_SKIPPED 2131
+#define WT_STAT_DSRC_CC_PAGES_WALK_SKIPPED 2134
/*! checkpoint-cleanup: pages visited */
-#define WT_STAT_DSRC_CC_PAGES_VISITED 2132
+#define WT_STAT_DSRC_CC_PAGES_VISITED 2135
/*!
* compression: compressed page maximum internal page size prior to
* compression
*/
-#define WT_STAT_DSRC_COMPRESS_PRECOMP_INTL_MAX_PAGE_SIZE 2133
+#define WT_STAT_DSRC_COMPRESS_PRECOMP_INTL_MAX_PAGE_SIZE 2136
/*!
* compression: compressed page maximum leaf page size prior to
* compression
*/
-#define WT_STAT_DSRC_COMPRESS_PRECOMP_LEAF_MAX_PAGE_SIZE 2134
+#define WT_STAT_DSRC_COMPRESS_PRECOMP_LEAF_MAX_PAGE_SIZE 2137
/*! compression: compressed pages read */
-#define WT_STAT_DSRC_COMPRESS_READ 2135
+#define WT_STAT_DSRC_COMPRESS_READ 2138
/*! compression: compressed pages written */
-#define WT_STAT_DSRC_COMPRESS_WRITE 2136
+#define WT_STAT_DSRC_COMPRESS_WRITE 2139
/*! compression: number of blocks with compress ratio greater than 64 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_MAX 2137
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_MAX 2140
/*! compression: number of blocks with compress ratio smaller than 16 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_16 2138
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_16 2141
/*! compression: number of blocks with compress ratio smaller than 2 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_2 2139
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_2 2142
/*! compression: number of blocks with compress ratio smaller than 32 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_32 2140
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_32 2143
/*! compression: number of blocks with compress ratio smaller than 4 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_4 2141
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_4 2144
/*! compression: number of blocks with compress ratio smaller than 64 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_64 2142
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_64 2145
/*! compression: number of blocks with compress ratio smaller than 8 */
-#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_8 2143
+#define WT_STAT_DSRC_COMPRESS_HIST_RATIO_8 2146
/*! compression: page written failed to compress */
-#define WT_STAT_DSRC_COMPRESS_WRITE_FAIL 2144
+#define WT_STAT_DSRC_COMPRESS_WRITE_FAIL 2147
/*! compression: page written was too small to compress */
-#define WT_STAT_DSRC_COMPRESS_WRITE_TOO_SMALL 2145
+#define WT_STAT_DSRC_COMPRESS_WRITE_TOO_SMALL 2148
+/*! cursor: Total number of deleted pages skipped during tree walk */
+#define WT_STAT_DSRC_CURSOR_TREE_WALK_DEL_PAGE_SKIP 2149
/*! cursor: Total number of entries skipped by cursor next calls */
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_TOTAL 2146
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_TOTAL 2150
/*! cursor: Total number of entries skipped by cursor prev calls */
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_TOTAL 2147
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_TOTAL 2151
/*!
* cursor: Total number of entries skipped to position the history store
* cursor
*/
-#define WT_STAT_DSRC_CURSOR_SKIP_HS_CUR_POSITION 2148
+#define WT_STAT_DSRC_CURSOR_SKIP_HS_CUR_POSITION 2152
+/*!
+ * cursor: Total number of in-memory deleted pages skipped during tree
+ * walk
+ */
+#define WT_STAT_DSRC_CURSOR_TREE_WALK_INMEM_DEL_PAGE_SKIP 2153
/*!
* cursor: Total number of times a search near has exited due to prefix
* config
*/
-#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2149
+#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2154
/*! cursor: bulk loaded cursor insert calls */
-#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2150
+#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2155
/*! cursor: cache cursors reuse count */
-#define WT_STAT_DSRC_CURSOR_REOPEN 2151
+#define WT_STAT_DSRC_CURSOR_REOPEN 2156
/*! cursor: close calls that result in cache */
-#define WT_STAT_DSRC_CURSOR_CACHE 2152
+#define WT_STAT_DSRC_CURSOR_CACHE 2157
/*! cursor: create calls */
-#define WT_STAT_DSRC_CURSOR_CREATE 2153
+#define WT_STAT_DSRC_CURSOR_CREATE 2158
/*!
* cursor: cursor next calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2154
+#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2159
/*!
* cursor: cursor next calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2155
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2160
/*! cursor: cursor next calls that skip less than 100 entries */
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2156
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2161
/*!
* cursor: cursor prev calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2157
+#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2162
/*!
* cursor: cursor prev calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2158
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2163
/*! cursor: cursor prev calls that skip less than 100 entries */
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2159
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2164
/*! cursor: insert calls */
-#define WT_STAT_DSRC_CURSOR_INSERT 2160
+#define WT_STAT_DSRC_CURSOR_INSERT 2165
/*! cursor: insert key and value bytes */
-#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2161
+#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2166
/*! cursor: modify */
-#define WT_STAT_DSRC_CURSOR_MODIFY 2162
+#define WT_STAT_DSRC_CURSOR_MODIFY 2167
/*! cursor: modify key and value bytes affected */
-#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2163
+#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2168
/*! cursor: modify value bytes modified */
-#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2164
+#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2169
/*! cursor: next calls */
-#define WT_STAT_DSRC_CURSOR_NEXT 2165
+#define WT_STAT_DSRC_CURSOR_NEXT 2170
/*! cursor: open cursor count */
-#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2166
+#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2171
/*! cursor: operation restarted */
-#define WT_STAT_DSRC_CURSOR_RESTART 2167
+#define WT_STAT_DSRC_CURSOR_RESTART 2172
/*! cursor: prev calls */
-#define WT_STAT_DSRC_CURSOR_PREV 2168
+#define WT_STAT_DSRC_CURSOR_PREV 2173
/*! cursor: remove calls */
-#define WT_STAT_DSRC_CURSOR_REMOVE 2169
+#define WT_STAT_DSRC_CURSOR_REMOVE 2174
/*! cursor: remove key bytes removed */
-#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2170
+#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2175
/*! cursor: reserve calls */
-#define WT_STAT_DSRC_CURSOR_RESERVE 2171
+#define WT_STAT_DSRC_CURSOR_RESERVE 2176
/*! cursor: reset calls */
-#define WT_STAT_DSRC_CURSOR_RESET 2172
+#define WT_STAT_DSRC_CURSOR_RESET 2177
/*! cursor: search calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH 2173
+#define WT_STAT_DSRC_CURSOR_SEARCH 2178
/*! cursor: search history store calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2174
+#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2179
/*! cursor: search near calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2175
+#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2180
/*! cursor: truncate calls */
-#define WT_STAT_DSRC_CURSOR_TRUNCATE 2176
+#define WT_STAT_DSRC_CURSOR_TRUNCATE 2181
/*! cursor: update calls */
-#define WT_STAT_DSRC_CURSOR_UPDATE 2177
+#define WT_STAT_DSRC_CURSOR_UPDATE 2182
/*! cursor: update key and value bytes */
-#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2178
+#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2183
/*! cursor: update value size change */
-#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2179
+#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2184
/*! reconciliation: approximate byte size of timestamps in pages written */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2180
+#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2185
/*!
* reconciliation: approximate byte size of transaction IDs in pages
* written
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2181
+#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2186
/*! reconciliation: dictionary matches */
-#define WT_STAT_DSRC_REC_DICTIONARY 2182
+#define WT_STAT_DSRC_REC_DICTIONARY 2187
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2183
+#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2188
/*!
* reconciliation: internal page key bytes discarded using suffix
* compression
*/
-#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2184
+#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2189
/*! reconciliation: internal page multi-block writes */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2185
+#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2190
/*! reconciliation: leaf page key bytes discarded using prefix compression */
-#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2186
+#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2191
/*! reconciliation: leaf page multi-block writes */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2187
+#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2192
/*! reconciliation: leaf-page overflow keys */
-#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2188
+#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2193
/*! reconciliation: maximum blocks required for a page */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2189
+#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2194
/*! reconciliation: overflow values written */
-#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2190
+#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2195
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_DSRC_REC_PAGES 2191
+#define WT_STAT_DSRC_REC_PAGES 2196
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_DSRC_REC_PAGES_EVICTION 2192
+#define WT_STAT_DSRC_REC_PAGES_EVICTION 2197
/*! reconciliation: pages deleted */
-#define WT_STAT_DSRC_REC_PAGE_DELETE 2193
+#define WT_STAT_DSRC_REC_PAGE_DELETE 2198
/*!
* reconciliation: pages written including an aggregated newest start
* durable timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2194
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2199
/*!
* reconciliation: pages written including an aggregated newest stop
* durable timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2195
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2200
/*!
* reconciliation: pages written including an aggregated newest stop
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2196
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2201
/*!
* reconciliation: pages written including an aggregated newest stop
* transaction ID
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2197
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2202
/*!
* reconciliation: pages written including an aggregated newest
* transaction ID
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2198
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2203
/*!
* reconciliation: pages written including an aggregated oldest start
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2199
+#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2204
/*! reconciliation: pages written including an aggregated prepare */
-#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2200
+#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2205
/*! reconciliation: pages written including at least one prepare */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2201
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2206
/*!
* reconciliation: pages written including at least one start durable
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2202
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2207
/*! reconciliation: pages written including at least one start timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2203
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2208
/*!
* reconciliation: pages written including at least one start transaction
* ID
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2204
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2209
/*!
* reconciliation: pages written including at least one stop durable
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2205
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2210
/*! reconciliation: pages written including at least one stop timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2206
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2211
/*!
* reconciliation: pages written including at least one stop transaction
* ID
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2207
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2212
/*! reconciliation: records written including a prepare */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2208
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2213
/*! reconciliation: records written including a start durable timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2209
+#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2214
/*! reconciliation: records written including a start timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2210
+#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2215
/*! reconciliation: records written including a start transaction ID */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2211
+#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2216
/*! reconciliation: records written including a stop durable timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2212
+#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2217
/*! reconciliation: records written including a stop timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2213
+#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2218
/*! reconciliation: records written including a stop transaction ID */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2214
+#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2219
/*! session: object compaction */
-#define WT_STAT_DSRC_SESSION_COMPACT 2215
+#define WT_STAT_DSRC_SESSION_COMPACT 2220
/*! session: tiered operations dequeued and processed */
-#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2216
+#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2221
/*! session: tiered operations scheduled */
-#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2217
+#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2222
/*! session: tiered storage local retention time (secs) */
-#define WT_STAT_DSRC_TIERED_RETENTION 2218
+#define WT_STAT_DSRC_TIERED_RETENTION 2223
/*!
* transaction: a reader raced with a prepared transaction commit and
* skipped an update or updates
*/
-#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_COMMIT 2219
+#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_COMMIT 2224
/*! transaction: checkpoint has acquired a snapshot for its transaction */
-#define WT_STAT_DSRC_TXN_CHECKPOINT_SNAPSHOT_ACQUIRED 2220
+#define WT_STAT_DSRC_TXN_CHECKPOINT_SNAPSHOT_ACQUIRED 2225
/*! transaction: race to read prepared update retry */
-#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2221
+#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2226
/*!
* transaction: rollback to stable history store records with stop
* timestamps older than newer records
*/
-#define WT_STAT_DSRC_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 2222
+#define WT_STAT_DSRC_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 2227
/*! transaction: rollback to stable inconsistent checkpoint */
-#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2223
+#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2228
/*! transaction: rollback to stable keys removed */
-#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2224
+#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2229
/*! transaction: rollback to stable keys restored */
-#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2225
+#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2230
/*! transaction: rollback to stable restored tombstones from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2226
+#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2231
/*! transaction: rollback to stable restored updates from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2227
+#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2232
/*! transaction: rollback to stable skipping delete rle */
-#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2228
+#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2233
/*! transaction: rollback to stable skipping stable rle */
-#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2229
+#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2234
/*! transaction: rollback to stable sweeping history store keys */
-#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2230
+#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2235
/*! transaction: rollback to stable updates removed from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2231
+#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2236
/*! transaction: transaction checkpoints due to obsolete pages */
-#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2232
+#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2237
/*! transaction: update conflicts */
-#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2233
+#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2238
/*!
* @}
diff --git a/src/third_party/wiredtiger/src/include/wt_internal.h b/src/third_party/wiredtiger/src/include/wt_internal.h
index 55b3cd42a89..c5d445e1804 100644
--- a/src/third_party/wiredtiger/src/include/wt_internal.h
+++ b/src/third_party/wiredtiger/src/include/wt_internal.h
@@ -291,6 +291,8 @@ struct __wt_page_index;
typedef struct __wt_page_index WT_PAGE_INDEX;
struct __wt_page_modify;
typedef struct __wt_page_modify WT_PAGE_MODIFY;
+struct __wt_page_walk_skip_stats;
+typedef struct __wt_page_walk_skip_stats WT_PAGE_WALK_SKIP_STATS;
struct __wt_process;
typedef struct __wt_process WT_PROCESS;
struct __wt_rec_chunk;
@@ -365,6 +367,8 @@ struct __wt_txn_printlog_args;
typedef struct __wt_txn_printlog_args WT_TXN_PRINTLOG_ARGS;
struct __wt_txn_shared;
typedef struct __wt_txn_shared WT_TXN_SHARED;
+struct __wt_txn_snapshot;
+typedef struct __wt_txn_snapshot WT_TXN_SNAPSHOT;
struct __wt_update;
typedef struct __wt_update WT_UPDATE;
struct __wt_update_value;
diff --git a/src/third_party/wiredtiger/src/log/log_sys.c b/src/third_party/wiredtiger/src/log/log_sys.c
index bb7d4dec077..55b9242bb45 100644
--- a/src/third_party/wiredtiger/src/log/log_sys.c
+++ b/src/third_party/wiredtiger/src/log/log_sys.c
@@ -117,13 +117,11 @@ __wt_verbose_dump_log(WT_SESSION_IMPL *session)
WT_RET(__wt_msg(session, "Logging directory: %s", conn->log_path));
WT_RET(__wt_msg(session, "Logging maximum file size: %" PRId64, (int64_t)conn->log_file_max));
WT_RET(__wt_msg(session, "Log sync setting: %s",
- !FLD_ISSET(conn->txn_logsync, WT_LOG_SYNC_ENABLED) ?
- "none" :
- FLD_ISSET(conn->txn_logsync, WT_LOG_DSYNC) ?
- "dsync" :
- FLD_ISSET(conn->txn_logsync, WT_LOG_FLUSH) ?
- "write to OS" :
- FLD_ISSET(conn->txn_logsync, WT_LOG_FSYNC) ? "fsync to disk" : "unknown sync setting"));
+ !FLD_ISSET(conn->txn_logsync, WT_LOG_SYNC_ENABLED) ? "none" :
+ FLD_ISSET(conn->txn_logsync, WT_LOG_DSYNC) ? "dsync" :
+ FLD_ISSET(conn->txn_logsync, WT_LOG_FLUSH) ? "write to OS" :
+ FLD_ISSET(conn->txn_logsync, WT_LOG_FSYNC) ? "fsync to disk" :
+ "unknown sync setting"));
WT_RET(__wt_msg(session, "Log record allocation alignment: %" PRIu32, log->allocsize));
WT_RET(__wt_msg(session, "Current log file number: %" PRIu32, log->fileid));
WT_RET(__wt_msg(session, "Current log version number: %" PRIu16, log->log_version));
diff --git a/src/third_party/wiredtiger/src/meta/meta_ckpt.c b/src/third_party/wiredtiger/src/meta/meta_ckpt.c
index 7351ea26e58..5e74939045d 100644
--- a/src/third_party/wiredtiger/src/meta/meta_ckpt.c
+++ b/src/third_party/wiredtiger/src/meta/meta_ckpt.c
@@ -1127,7 +1127,9 @@ __wt_ckpt_blkmod_to_meta(WT_SESSION_IMPL *session, WT_ITEM *buf, WT_CKPT *ckpt)
"%s\"%s\"=(id=%" PRIu32 ",granularity=%" PRIu64 ",nbits=%" PRIu64 ",offset=%" PRIu64
"%s,blocks=%.*s)",
i == 0 ? "" : ",", blk->id_str, i, blk->granularity, blk->nbits, blk->offset,
- skip_rename ? "" : F_ISSET(blk, WT_BLOCK_MODS_RENAME) ? ",rename=1" : ",rename=0",
+ skip_rename ? "" :
+ F_ISSET(blk, WT_BLOCK_MODS_RENAME) ? ",rename=1" :
+ ",rename=0",
(int)bitstring.size, (char *)bitstring.data));
/* The hex string length should match the appropriate number of bits. */
WT_ASSERT(session, (blk->nbits >> 2) <= bitstring.size);
@@ -1337,14 +1339,16 @@ __wt_meta_sysinfo_set(WT_SESSION_IMPL *session)
WT_ERR(__wt_buf_fmt(session, buf,
WT_SYSTEM_CKPT_SNAPSHOT_MIN "=%" PRIu64 "," WT_SYSTEM_CKPT_SNAPSHOT_MAX "=%" PRIu64
"," WT_SYSTEM_CKPT_SNAPSHOT_COUNT "=%" PRIu32,
- txn->snap_min, txn->snap_max, txn->snapshot_count));
+ txn->snapshot_data.snap_min, txn->snapshot_data.snap_max, txn->snapshot_data.snapshot_count));
- if (txn->snapshot_count > 0) {
+ if (txn->snapshot_data.snapshot_count > 0) {
WT_ERR(__wt_buf_catfmt(session, buf, "," WT_SYSTEM_CKPT_SNAPSHOT "=["));
- for (snap_count = 0; snap_count < txn->snapshot_count - 1; ++snap_count)
- WT_ERR(__wt_buf_catfmt(session, buf, "%" PRIu64 "%s", txn->snapshot[snap_count], ","));
+ for (snap_count = 0; snap_count < txn->snapshot_data.snapshot_count - 1; ++snap_count)
+ WT_ERR(__wt_buf_catfmt(
+ session, buf, "%" PRIu64 "%s", txn->snapshot_data.snapshot[snap_count], ","));
- WT_ERR(__wt_buf_catfmt(session, buf, "%" PRIu64 "%s", txn->snapshot[snap_count], "]"));
+ WT_ERR(__wt_buf_catfmt(
+ session, buf, "%" PRIu64 "%s", txn->snapshot_data.snapshot[snap_count], "]"));
}
WT_ERR(__wt_metadata_update(session, WT_SYSTEM_CKPT_SNAPSHOT_URI, buf->data));
@@ -1353,7 +1357,7 @@ __wt_meta_sysinfo_set(WT_SESSION_IMPL *session)
" snapshot count: %" PRIu32
", oldest timestamp: %s , meta checkpoint timestamp: %s"
" base write gen: %" PRIu64,
- txn->snap_min, txn->snap_max, txn->snapshot_count,
+ txn->snapshot_data.snap_min, txn->snapshot_data.snap_max, txn->snapshot_data.snapshot_count,
__wt_timestamp_to_string(txn_global->oldest_timestamp, ts_string[0]),
__wt_timestamp_to_string(txn_global->meta_ckpt_timestamp, ts_string[1]),
S2C(session)->base_write_gen);
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_write.c b/src/third_party/wiredtiger/src/reconcile/rec_write.c
index c323f5cb4a0..528a273c981 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_write.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_write.c
@@ -30,17 +30,13 @@ int
__wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref, WT_SALVAGE_COOKIE *salvage, uint32_t flags)
{
WT_BTREE *btree;
- WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
WT_PAGE *page;
bool no_reconcile_set, page_locked;
btree = S2BT(session);
- conn = S2C(session);
page = ref->page;
- session->reconcile_timeline.reconcile_start = __wt_clock(session);
-
__wt_verbose(session, WT_VERB_RECONCILE, "%p reconcile %s (%s%s)", (void *)ref,
__wt_page_type_string(page->type), LF_ISSET(WT_REC_EVICT) ? "evict" : "checkpoint",
LF_ISSET(WT_REC_HS) ? ", history store" : "");
@@ -106,31 +102,6 @@ err:
if (!no_reconcile_set)
F_CLR(session, WT_SESSION_NO_RECONCILE);
- /*
- * Track the longest reconciliation and time spent in each reconciliation stage, ignoring races
- * (it's just a statistic).
- */
- session->reconcile_timeline.reconcile_finish = __wt_clock(session);
- if (WT_CLOCKDIFF_MS(session->reconcile_timeline.hs_wrapup_finish,
- session->reconcile_timeline.hs_wrapup_start) > conn->rec_maximum_hs_wrapup_milliseconds)
- conn->rec_maximum_hs_wrapup_milliseconds =
- WT_CLOCKDIFF_MS(session->reconcile_timeline.hs_wrapup_finish,
- session->reconcile_timeline.hs_wrapup_start);
- if (WT_CLOCKDIFF_MS(session->reconcile_timeline.image_build_finish,
- session->reconcile_timeline.image_build_start) >
- conn->rec_maximum_image_build_milliseconds)
- conn->rec_maximum_image_build_milliseconds =
- WT_CLOCKDIFF_MS(session->reconcile_timeline.image_build_finish,
- session->reconcile_timeline.image_build_start);
- if (WT_CLOCKDIFF_SEC(session->reconcile_timeline.reconcile_finish,
- session->reconcile_timeline.reconcile_start) > conn->rec_maximum_milliseconds)
- conn->rec_maximum_milliseconds =
- WT_CLOCKDIFF_MS(session->reconcile_timeline.reconcile_finish,
- session->reconcile_timeline.reconcile_start);
- if (session->reconcile_timeline.total_reentry_hs_eviction_time >
- conn->cache->reentry_hs_eviction_ms)
- conn->cache->reentry_hs_eviction_ms =
- session->reconcile_timeline.total_reentry_hs_eviction_time;
return (ret);
}
@@ -240,21 +211,30 @@ __reconcile(WT_SESSION_IMPL *session, WT_REF *ref, WT_SALVAGE_COOKIE *salvage, u
bool *page_lockedp)
{
WT_BTREE *btree;
+ WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
WT_PAGE *page;
WT_RECONCILE *r;
+ uint64_t rec_hs_wrapup, rec_img_build, rec, rec_start, rec_finish;
#ifdef HAVE_DIAGNOSTIC
void *addr;
#endif
btree = S2BT(session);
+ conn = S2C(session);
page = ref->page;
+ rec_start = __wt_clock(session);
+ WT_ASSERT(session, rec_start != 0);
+
/* Save the eviction state. */
__reconcile_save_evict_state(session, ref, flags);
- /* Initialize the reconciliation structure for each new run. */
+ /* Initialize the reconciliation structures for each new run. */
WT_RET(__rec_init(session, ref, flags, salvage, &session->reconcile));
+ WT_CLEAR(session->reconcile_timeline);
+ session->reconcile_timeline.reconcile_start = rec_start;
+
r = session->reconcile;
/* Only update if we are in the first entry into eviction. */
@@ -305,8 +285,16 @@ __reconcile(WT_SESSION_IMPL *session, WT_REF *ref, WT_SALVAGE_COOKIE *salvage, u
*/
if (ret == 0 && !(btree->evict_disabled > 0 || !F_ISSET(btree->dhandle, WT_DHANDLE_OPEN)) &&
F_ISSET(r, WT_REC_EVICT) && !WT_PAGE_IS_INTERNAL(r->page) && r->multi_next == 1 &&
- F_ISSET(r, WT_REC_CALL_URGENT) && !r->update_used && r->cache_write_restore)
+ F_ISSET(r, WT_REC_CALL_URGENT) && !r->update_used && r->cache_write_restore) {
+ /*
+ * If eviction didn't make any progress, let application threads know they should refresh
+ * the transaction's snapshot (and try to evict the latest content).
+ */
+ if (F_ISSET(session->txn, WT_TXN_HAS_SNAPSHOT))
+ F_SET(session->txn, WT_TXN_REFRESH_SNAPSHOT);
+
ret = __wt_set_return(session, EBUSY);
+ }
#ifdef HAVE_DIAGNOSTIC
addr = ref->addr;
@@ -354,6 +342,36 @@ __reconcile(WT_SESSION_IMPL *session, WT_REF *ref, WT_SALVAGE_COOKIE *salvage, u
*/
WT_ERR(__wt_page_parent_modify_set(session, ref, true));
+ /*
+ * Track the longest reconciliation and time spent in each reconciliation stage, ignoring races
+ * (it's just a statistic).
+ */
+ rec_finish = __wt_clock(session);
+ session->reconcile_timeline.reconcile_finish = rec_finish;
+
+ rec_hs_wrapup = WT_CLOCKDIFF_MS(
+ session->reconcile_timeline.hs_wrapup_finish, session->reconcile_timeline.hs_wrapup_start);
+ rec_img_build = WT_CLOCKDIFF_MS(session->reconcile_timeline.image_build_finish,
+ session->reconcile_timeline.image_build_start);
+ rec = WT_CLOCKDIFF_MS(rec_finish, rec_start);
+
+ /*
+ * Sanity check timings (WT_DAY is in seconds, and we have milliseconds). FIXME WT-12192
+ * rec_hs_wrapup and rec_img_build should also have an assertion here.
+ */
+ WT_ASSERT(session, rec < WT_DAY * WT_THOUSAND);
+
+ if (rec_hs_wrapup > conn->rec_maximum_hs_wrapup_milliseconds)
+ conn->rec_maximum_hs_wrapup_milliseconds = rec_hs_wrapup;
+ if (rec_img_build > conn->rec_maximum_image_build_milliseconds)
+ conn->rec_maximum_image_build_milliseconds = rec_img_build;
+ if (rec > conn->rec_maximum_milliseconds)
+ conn->rec_maximum_milliseconds = rec;
+ if (session->reconcile_timeline.total_reentry_hs_eviction_time >
+ conn->cache->reentry_hs_eviction_ms)
+ conn->cache->reentry_hs_eviction_ms =
+ session->reconcile_timeline.total_reentry_hs_eviction_time;
+
err:
if (ret != 0)
WT_RET_PANIC(session, ret, "reconciliation failed after building the disk image");
@@ -2323,6 +2341,37 @@ __rec_split_dump_keys(WT_SESSION_IMPL *session, WT_RECONCILE *r)
}
/*
+ * __rec_page_modify_ta_safe_free --
+ * Any thread that is reviewing the page modify time aggregate in a WT_REF, must also be holding
+ * a split generation to ensure that the page index they are using remains valid. Use that same
+ * split generation to ensure that the page modify time aggregate inside the WT_REF remains
+ * valid while it is being reviewed.
+ */
+static void
+__rec_page_modify_ta_safe_free(WT_SESSION_IMPL *session, WT_TIME_AGGREGATE **ta)
+{
+ WT_DECL_RET;
+ uint64_t split_gen;
+ void *p;
+
+ p = *(void **)ta;
+ if (p == NULL)
+ return;
+
+ do {
+ WT_ORDERED_READ(p, *ta);
+ if (p == NULL)
+ break;
+ } while (!__wt_atomic_cas_ptr(ta, p, NULL));
+
+ split_gen = __wt_gen(session, WT_GEN_SPLIT);
+
+ if (__wt_stash_add(session, WT_GEN_SPLIT, split_gen, p, sizeof(WT_TIME_AGGREGATE)) != 0)
+ WT_IGNORE_RET(__wt_panic(session, ret, "fatal error during page modify ta free"));
+ __wt_gen_next(session, WT_GEN_SPLIT, NULL);
+}
+
+/*
* __rec_write_wrapup --
* Finish the reconciliation.
*/
@@ -2332,9 +2381,11 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
WT_BM *bm;
WT_BTREE *btree;
WT_DECL_RET;
+ WT_MULTI *multi;
WT_PAGE_MODIFY *mod;
WT_REF *ref;
- WT_TIME_AGGREGATE ta;
+ WT_TIME_AGGREGATE stop_ta, *stop_tap, ta;
+ uint32_t i;
btree = S2BT(session);
bm = btree->bm;
@@ -2412,6 +2463,14 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
/* Reset the reconciliation state. */
mod->rec_result = 0;
+ /*
+ * When the page is being reconciled as part of the checkpoint operation, the REF is not locked.
+ * Concurrent access to the page can be enabled by safe-releasing the time aggregate
+ * information.
+ */
+ __rec_page_modify_ta_safe_free(session, &mod->stop_ta);
+ WT_TIME_AGGREGATE_INIT_MERGE(&stop_ta);
+
__wt_verbose(session, WT_VERB_RECONCILE, "%p reconciled into %" PRIu32 " pages", (void *)ref,
r->multi_next);
@@ -2464,10 +2523,12 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
r->multi->addr.addr = NULL;
mod->mod_disk_image = r->multi->disk_image;
r->multi->disk_image = NULL;
+ WT_TIME_AGGREGATE_MERGE_OBSOLETE_VISIBLE(session, &stop_ta, &mod->mod_replace.ta);
} else {
__wt_checkpoint_tree_reconcile_update(session, &r->multi->addr.ta);
WT_RET(__rec_write(session, r->wrapup_checkpoint, NULL, NULL, NULL, true,
F_ISSET(r, WT_REC_CHECKPOINT), r->wrapup_checkpoint_compressed));
+ WT_TIME_AGGREGATE_MERGE_OBSOLETE_VISIBLE(session, &stop_ta, &r->multi->addr.ta);
}
mod->rec_result = WT_PM_REC_REPLACE;
@@ -2489,9 +2550,19 @@ split:
r->multi = NULL;
r->multi_next = 0;
+
+ /* Calculate the max stop time point by traversing all multi addresses. */
+ for (multi = mod->mod_multi, i = 0; i < mod->mod_multi_entries; ++multi, ++i)
+ WT_TIME_AGGREGATE_MERGE_OBSOLETE_VISIBLE(session, &stop_ta, &multi->addr.ta);
break;
}
+ if (WT_TIME_AGGREGATE_HAS_STOP(&stop_ta)) {
+ WT_RET(__wt_calloc_one(session, &stop_tap));
+ WT_TIME_AGGREGATE_COPY(stop_tap, &stop_ta);
+ WT_PUBLISH(mod->stop_ta, stop_tap);
+ }
+
return (0);
}
diff --git a/src/third_party/wiredtiger/src/session/session_compact.c b/src/third_party/wiredtiger/src/session/session_compact.c
index 550fefa1e7d..f00ea424fce 100644
--- a/src/third_party/wiredtiger/src/session/session_compact.c
+++ b/src/third_party/wiredtiger/src/session/session_compact.c
@@ -378,6 +378,7 @@ __wt_session_compact(WT_SESSION *wt_session, const char *uri, const char *config
WT_ERR(__wt_config_gets(session, cfg, "timeout", &cval));
session->compact->max_time = (uint64_t)cval.val;
__wt_epoch(session, &session->compact->begin);
+ session->compact->last_progress = session->compact->begin;
/*
* Find the types of data sources being compacted. This could involve opening indexes for a
diff --git a/src/third_party/wiredtiger/src/support/rand.c b/src/third_party/wiredtiger/src/support/rand.c
index 805c227dd24..440719cc715 100644
--- a/src/third_party/wiredtiger/src/support/rand.c
+++ b/src/third_party/wiredtiger/src/support/rand.c
@@ -39,11 +39,17 @@
* result in a stored value of zero, in which case they will be stuck on zero forever. Take a local
* copy of the values to avoid that, and read/write in atomic, 8B chunks.
*/
+#undef M_V
+#define M_V(r) r.v
#undef M_W
#define M_W(r) r.x.w
#undef M_Z
#define M_Z(r) r.x.z
+#define DEFAULT_SEED_W 521288629
+#define DEFAULT_SEED_Z 362436069
+#define WT_LEFT_CIRCULAR_SHIFT32(x, nbits) (((x) << (nbits)) | ((x) >> (32 - (nbits))))
+
/*
* __wt_random_init --
* Initialize return of a 32-bit pseudo-random number.
@@ -53,8 +59,8 @@ __wt_random_init(WT_RAND_STATE volatile *rnd_state) WT_GCC_FUNC_ATTRIBUTE((visib
{
WT_RAND_STATE rnd;
- M_W(rnd) = 521288629;
- M_Z(rnd) = 362436069;
+ M_W(rnd) = DEFAULT_SEED_W;
+ M_Z(rnd) = DEFAULT_SEED_Z;
*rnd_state = rnd;
}
@@ -72,9 +78,44 @@ __wt_random_init_seed(WT_SESSION_IMPL *session, WT_RAND_STATE volatile *rnd_stat
WT_RAND_STATE rnd;
__wt_epoch(session, &ts);
- M_W(rnd) = (uint32_t)(ts.tv_nsec + 521288629);
- M_Z(rnd) = (uint32_t)(ts.tv_nsec + 362436069);
+ /*
+ * Use this, instead of __wt_random_init, to vary the initial state of the RNG. This is
+ * (currently) only used by test programs, where, for example, an initial set of test data is
+ * created by a single thread, and we want more variability in the initial state of the RNG.
+ *
+ * Take the seconds and nanoseconds from the clock together with the thread ID to generate a
+ * 64-bit seed, then smear that value using algorithm "xor" from Marsaglia, "Xorshift RNGs".
+ */
+ M_W(rnd) =
+ (uint32_t)ts.tv_sec ^ (uint32_t)WT_LEFT_CIRCULAR_SHIFT32(ts.tv_nsec, 29) ^ DEFAULT_SEED_W;
+ M_Z(rnd) =
+ (uint32_t)ts.tv_nsec ^ (uint32_t)WT_LEFT_CIRCULAR_SHIFT32(ts.tv_sec, 27) ^ DEFAULT_SEED_Z;
+/*
+ * Some system clocks do not have a high enough resolution between each tick cycle. Perform an extra
+ * xor against the machine's timestamp counter.
+ */
+#ifdef _WIN32
+ rnd.v ^= __wt_rdtsc();
+#endif
+ rnd.v ^= rnd.v << 13;
+ rnd.v ^= rnd.v >> 7;
+ rnd.v ^= rnd.v << 17;
+
+ *rnd_state = rnd;
+}
+
+/*
+ * __wt_random_init_custom_seed --
+ * Initialize the state of a 32-bit pseudo-random number with custom seed.
+ */
+void
+__wt_random_init_custom_seed(WT_RAND_STATE volatile *rnd_state, uint64_t v)
+ WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
+{
+ WT_RAND_STATE rnd;
+
+ M_V(rnd) = v;
*rnd_state = rnd;
}
diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c
index ae03c7e1030..35ceabbab66 100644
--- a/src/third_party/wiredtiger/src/support/stat.c
+++ b/src/third_party/wiredtiger/src/support/stat.c
@@ -32,6 +32,7 @@ static const char *const __stats_dsrc_desc[] = {
"btree: btree compact pages reviewed",
"btree: btree compact pages rewritten",
"btree: btree compact pages skipped",
+ "btree: btree number of pages reconciled during checkpoint",
"btree: btree skipped by compaction as process would not reduce size",
"btree: column-store fixed-size leaf pages",
"btree: column-store fixed-size time windows",
@@ -78,6 +79,7 @@ static const char *const __stats_dsrc_desc[] = {
"cache: eviction walks gave up because they restarted their walk twice",
"cache: eviction walks gave up because they saw too many pages and found no candidates",
"cache: eviction walks gave up because they saw too many pages and found too few candidates",
+ "cache: eviction walks random search fails to locate a page, results in a null position",
"cache: eviction walks reached end of tree",
"cache: eviction walks restarted",
"cache: eviction walks started from root of tree",
@@ -104,6 +106,7 @@ static const char *const __stats_dsrc_desc[] = {
"cache: internal pages evicted",
"cache: internal pages split during eviction",
"cache: leaf pages split during eviction",
+ "cache: locate a random in-mem ref by examining all entries on the root page",
"cache: modified pages evicted",
"cache: overflow pages read into cache",
"cache: page split during eviction deepened the tree",
@@ -159,9 +162,11 @@ static const char *const __stats_dsrc_desc[] = {
"compression: number of blocks with compress ratio smaller than 8",
"compression: page written failed to compress",
"compression: page written was too small to compress",
+ "cursor: Total number of deleted pages skipped during tree walk",
"cursor: Total number of entries skipped by cursor next calls",
"cursor: Total number of entries skipped by cursor prev calls",
"cursor: Total number of entries skipped to position the history store cursor",
+ "cursor: Total number of in-memory deleted pages skipped during tree walk",
"cursor: Total number of times a search near has exited due to prefix config",
"cursor: bulk loaded cursor insert calls",
"cursor: cache cursors reuse count",
@@ -317,6 +322,7 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
/* not clearing btree_compact_pages_reviewed */
/* not clearing btree_compact_pages_rewritten */
/* not clearing btree_compact_pages_skipped */
+ /* not clearing btree_checkpoint_pages_reconciled */
/* not clearing btree_compact_skipped */
stats->btree_column_fix = 0;
stats->btree_column_tws = 0;
@@ -358,6 +364,7 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->cache_eviction_walks_stopped = 0;
stats->cache_eviction_walks_gave_up_no_targets = 0;
stats->cache_eviction_walks_gave_up_ratio = 0;
+ stats->cache_eviction_walk_random_returns_null_position = 0;
stats->cache_eviction_walks_ended = 0;
stats->cache_eviction_walk_restart = 0;
stats->cache_eviction_walk_from_root = 0;
@@ -381,6 +388,7 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->cache_eviction_internal = 0;
stats->cache_eviction_split_internal = 0;
stats->cache_eviction_split_leaf = 0;
+ stats->cache_eviction_random_sample_inmem_root = 0;
stats->cache_eviction_dirty = 0;
stats->cache_read_overflow = 0;
stats->cache_eviction_deepen = 0;
@@ -434,9 +442,11 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->compress_hist_ratio_8 = 0;
stats->compress_write_fail = 0;
stats->compress_write_too_small = 0;
+ stats->cursor_tree_walk_del_page_skip = 0;
stats->cursor_next_skip_total = 0;
stats->cursor_prev_skip_total = 0;
stats->cursor_skip_hs_cur_position = 0;
+ stats->cursor_tree_walk_inmem_del_page_skip = 0;
stats->cursor_search_near_prefix_fast_paths = 0;
stats->cursor_insert_bulk = 0;
stats->cursor_reopen = 0;
@@ -570,6 +580,7 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->btree_compact_pages_reviewed += from->btree_compact_pages_reviewed;
to->btree_compact_pages_rewritten += from->btree_compact_pages_rewritten;
to->btree_compact_pages_skipped += from->btree_compact_pages_skipped;
+ to->btree_checkpoint_pages_reconciled += from->btree_checkpoint_pages_reconciled;
to->btree_compact_skipped += from->btree_compact_skipped;
to->btree_column_fix += from->btree_column_fix;
to->btree_column_tws += from->btree_column_tws;
@@ -622,6 +633,8 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->cache_eviction_walks_stopped += from->cache_eviction_walks_stopped;
to->cache_eviction_walks_gave_up_no_targets += from->cache_eviction_walks_gave_up_no_targets;
to->cache_eviction_walks_gave_up_ratio += from->cache_eviction_walks_gave_up_ratio;
+ to->cache_eviction_walk_random_returns_null_position +=
+ from->cache_eviction_walk_random_returns_null_position;
to->cache_eviction_walks_ended += from->cache_eviction_walks_ended;
to->cache_eviction_walk_restart += from->cache_eviction_walk_restart;
to->cache_eviction_walk_from_root += from->cache_eviction_walk_from_root;
@@ -645,6 +658,7 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->cache_eviction_internal += from->cache_eviction_internal;
to->cache_eviction_split_internal += from->cache_eviction_split_internal;
to->cache_eviction_split_leaf += from->cache_eviction_split_leaf;
+ to->cache_eviction_random_sample_inmem_root += from->cache_eviction_random_sample_inmem_root;
to->cache_eviction_dirty += from->cache_eviction_dirty;
to->cache_read_overflow += from->cache_read_overflow;
to->cache_eviction_deepen += from->cache_eviction_deepen;
@@ -698,9 +712,11 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->compress_hist_ratio_8 += from->compress_hist_ratio_8;
to->compress_write_fail += from->compress_write_fail;
to->compress_write_too_small += from->compress_write_too_small;
+ to->cursor_tree_walk_del_page_skip += from->cursor_tree_walk_del_page_skip;
to->cursor_next_skip_total += from->cursor_next_skip_total;
to->cursor_prev_skip_total += from->cursor_prev_skip_total;
to->cursor_skip_hs_cur_position += from->cursor_skip_hs_cur_position;
+ to->cursor_tree_walk_inmem_del_page_skip += from->cursor_tree_walk_inmem_del_page_skip;
to->cursor_search_near_prefix_fast_paths += from->cursor_search_near_prefix_fast_paths;
to->cursor_insert_bulk += from->cursor_insert_bulk;
to->cursor_reopen += from->cursor_reopen;
@@ -828,6 +844,7 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->btree_compact_pages_reviewed += WT_STAT_READ(from, btree_compact_pages_reviewed);
to->btree_compact_pages_rewritten += WT_STAT_READ(from, btree_compact_pages_rewritten);
to->btree_compact_pages_skipped += WT_STAT_READ(from, btree_compact_pages_skipped);
+ to->btree_checkpoint_pages_reconciled += WT_STAT_READ(from, btree_checkpoint_pages_reconciled);
to->btree_compact_skipped += WT_STAT_READ(from, btree_compact_skipped);
to->btree_column_fix += WT_STAT_READ(from, btree_column_fix);
to->btree_column_tws += WT_STAT_READ(from, btree_column_tws);
@@ -884,6 +901,8 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
WT_STAT_READ(from, cache_eviction_walks_gave_up_no_targets);
to->cache_eviction_walks_gave_up_ratio +=
WT_STAT_READ(from, cache_eviction_walks_gave_up_ratio);
+ to->cache_eviction_walk_random_returns_null_position +=
+ WT_STAT_READ(from, cache_eviction_walk_random_returns_null_position);
to->cache_eviction_walks_ended += WT_STAT_READ(from, cache_eviction_walks_ended);
to->cache_eviction_walk_restart += WT_STAT_READ(from, cache_eviction_walk_restart);
to->cache_eviction_walk_from_root += WT_STAT_READ(from, cache_eviction_walk_from_root);
@@ -910,6 +929,8 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->cache_eviction_internal += WT_STAT_READ(from, cache_eviction_internal);
to->cache_eviction_split_internal += WT_STAT_READ(from, cache_eviction_split_internal);
to->cache_eviction_split_leaf += WT_STAT_READ(from, cache_eviction_split_leaf);
+ to->cache_eviction_random_sample_inmem_root +=
+ WT_STAT_READ(from, cache_eviction_random_sample_inmem_root);
to->cache_eviction_dirty += WT_STAT_READ(from, cache_eviction_dirty);
to->cache_read_overflow += WT_STAT_READ(from, cache_read_overflow);
to->cache_eviction_deepen += WT_STAT_READ(from, cache_eviction_deepen);
@@ -965,9 +986,12 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->compress_hist_ratio_8 += WT_STAT_READ(from, compress_hist_ratio_8);
to->compress_write_fail += WT_STAT_READ(from, compress_write_fail);
to->compress_write_too_small += WT_STAT_READ(from, compress_write_too_small);
+ to->cursor_tree_walk_del_page_skip += WT_STAT_READ(from, cursor_tree_walk_del_page_skip);
to->cursor_next_skip_total += WT_STAT_READ(from, cursor_next_skip_total);
to->cursor_prev_skip_total += WT_STAT_READ(from, cursor_prev_skip_total);
to->cursor_skip_hs_cur_position += WT_STAT_READ(from, cursor_skip_hs_cur_position);
+ to->cursor_tree_walk_inmem_del_page_skip +=
+ WT_STAT_READ(from, cursor_tree_walk_inmem_del_page_skip);
to->cursor_search_near_prefix_fast_paths +=
WT_STAT_READ(from, cursor_search_near_prefix_fast_paths);
to->cursor_insert_bulk += WT_STAT_READ(from, cursor_insert_bulk);
@@ -1150,6 +1174,7 @@ static const char *const __stats_connection_desc[] = {
"running",
"cache: eviction server skips pages that previously failed eviction and likely will again",
"cache: eviction server skips pages that we do not want to evict",
+ "cache: eviction server skips tree that we do not want to evict",
"cache: eviction server skips trees because there are too many active walks",
"cache: eviction server skips trees that are being checkpointed",
"cache: eviction server skips trees that are configured to stick in cache",
@@ -1173,6 +1198,7 @@ static const char *const __stats_connection_desc[] = {
"cache: eviction walks gave up because they restarted their walk twice",
"cache: eviction walks gave up because they saw too many pages and found no candidates",
"cache: eviction walks gave up because they saw too many pages and found too few candidates",
+ "cache: eviction walks random search fails to locate a page, results in a null position",
"cache: eviction walks reached end of tree",
"cache: eviction walks restarted",
"cache: eviction walks started from root of tree",
@@ -1232,6 +1258,7 @@ static const char *const __stats_connection_desc[] = {
"cache: internal pages seen by eviction walk that are already queued",
"cache: internal pages split during eviction",
"cache: leaf pages split during eviction",
+ "cache: locate a random in-mem ref by examining all entries on the root page",
"cache: maximum bytes configured",
"cache: maximum milliseconds spent at a single eviction",
"cache: maximum page size seen at eviction",
@@ -1308,9 +1335,11 @@ static const char *const __stats_connection_desc[] = {
"connection: total fsync I/Os",
"connection: total read I/Os",
"connection: total write I/Os",
+ "cursor: Total number of deleted pages skipped during tree walk",
"cursor: Total number of entries skipped by cursor next calls",
"cursor: Total number of entries skipped by cursor prev calls",
"cursor: Total number of entries skipped to position the history store cursor",
+ "cursor: Total number of in-memory deleted pages skipped during tree walk",
"cursor: Total number of times a search near has exited due to prefix config",
"cursor: bulk cursor count",
"cursor: cached cursor count",
@@ -1528,6 +1557,7 @@ static const char *const __stats_connection_desc[] = {
"thread-state: active filesystem fsync calls",
"thread-state: active filesystem read calls",
"thread-state: active filesystem write calls",
+ "thread-yield: application thread snapshot refreshed for eviction",
"thread-yield: application thread time evicting (usecs)",
"thread-yield: application thread time waiting for cache (usecs)",
"thread-yield: connection close blocked waiting for transaction state stabilization",
@@ -1739,6 +1769,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_server_skip_pages_last_running = 0;
stats->cache_eviction_server_skip_pages_retry = 0;
stats->cache_eviction_server_skip_unwanted_pages = 0;
+ stats->cache_eviction_server_skip_unwanted_tree = 0;
stats->cache_eviction_server_skip_trees_too_many_active_walks = 0;
stats->cache_eviction_server_skip_checkpointing_trees = 0;
stats->cache_eviction_server_skip_trees_stick_in_cache = 0;
@@ -1762,6 +1793,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_walks_stopped = 0;
stats->cache_eviction_walks_gave_up_no_targets = 0;
stats->cache_eviction_walks_gave_up_ratio = 0;
+ stats->cache_eviction_walk_random_returns_null_position = 0;
stats->cache_eviction_walks_ended = 0;
stats->cache_eviction_walk_restart = 0;
stats->cache_eviction_walk_from_root = 0;
@@ -1814,6 +1846,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_internal_pages_already_queued = 0;
stats->cache_eviction_split_internal = 0;
stats->cache_eviction_split_leaf = 0;
+ stats->cache_eviction_random_sample_inmem_root = 0;
/* not clearing cache_bytes_max */
/* not clearing cache_eviction_maximum_milliseconds */
/* not clearing cache_eviction_maximum_page_size */
@@ -1888,9 +1921,11 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->fsync_io = 0;
stats->read_io = 0;
stats->write_io = 0;
+ stats->cursor_tree_walk_del_page_skip = 0;
stats->cursor_next_skip_total = 0;
stats->cursor_prev_skip_total = 0;
stats->cursor_skip_hs_cur_position = 0;
+ stats->cursor_tree_walk_inmem_del_page_skip = 0;
stats->cursor_search_near_prefix_fast_paths = 0;
/* not clearing cursor_bulk_count */
/* not clearing cursor_cached_count */
@@ -2106,6 +2141,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
/* not clearing thread_fsync_active */
/* not clearing thread_read_active */
/* not clearing thread_write_active */
+ stats->application_evict_snapshot_refreshed = 0;
stats->application_evict_time = 0;
stats->application_cache_time = 0;
stats->txn_release_blocked = 0;
@@ -2302,6 +2338,8 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
WT_STAT_READ(from, cache_eviction_server_skip_pages_retry);
to->cache_eviction_server_skip_unwanted_pages +=
WT_STAT_READ(from, cache_eviction_server_skip_unwanted_pages);
+ to->cache_eviction_server_skip_unwanted_tree +=
+ WT_STAT_READ(from, cache_eviction_server_skip_unwanted_tree);
to->cache_eviction_server_skip_trees_too_many_active_walks +=
WT_STAT_READ(from, cache_eviction_server_skip_trees_too_many_active_walks);
to->cache_eviction_server_skip_checkpointing_trees +=
@@ -2336,6 +2374,8 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
WT_STAT_READ(from, cache_eviction_walks_gave_up_no_targets);
to->cache_eviction_walks_gave_up_ratio +=
WT_STAT_READ(from, cache_eviction_walks_gave_up_ratio);
+ to->cache_eviction_walk_random_returns_null_position +=
+ WT_STAT_READ(from, cache_eviction_walk_random_returns_null_position);
to->cache_eviction_walks_ended += WT_STAT_READ(from, cache_eviction_walks_ended);
to->cache_eviction_walk_restart += WT_STAT_READ(from, cache_eviction_walk_restart);
to->cache_eviction_walk_from_root += WT_STAT_READ(from, cache_eviction_walk_from_root);
@@ -2397,6 +2437,8 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
WT_STAT_READ(from, cache_eviction_internal_pages_already_queued);
to->cache_eviction_split_internal += WT_STAT_READ(from, cache_eviction_split_internal);
to->cache_eviction_split_leaf += WT_STAT_READ(from, cache_eviction_split_leaf);
+ to->cache_eviction_random_sample_inmem_root +=
+ WT_STAT_READ(from, cache_eviction_random_sample_inmem_root);
to->cache_bytes_max += WT_STAT_READ(from, cache_bytes_max);
to->cache_eviction_maximum_milliseconds +=
WT_STAT_READ(from, cache_eviction_maximum_milliseconds);
@@ -2482,9 +2524,12 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
to->fsync_io += WT_STAT_READ(from, fsync_io);
to->read_io += WT_STAT_READ(from, read_io);
to->write_io += WT_STAT_READ(from, write_io);
+ to->cursor_tree_walk_del_page_skip += WT_STAT_READ(from, cursor_tree_walk_del_page_skip);
to->cursor_next_skip_total += WT_STAT_READ(from, cursor_next_skip_total);
to->cursor_prev_skip_total += WT_STAT_READ(from, cursor_prev_skip_total);
to->cursor_skip_hs_cur_position += WT_STAT_READ(from, cursor_skip_hs_cur_position);
+ to->cursor_tree_walk_inmem_del_page_skip +=
+ WT_STAT_READ(from, cursor_tree_walk_inmem_del_page_skip);
to->cursor_search_near_prefix_fast_paths +=
WT_STAT_READ(from, cursor_search_near_prefix_fast_paths);
to->cursor_bulk_count += WT_STAT_READ(from, cursor_bulk_count);
@@ -2713,6 +2758,8 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
to->thread_fsync_active += WT_STAT_READ(from, thread_fsync_active);
to->thread_read_active += WT_STAT_READ(from, thread_read_active);
to->thread_write_active += WT_STAT_READ(from, thread_write_active);
+ to->application_evict_snapshot_refreshed +=
+ WT_STAT_READ(from, application_evict_snapshot_refreshed);
to->application_evict_time += WT_STAT_READ(from, application_evict_time);
to->application_cache_time += WT_STAT_READ(from, application_cache_time);
to->txn_release_blocked += WT_STAT_READ(from, txn_release_blocked);
diff --git a/src/third_party/wiredtiger/src/txn/txn.c b/src/third_party/wiredtiger/src/txn/txn.c
index 5277ea4b299..397548b8e92 100644
--- a/src/third_party/wiredtiger/src/txn/txn.c
+++ b/src/third_party/wiredtiger/src/txn/txn.c
@@ -99,14 +99,15 @@ __txn_sort_snapshot(WT_SESSION_IMPL *session, uint32_t n, uint64_t snap_max)
txn = session->txn;
if (n > 1)
- __snapsort(txn->snapshot, n);
+ __snapsort(txn->snapshot_data.snapshot, n);
- txn->snapshot_count = n;
- txn->snap_max = snap_max;
- txn->snap_min =
- (n > 0 && WT_TXNID_LE(txn->snapshot[0], snap_max)) ? txn->snapshot[0] : snap_max;
+ txn->snapshot_data.snapshot_count = n;
+ txn->snapshot_data.snap_max = snap_max;
+ txn->snapshot_data.snap_min = (n > 0 && WT_TXNID_LE(txn->snapshot_data.snapshot[0], snap_max)) ?
+ txn->snapshot_data.snapshot[0] :
+ snap_max;
F_SET(txn, WT_TXN_HAS_SNAPSHOT);
- WT_ASSERT(session, n == 0 || txn->snap_min != WT_TXN_NONE);
+ WT_ASSERT(session, n == 0 || txn->snapshot_data.snap_min != WT_TXN_NONE);
}
/*
@@ -129,6 +130,7 @@ __wt_txn_release_snapshot(WT_SESSION_IMPL *session)
!__wt_txn_visible_all(session, txn_shared->pinned_id, WT_TS_NONE));
txn_shared->metadata_pinned = txn_shared->pinned_id = WT_TXN_NONE;
+ F_CLR(txn, WT_TXN_REFRESH_SNAPSHOT);
F_CLR(txn, WT_TXN_HAS_SNAPSHOT);
/* Clear a checkpoint's pinned ID and timestamp. */
@@ -227,7 +229,7 @@ __txn_get_snapshot_int(WT_SESSION_IMPL *session, bool publish)
*/
if ((id = txn_global->checkpoint_txn_shared.id) != WT_TXN_NONE) {
if (txn->id != id)
- txn->snapshot[n++] = id;
+ txn->snapshot_data.snapshot[n++] = id;
if (publish)
txn_shared->metadata_pinned = id;
}
@@ -275,7 +277,7 @@ __txn_get_snapshot_int(WT_SESSION_IMPL *session, bool publish)
*/
WT_READ_BARRIER();
if (id == s->id) {
- txn->snapshot[n++] = id;
+ txn->snapshot_data.snapshot[n++] = id;
if (WT_TXNID_LT(id, pinned_id))
pinned_id = id;
break;
@@ -318,6 +320,71 @@ __wt_txn_bump_snapshot(WT_SESSION_IMPL *session)
}
/*
+ * __wt_txn_snapshot_save_and_refresh --
+ * Save the existing snapshot and allocate a new snapshot.
+ */
+int
+__wt_txn_snapshot_save_and_refresh(WT_SESSION_IMPL *session)
+{
+ WT_DECL_RET;
+ WT_TXN *txn;
+
+ txn = session->txn;
+
+ WT_RET(__wt_calloc_def(session, sizeof(WT_TXN_SNAPSHOT), &txn->backup_snapshot_data));
+
+ txn->backup_snapshot_data->snap_max = txn->snapshot_data.snap_max;
+ txn->backup_snapshot_data->snap_min = txn->snapshot_data.snap_min;
+ txn->backup_snapshot_data->snapshot_count = txn->snapshot_data.snapshot_count;
+
+ WT_ERR(__wt_calloc_def(session, sizeof(uint64_t) * S2C(session)->session_size,
+ &txn->backup_snapshot_data->snapshot));
+
+ /* Swap the snapshot pointers. */
+ __txn_swap_snapshot(&txn->snapshot_data.snapshot, &txn->backup_snapshot_data->snapshot);
+
+ /*
+ * __txn_get_snapshot_int will return without getting the new snapshot if the transaction
+ * already has a snapshot so clear the flag WT_TXN_HAS_SNAPSHOT.
+ */
+ F_CLR(txn, WT_TXN_HAS_SNAPSHOT);
+
+ /* Get the snapshot without publishing the shared ids. */
+ __wt_txn_bump_snapshot(session);
+
+err:
+ /* Free the backup_snapshot_data if the memory allocation of the underlying snapshot has failed.
+ */
+ if (ret != 0)
+ __wt_free(session, txn->backup_snapshot_data);
+
+ return (ret);
+}
+
+/*
+ * __wt_txn_snapshot_release_and_restore --
+ * Switch back to the original snapshot.
+ */
+void
+__wt_txn_snapshot_release_and_restore(WT_SESSION_IMPL *session)
+{
+ WT_TXN *txn;
+ WT_TXN_SNAPSHOT *snapshot_backup;
+
+ txn = session->txn;
+ snapshot_backup = txn->backup_snapshot_data;
+
+ txn->snapshot_data.snap_max = snapshot_backup->snap_max;
+ txn->snapshot_data.snap_min = snapshot_backup->snap_min;
+ txn->snapshot_data.snapshot_count = snapshot_backup->snapshot_count;
+
+ /* Swap the snapshot pointers. */
+ __txn_swap_snapshot(&snapshot_backup->snapshot, &txn->snapshot_data.snapshot);
+ __wt_free(session, snapshot_backup->snapshot);
+ __wt_free(session, snapshot_backup);
+}
+
+/*
* __txn_oldest_scan --
* Sweep the running transactions to calculate the oldest ID required.
*/
@@ -492,7 +559,8 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, uint32_t flags)
oldest_session != NULL) {
__wt_verbose(session, WT_VERB_TRANSACTION,
"old snapshot %" PRIu64 " pinned in session %" PRIu32 " [%s] with snap_min %" PRIu64,
- oldest_id, oldest_session->id, oldest_session->lastop, oldest_session->txn->snap_min);
+ oldest_id, oldest_session->id, oldest_session->lastop,
+ oldest_session->txn->snapshot_data.snap_min);
}
}
@@ -554,10 +622,9 @@ __wt_txn_config(WT_SESSION_IMPL *session, const char *cfg[])
WT_ERR(__wt_config_gets_def(session, cfg, "isolation", 0, &cval));
if (cval.len != 0)
- txn->isolation = WT_STRING_MATCH("snapshot", cval.str, cval.len) ?
- WT_ISO_SNAPSHOT :
- WT_STRING_MATCH("read-committed", cval.str, cval.len) ? WT_ISO_READ_COMMITTED :
- WT_ISO_READ_UNCOMMITTED;
+ txn->isolation = WT_STRING_MATCH("snapshot", cval.str, cval.len) ? WT_ISO_SNAPSHOT :
+ WT_STRING_MATCH("read-committed", cval.str, cval.len) ? WT_ISO_READ_COMMITTED :
+ WT_ISO_READ_UNCOMMITTED;
WT_ERR(__txn_config_operation_timeout(session, cfg, false));
@@ -634,7 +701,7 @@ __wt_txn_reconfigure(WT_SESSION_IMPL *session, const char *config)
ret = __wt_config_getones(session, config, "isolation", &cval);
if (ret == 0 && cval.len != 0) {
session->isolation = txn->isolation = WT_STRING_MATCH("snapshot", cval.str, cval.len) ?
- WT_ISO_SNAPSHOT :
+ WT_ISO_SNAPSHOT :
WT_STRING_MATCH("read-uncommitted", cval.str, cval.len) ? WT_ISO_READ_UNCOMMITTED :
WT_ISO_READ_COMMITTED;
}
@@ -2164,9 +2231,10 @@ __wt_txn_init(WT_SESSION_IMPL *session, WT_SESSION_IMPL *session_ret)
/* Allocate the WT_TXN structure, including a variable length array of snapshot information. */
WT_RET(__wt_calloc(session, 1,
- sizeof(WT_TXN) + sizeof(txn->snapshot[0]) * S2C(session)->session_size, &session_ret->txn));
+ sizeof(WT_TXN) + sizeof(txn->snapshot_data.snapshot[0]) * S2C(session)->session_size,
+ &session_ret->txn));
txn = session_ret->txn;
- txn->snapshot = txn->__snapshot;
+ txn->snapshot_data.snapshot = txn->__snapshot;
txn->id = WT_TXN_NONE;
WT_ASSERT(session,
@@ -2530,7 +2598,8 @@ __wt_verbose_dump_txn_one(
", full checkpoint: %s"
", rollback reason: %s"
", flags: 0x%08" PRIx32 ", isolation: %s",
- txn->id, txn->mod_count, txn->snap_min, txn->snap_max, txn->snapshot_count,
+ txn->id, txn->mod_count, txn->snapshot_data.snap_min, txn->snapshot_data.snap_max,
+ txn->snapshot_data.snapshot_count,
__wt_timestamp_to_string(txn->commit_timestamp, ts_string[0]),
__wt_timestamp_to_string(txn->durable_timestamp, ts_string[1]),
__wt_timestamp_to_string(txn->first_commit_timestamp, ts_string[2]),
diff --git a/src/third_party/wiredtiger/src/txn/txn_ckpt.c b/src/third_party/wiredtiger/src/txn/txn_ckpt.c
index e97283bb930..59042dd7086 100644
--- a/src/third_party/wiredtiger/src/txn/txn_ckpt.c
+++ b/src/third_party/wiredtiger/src/txn/txn_ckpt.c
@@ -550,7 +550,7 @@ __checkpoint_prepare(WT_SESSION_IMPL *session, bool *trackingp, const char *cfg[
tsp.tv_sec = 0;
tsp.tv_nsec = WT_MILLION;
__checkpoint_timing_stress(session, WT_TIMING_STRESS_PREPARE_CHECKPOINT_DELAY, &tsp);
- original_snap_min = session->txn->snap_min;
+ original_snap_min = session->txn->snapshot_data.snap_min;
WT_DIAGNOSTIC_YIELD;
@@ -584,7 +584,7 @@ __checkpoint_prepare(WT_SESSION_IMPL *session, bool *trackingp, const char *cfg[
*/
__wt_writelock(session, &txn_global->rwlock);
txn_global->checkpoint_txn_shared = *txn_shared;
- txn_global->checkpoint_txn_shared.pinned_id = txn->snap_min;
+ txn_global->checkpoint_txn_shared.pinned_id = txn->snapshot_data.snap_min;
/*
* Sanity check that the oldest ID hasn't moved on before we have cleared our entry.
@@ -666,7 +666,7 @@ __checkpoint_prepare(WT_SESSION_IMPL *session, bool *trackingp, const char *cfg[
__wt_txn_bump_snapshot(session);
/* Assert that our snapshot min didn't somehow move backwards. */
- WT_ASSERT(session, session->txn->snap_min >= original_snap_min);
+ WT_ASSERT(session, session->txn->snapshot_data.snap_min >= original_snap_min);
/* Flag as unused for non diagnostic builds. */
WT_UNUSED(original_snap_min);
@@ -674,8 +674,8 @@ __checkpoint_prepare(WT_SESSION_IMPL *session, bool *trackingp, const char *cfg[
WT_ASSERT(session,
conn->ckpt_reserved_session == NULL ||
!__wt_txn_visible_id_snapshot(txn_global->checkpoint_reserved_txn_id,
- session->txn->snap_min, session->txn->snap_max, session->txn->snapshot,
- session->txn->snapshot_count));
+ session->txn->snapshot_data.snap_min, session->txn->snapshot_data.snap_max,
+ session->txn->snapshot_data.snapshot, session->txn->snapshot_data.snapshot_count));
if (use_timestamp)
__wt_verbose_timestamp(
diff --git a/src/third_party/wiredtiger/src/txn/txn_log.c b/src/third_party/wiredtiger/src/txn/txn_log.c
index ece95dce5b7..95ec5dc899c 100644
--- a/src/third_party/wiredtiger/src/txn/txn_log.c
+++ b/src/third_party/wiredtiger/src/txn/txn_log.c
@@ -497,15 +497,15 @@ __wt_txn_checkpoint_log(WT_SESSION_IMPL *session, bool full, uint32_t flags, WT_
break;
case WT_TXN_LOG_CKPT_START:
/* Take a copy of the transaction snapshot. */
- txn->ckpt_nsnapshot = txn->snapshot_count;
+ txn->ckpt_nsnapshot = txn->snapshot_data.snapshot_count;
recsize = (size_t)txn->ckpt_nsnapshot * WT_INTPACK64_MAXSIZE;
WT_ERR(__wt_scr_alloc(session, recsize, &txn->ckpt_snapshot));
end = p = txn->ckpt_snapshot->mem;
/* There many not be any snapshot entries. */
if (end != NULL) {
end += recsize;
- for (i = 0; i < txn->snapshot_count; i++)
- WT_ERR(__wt_vpack_uint(&p, WT_PTRDIFF(end, p), txn->snapshot[i]));
+ for (i = 0; i < txn->snapshot_data.snapshot_count; i++)
+ WT_ERR(__wt_vpack_uint(&p, WT_PTRDIFF(end, p), txn->snapshot_data.snapshot[i]));
}
break;
case WT_TXN_LOG_CKPT_STOP:
diff --git a/src/third_party/wiredtiger/src/txn/txn_recover.c b/src/third_party/wiredtiger/src/txn/txn_recover.c
index 30e17ada3c0..7d379e136f8 100644
--- a/src/third_party/wiredtiger/src/txn/txn_recover.c
+++ b/src/third_party/wiredtiger/src/txn/txn_recover.c
@@ -104,14 +104,16 @@ __recovery_cursor(
/*
* Helper to a cursor if this operation is to be applied during recovery.
*/
-#define GET_RECOVERY_CURSOR(session, r, lsnp, fileid, cp) \
- ret = __recovery_cursor(session, r, lsnp, fileid, false, cp); \
- __wt_verbose(session, WT_VERB_RECOVERY, \
- "%s op %" PRIu32 " to file %" PRIu32 " at LSN %" PRIu32 "/%" PRIu32, \
- ret != 0 ? "Error" : cursor == NULL ? "Skipping" : "Applying", optype, fileid, \
- (lsnp)->l.file, (lsnp)->l.offset); \
- WT_ERR(ret); \
- if (cursor == NULL) \
+#define GET_RECOVERY_CURSOR(session, r, lsnp, fileid, cp) \
+ ret = __recovery_cursor(session, r, lsnp, fileid, false, cp); \
+ __wt_verbose(session, WT_VERB_RECOVERY, \
+ "%s op %" PRIu32 " to file %" PRIu32 " at LSN %" PRIu32 "/%" PRIu32, \
+ ret != 0 ? "Error" : \
+ cursor == NULL ? "Skipping" : \
+ "Applying", \
+ optype, fileid, (lsnp)->l.file, (lsnp)->l.offset); \
+ WT_ERR(ret); \
+ if (cursor == NULL) \
break
/*
diff --git a/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c b/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c
index 698cccf79e9..9f275d85ac0 100644
--- a/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c
+++ b/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c
@@ -1360,10 +1360,10 @@ __rollback_to_stable_btree_walk(WT_SESSION_IMPL *session, wt_timestamp_t rollbac
WT_READ_NO_EVICT | WT_READ_WONT_NEED | WT_READ_VISIBLE_ALL)) == 0 &&
ref != NULL) {
__rollback_progress_msg(session, rollback_timer, 0, 0, &rollback_msg_count, true);
- if (F_ISSET(ref, WT_REF_FLAG_INTERNAL))
+ if (F_ISSET(ref, WT_REF_FLAG_INTERNAL)) {
WT_WITH_PAGE_INDEX(
session, ret = __rollback_abort_fast_truncate(session, ref, rollback_timestamp));
- else
+ } else
WT_RET(__rollback_abort_updates(session, ref, rollback_timestamp));
}
diff --git a/src/third_party/wiredtiger/src/utilities/util_dump.c b/src/third_party/wiredtiger/src/utilities/util_dump.c
index d1d5de1fcf6..5be4a742239 100755
--- a/src/third_party/wiredtiger/src/utilities/util_dump.c
+++ b/src/third_party/wiredtiger/src/utilities/util_dump.c
@@ -620,7 +620,10 @@ dump_prefix(WT_SESSION *session, bool pretty, bool hex, bool json)
if (!json &&
(fprintf(fp, "WiredTiger Dump (WiredTiger Version %d.%d.%d)\n", vmajor, vminor, vpatch) < 0 ||
- fprintf(fp, "Format=%s\n", (pretty && hex) ? "print hex" : hex ? "hex" : "print") < 0 ||
+ fprintf(fp, "Format=%s\n",
+ (pretty && hex) ? "print hex" :
+ hex ? "hex" :
+ "print") < 0 ||
fprintf(fp, "Header\n") < 0))
return (util_err(session, EIO, NULL));
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/thread_manager.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/thread_manager.h
index 0fce6bfeb45..1c4957e814b 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/thread_manager.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/thread_manager.h
@@ -43,7 +43,7 @@ class thread_manager {
*/
template <typename Callable, typename... Args>
void
- add_thread(Callable &&fct, Args &&... args)
+ add_thread(Callable &&fct, Args &&...args)
{
std::thread *t = new std::thread(fct, std::forward<Args>(args)...);
_workers.push_back(t);
diff --git a/src/third_party/wiredtiger/test/evergreen.yml b/src/third_party/wiredtiger/test/evergreen.yml
index fcfcfa2430a..96e56c150e0 100755
--- a/src/third_party/wiredtiger/test/evergreen.yml
+++ b/src/third_party/wiredtiger/test/evergreen.yml
@@ -33,7 +33,27 @@ functions:
command: git.get_project
params:
directory: wiredtiger
- "fetch artifacts" :
+ "generate github token": &gen_github_token
+ command: github.generate_token
+ params:
+ owner: wiredtiger
+ repo: automation-scripts
+ expansion_name: generated_token
+ permissions:
+ metadata: read
+ contents: read
+ "get automation-scripts": &get_automation_scripts
+ command: shell.exec
+ type: setup
+ params:
+ shell: bash
+ script: |
+ set -o errexit
+ set -o verbose
+ if ! [ -d "./automation-scripts" ]; then
+ git clone https://x-access-token:${generated_token}@github.com/wiredtiger/automation-scripts.git
+ fi
+ "fetch artifacts":
command: s3.get
params:
aws_key: ${aws_key}
@@ -101,15 +121,14 @@ functions:
# Fetch the gperftools library.
if [[ "${posix_configure_flags|}" =~ (tcmalloc|TCMALLOC) ]]; then
is_cmake_build=true
- git clone git@github.com:wiredtiger/automation-scripts.git
- . automation-scripts/evergreen/find_gperftools.sh ${s3_access_key} ${s3_secret_key} ${build_variant} $is_cmake_build
+ . ../automation-scripts/evergreen/find_gperftools.sh ${s3_access_key} ${s3_secret_key} ${build_variant} $is_cmake_build
fi
set -o errexit
set -o verbose
MACOS_PYTHON_FLAGS=
- if [ "${build_variant|}" = "macos-1014" ]; then
+ if [ "${build_variant|}" = "macos-11" ]; then
# For mac builds, we want explicitly tell cmake which python to use, as
# well as the matching library directory and header files. The find_libpython
# module gives us the library.
@@ -197,6 +216,8 @@ functions:
${compile_env_vars|} ${make_command|ninja} ${smp_command|} 2>&1
fi
"compile wiredtiger":
+ - *gen_github_token
+ - *get_automation_scripts
- *configure_wiredtiger
- *make_wiredtiger
"compile wiredtiger no linux ftruncate":
@@ -242,7 +263,7 @@ functions:
if [ -d cmake_build ]; then rm -r cmake_build; fi
mkdir -p cmake_build
cd cmake_build
- $CMAKE -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake -DCMAKE_C_FLAGS="-ggdb" -DWITH_PIC=1 \
+ $CMAKE -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake -DCMAKE_C_FLAGS="-ggdb" -DWITH_PIC=1 \
-DHAVE_DIAGNOSTIC=1 ${NON_BARRIER_DIAGNOSTIC_YIELDS|} -DENABLE_STRICT=1 \
-DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1 ${configure_python_setting|} \
-G "${cmake_generator|Ninja}" ../.
@@ -337,7 +358,7 @@ functions:
exit 0
fi
- git clone git@github.com:wiredtiger/wiredtiger.github.com.git
+ git clone https://github.com/wiredtiger/wiredtiger.github.com.git
cd wiredtiger.github.com
# Branches to update are defined through an expansion variable.
@@ -682,6 +703,8 @@ functions:
file: ./wiredtiger/cmake_build/${test_path}.json
"upload-perf-test-stats":
+ - *gen_github_token
+ - *get_automation_scripts
- command: shell.exec
params:
working_dir: "wiredtiger/cmake_build/bench/wtperf"
@@ -692,10 +715,7 @@ functions:
${virtualenv_binary} -p ${python_binary} venv
source venv/bin/activate
${pip3_binary} install pymongo[srv]==3.12.2
- if [[ ! -d "automation-scripts" ]]; then
- git clone git@github.com:wiredtiger/automation-scripts.git
- fi
- ${python_binary} automation-scripts/evergreen/upload_stats_atlas.py -u ${atlas_perf_test_username} -p ${atlas_perf_test_password} -f test_stats/atlas_out_${perf-test-name}.json -t ${created_at}
+ ${python_binary} ../automation-scripts/evergreen/upload_stats_atlas.py -u ${atlas_perf_test_username} -p ${atlas_perf_test_password} -f test_stats/atlas_out_${perf-test-name}.json -t ${created_at}
- command: perf.send
params:
file: ./wiredtiger/cmake_build/bench/wtperf/test_stats/evergreen_out_${perf-test-name}.json
@@ -801,7 +821,8 @@ variables:
- func: "get project"
- func: "compile wiredtiger"
vars:
- posix_configure_flags: -DENABLE_STRICT=1 -DHAVE_DIAGNOSTIC=1 -DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1
+ posix_configure_flags:
+ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake -DENABLE_STRICT=1 -DHAVE_DIAGNOSTIC=1 -DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1
- func: "recovery stress test script"
vars:
times: 25
@@ -2040,6 +2061,8 @@ tasks:
- name: configure-combinations
commands:
- func: "get project"
+ - func: "generate github token"
+ - func: "get automation-scripts"
- command: shell.exec
params:
working_dir: "wiredtiger"
@@ -2351,6 +2374,8 @@ tasks:
- name: long-test
commands:
- func: "get project"
+ - func: "generate github token"
+ - func: "get automation-scripts"
- func: "configure wiredtiger"
vars:
posix_configure_flags:
@@ -2733,7 +2758,7 @@ tasks:
- func: "compile wiredtiger"
vars:
posix_configure_flags:
- -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake
+ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake
-DCMAKE_C_FLAGS="-ggdb"
-DENABLE_PYTHON=1
-DWITH_PIC=1
@@ -2751,7 +2776,10 @@ tasks:
exec_timeout_secs: 9000
commands:
- func: "get project"
- - func: "compile wiredtiger with builtins"
+ - func: "compile wiredtiger"
+ vars:
+ # FIXME-WT-13690: Enable ZSTD compression once failure has been resolved.
+ posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake -DENABLE_STRICT=1 -DHAVE_DIAGNOSTIC=1 -DNON_BARRIER_DIAGNOSTIC_YIELDS=1 -DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1 -DHAVE_BUILTIN_EXTENSION_ZSTD=0
- func: "format test script"
vars:
#run for 2 hours ( 2 * 60 = 120 minutes), use default config
@@ -2765,7 +2793,7 @@ tasks:
- func: "get project"
- func: "compile wiredtiger"
vars:
- posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake -DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1
+ posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake -DHAVE_BUILTIN_EXTENSION_LZ4=1 -DHAVE_BUILTIN_EXTENSION_SNAPPY=1 -DHAVE_BUILTIN_EXTENSION_ZLIB=1
- func: "format test script"
vars:
#run for 2 hours ( 2 * 60 = 120 minutes), use default config
@@ -4218,10 +4246,10 @@ buildvariants:
- name: ".unit_test"
- name: fops
-- name: macos-1014
- display_name: "OS X 10.14"
+- name: macos-11
+ display_name: "OS X 11"
run_on:
- - macos-1014
+ - macos-11
batchtime: 120 # 2 hours
expansions:
posix_configure_flags:
@@ -4232,7 +4260,7 @@ buildvariants:
-DENABLE_ZLIB=1
-DENABLE_STRICT=1
-DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
- python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
+ python_binary: '/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11'
smp_command: -j $(sysctl -n hw.logicalcpu)
cmake_generator: "Unix Makefiles"
make_command: make
@@ -4274,15 +4302,15 @@ buildvariants:
- name: big-endian
display_name: "~ Big-endian (s390x/zSeries)"
run_on:
- - ubuntu1804-zseries-build
+ - rhel8-zseries-small
batchtime: 4320 # 3 days
expansions:
- python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
+ python_binary: '/opt/mongodbtoolchain/v4/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
- configure_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH
- compile_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ configure_env_vars: PATH=/opt/mongodbtoolchain/v4/bin:$PATH
+ compile_env_vars: PATH=/opt/mongodbtoolchain/v4/bin:$PATH
test_env_vars:
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ PATH=/opt/mongodbtoolchain/v4/bin:$PATH
WT_TOPDIR=$(git rev-parse --show-toplevel)
WT_BUILDDIR=$WT_TOPDIR/cmake_build
LD_LIBRARY_PATH=$WT_BUILDDIR
@@ -4297,7 +4325,7 @@ buildvariants:
- name: rhel8-ppc
display_name: "~ RHEL8 PPC"
run_on:
- - rhel81-power8-small
+ - rhel8-power-small
batchtime: 120 # 2 hours
expansions:
format_test_setting: ulimit -c unlimited
@@ -4333,17 +4361,17 @@ buildvariants:
- name: rhel8-zseries
display_name: "~ RHEL8 zSeries"
run_on:
- - rhel80-zseries-test
+ - rhel8-zseries-small
batchtime: 120 # 2 hours
expansions:
- configure_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH
- compile_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ configure_env_vars: PATH=/opt/mongodbtoolchain/v4/bin:$PATH
+ compile_env_vars: PATH=/opt/mongodbtoolchain/v4/bin:$PATH
test_env_vars:
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ PATH=/opt/mongodbtoolchain/v4/bin:$PATH
WT_BUILDDIR=$(git rev-parse --show-toplevel)/cmake_build
LD_LIBRARY_PATH=$WT_BUILDDIR
posix_configure_flags:
- -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake
+ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v4_gcc.cmake
-DCMAKE_C_FLAGS="-ggdb"
-DHAVE_DIAGNOSTIC=1
-DENABLE_PYTHON=1
@@ -4351,7 +4379,7 @@ buildvariants:
-DENABLE_SNAPPY=1
-DENABLE_STRICT=1
-DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
- python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
+ python_binary: '/opt/mongodbtoolchain/v4/bin/python3'
# Use half number of vCPU to avoid OOM kill failure
smp_command: -j $(echo $(grep -c ^processor /proc/cpuinfo) / 2 | bc)
cmake_generator: Ninja
diff --git a/src/third_party/wiredtiger/test/multiversion/wt_multiversion.sh b/src/third_party/wiredtiger/test/multiversion/wt_multiversion.sh
index f3528b5d24e..61d2c49809f 100644
--- a/src/third_party/wiredtiger/test/multiversion/wt_multiversion.sh
+++ b/src/third_party/wiredtiger/test/multiversion/wt_multiversion.sh
@@ -5,7 +5,7 @@ last_stable_dir=wiredtiger_${last_stable}/
last_stable_branch=mongodb-${last_stable}
function setup_last_stable {
- git clone git@github.com:wiredtiger/wiredtiger.git ${last_stable_dir}
+ git clone https://github.com/wiredtiger/wiredtiger.git ${last_stable_dir}
cd ${last_stable_dir}/build_posix/ || exit
git checkout $last_stable_branch || exit 1
bash reconf
diff --git a/src/third_party/wiredtiger/test/packing/intpack-test3.c b/src/third_party/wiredtiger/test/packing/intpack-test3.c
index 4c168f8a83e..6e6ceec158e 100644
--- a/src/third_party/wiredtiger/test/packing/intpack-test3.c
+++ b/src/third_party/wiredtiger/test/packing/intpack-test3.c
@@ -72,7 +72,7 @@ test_value(int64_t val)
", got %" WT_SIZET_FMT "\n",
sinput, used_len,
cp > p ? used_len + (size_t)(cp - p) : /* More than buf used */
- used_len - (size_t)(p - cp)); /* Less than buf used */
+ used_len - (size_t)(p - cp)); /* Less than buf used */
abort();
}
diff --git a/src/third_party/wiredtiger/test/suite/test_app_thread_evict01.py b/src/third_party/wiredtiger/test/suite/test_app_thread_evict01.py
new file mode 100644
index 00000000000..cf0c573bf49
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_app_thread_evict01.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-present MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import wiredtiger, wttest
+from wtscenario import make_scenarios
+
+# test_app_thread_evict01.py
+# Test to trigger application threads to perform eviction.
+class test_app_thread_evict01(wttest.WiredTigerTestCase):
+ uri = "table:test_app_thread_evict001"
+ format_values = [
+ ('row_integer', dict(key_format='i', value_format='S')),
+ ]
+
+ # 100MB cache, 52MB trigger, 50MB target
+ conn_config = "cache_size=100MB,statistics=(all),statistics_log=(wait=1,json=true,on_close=true)," \
+ "eviction=(threads_max=1)," \
+ "eviction_updates_trigger=52,eviction_dirty_trigger=52,eviction_trigger=52," \
+ "eviction_updates_target=50,eviction_dirty_target=50,eviction_target=50,"
+
+ scenarios = make_scenarios(format_values)
+
+ def get_stat(self, stat):
+ stat_cursor = self.session.open_cursor('statistics:')
+ val = stat_cursor[stat][2]
+ stat_cursor.close()
+ return val
+
+ def test_app_thread_evict01(self):
+ format='key_format={},value_format={}'.format(self.key_format, self.value_format)
+ self.session.create(self.uri, format)
+
+ # For our target stat to be incremented we need our application thread to evict a page, but
+ # this is probabilistic as the application thread is always racing against the internal
+ # eviction threads. Give the application thread a few chances to beat the internal thread
+ for _ in range(0, 20):
+ # Insert 40MB of data and perform lots of small inserts so we'll have a lot of
+ # pages to evict. We are below target levels so no eviction takes place
+ cursor = self.session.open_cursor(self.uri)
+ for i in range(40 * 1024):
+ cursor[i+1] = 'a' * 1024
+
+ # Perform two large updates. The first causes us to exceed trigger levels,
+ # and on the second insert the app thread is pulled into eviction since
+ # trigger levels are exceeded.
+ self.session.begin_transaction()
+ cursor[100001] = 'a' * 20 * 1024 * 1024
+ cursor[100002] = 'a' * 20 * 1024 * 1024
+ self.session.commit_transaction()
+
+ num_app_evict_snapshot_refreshed = self.get_stat(wiredtiger.stat.conn.application_evict_snapshot_refreshed)
+ cursor.close()
+
+ if num_app_evict_snapshot_refreshed > 0:
+ break
+
+ self.assertGreater(self.get_stat(wiredtiger.stat.conn.application_evict_snapshot_refreshed), 0)
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/src/third_party/wiredtiger/test/suite/test_checkpoint32.py b/src/third_party/wiredtiger/test/suite/test_checkpoint32.py
new file mode 100644
index 00000000000..a8cd84bb5da
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_checkpoint32.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-present MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import threading, time
+import wttest
+import wiredtiger
+from wtdataset import SimpleDataSet
+from wtscenario import make_scenarios
+from wiredtiger import stat
+
+# test_checkpoint32.py
+#
+# Test that skipping in-memory reconciled deleted pages as part of the tree walk.
+class test_checkpoint32(wttest.WiredTigerTestCase):
+
+ format_values = [
+ # FLCS doesn't support skipping pages based on aggregated time.
+ ('column', dict(key_format='r', value_format='S', extraconfig='')),
+ ('string_row', dict(key_format='S', value_format='S', extraconfig='')),
+ ]
+
+ scenarios = make_scenarios(format_values)
+
+ def conn_config(self):
+ return 'statistics=(all)'
+
+ def check(self, ds, nrows, value):
+ cursor = self.session.open_cursor(ds.uri)
+ count = 0
+ for k, v in cursor:
+ self.assertEqual(v, value)
+ count += 1
+ self.assertEqual(count, nrows)
+ cursor.close()
+
+ def test_checkpoint(self):
+ uri = 'table:checkpoint32'
+ nrows = 1000
+
+ # Create a table.
+ ds = SimpleDataSet(
+ self, uri, 0, key_format=self.key_format, value_format=self.value_format,
+ config=self.extraconfig)
+ ds.populate()
+
+ value_a = "aaaaa" * 100
+
+ # Write some initial data.
+ cursor = self.session.open_cursor(ds.uri, None, None)
+ for i in range(1, nrows + 1):
+ self.session.begin_transaction()
+ cursor[ds.key(i)] = value_a
+ self.session.commit_transaction()
+
+ # Create a reader transaction that will not be able to see what happens next.
+ # We don't need to do anything with this; it just needs to exist.
+ session2 = self.conn.open_session()
+ session2.begin_transaction()
+
+ # Now remove all data.
+ for i in range(1, nrows + 1):
+ self.session.begin_transaction()
+ cursor.set_key(ds.key(i))
+ self.assertEqual(cursor.remove(), 0)
+ self.session.commit_transaction()
+
+ # Checkpoint.
+ self.session.checkpoint()
+
+ # Get the existing in-memory delete page skip statistic value.
+ stat_cursor = self.session.open_cursor('statistics:', None, None)
+ prev_cur_inmem_del_page_skip = stat_cursor[stat.conn.cursor_tree_walk_inmem_del_page_skip][2]
+ stat_cursor.close()
+
+ # Now read the removed data.
+ self.check(ds, 0, value_a)
+
+ # Get the new in-memory delete page skip statistic value.
+ stat_cursor = self.session.open_cursor('statistics:', None, None)
+ cur_inmem_del_page_skip = stat_cursor[stat.conn.cursor_tree_walk_inmem_del_page_skip][2]
+ stat_cursor.close()
+
+ self.assertGreater(cur_inmem_del_page_skip, prev_cur_inmem_del_page_skip)
+
+ # Tidy up.
+ session2.rollback_transaction()
+ session2.close()
+ cursor.close()
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/src/third_party/wiredtiger/test/suite/test_cursor_random03.py b/src/third_party/wiredtiger/test/suite/test_cursor_random03.py
new file mode 100644
index 00000000000..4d8696f63ea
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_cursor_random03.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-present MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import wttest
+from wtdataset import SimpleDataSet
+
+# test_cursor_random03.py
+# This python test reproduces the WT-12225 bug where the same stream of numbers are generated
+# from the random cursor. In the presence of where all the values are the insert list, open up
+# two cursors close to each other in time, and both cursors will return back the exact same stream
+# of records again. The test makes sure that records returned in both cursors return at least
+# one record that is different, ensuring that the stream of numbers returned from __wt_random
+# are not in the same pattern.
+class test_cursor_random03(wttest.WiredTigerTestCase):
+ def test_cursor_random_bug(self):
+ uri = 'table:random'
+
+ # Do not change the chosen number of records. The records is to make sure that
+ # the skip insert list random estimate is a power of 2 to act as a mask.
+ # Also set the leaf-page-max value, otherwise the page might split.
+ ds = SimpleDataSet(self, uri, 2135, config='leaf_page_max=100MB')
+ ds.populate()
+
+ for _ in range(0, 5000):
+ random_keys = []
+
+ cursor = self.session.open_cursor(uri, None, 'next_random=true')
+
+ # Perform 100 nexts and append to our random keys.
+ for _ in range(0, 100):
+ self.assertEqual(cursor.next(), 0)
+ current = cursor.get_key()
+ random_keys.append(current)
+ cursor.close()
+
+ # The random cursor initial seed is time based, reset the initial random seed again
+ # to make sure that we have not generated with the same random numbers
+ cursor = self.session.open_cursor(uri, None, 'next_random=true')
+ found_different = False
+ for i in range(0, 100):
+ self.assertEqual(cursor.next(), 0)
+ current = cursor.get_key()
+ # Exit early once we found a key that is different.
+ if (random_keys[i] != current):
+ found_different = True
+ break
+ cursor.close()
+
+ # We expect that the values between two recently opened cursors return different stream
+ # of records.
+ self.assertTrue(found_different)
+
diff --git a/src/third_party/wiredtiger/test/suite/test_scrub_eviction_prepare.py b/src/third_party/wiredtiger/test/suite/test_scrub_eviction_prepare.py
new file mode 100644
index 00000000000..92eabcc4a37
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_scrub_eviction_prepare.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-present MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import wiredtiger, wttest
+from wiredtiger import stat, WiredTigerError
+
+# test_scrub_eviction_prepare.py
+#
+# Test to do the following steps.
+# 1. Prepare an update with one key (key-2)
+# 2. Commit an update with another key(key-1)
+# 3, Make sure both the keys are on the same page.
+# 4. Set the key to full update and evict the page with release_evict
+# 5. Read the page back in memory
+# 6. Checkpoint
+# 7. Repeat steps 5,6 and validate that the page read back into memory should
+# not be reconciled everytime with the help of btree stat.
+class test_scrub_eviction_prepare(wttest.WiredTigerTestCase):
+
+ def conn_config(self):
+ config = 'cache_size=100MB,statistics=(all),statistics_log=(json,on_close,wait=1)'
+ return config
+
+ def get_stats(self, uri):
+ stat_cursor = self.session.open_cursor('statistics:' + uri)
+ btree_ckpt_pages_rec = stat_cursor[stat.dsrc.btree_checkpoint_pages_reconciled][2]
+ stat_cursor.close()
+ return btree_ckpt_pages_rec
+
+ def read_key(self, uri):
+ cur2 = self.session.open_cursor(uri)
+ cur2.set_key(2)
+ self.assertEqual(cur2.search(), 0)
+ cur2.close()
+
+ def test_scrub_eviction_prepare(self):
+ uri = 'table:test_scrub_eviction_prepare'
+
+ # Create a table.
+ self.session.create(uri, 'key_format=i,value_format=S')
+ session2 = self.conn.open_session()
+ session3 = self.conn.open_session()
+ cursor2 = session2.open_cursor(uri)
+
+ # Insert a key 2 and commit the transaction.
+ session2.begin_transaction()
+ cursor2[2] = '20'
+ session2.commit_transaction()
+
+ # Insert a key 1 and prepare the transaction.
+ session3.begin_transaction()
+ cursor2[1] = '10'
+ session3.prepare_transaction('prepare_timestamp=10')
+
+ # Leaving a cursor open after updates can affect the release_evict cursor's
+ # behavior. It might not guarantee eviction because the open cursor pins the
+ # page in the cache. Therefore, always close the cursor explicitly before using.
+ cursor2.close()
+
+ # Set the key to 2(to avoid prepare conflict if the key is set to 1) in the evict
+ # cursor and evict the page which has both the keys 1 and 2.
+ evict_cursor = self.session.open_cursor(uri, None, "debug=(release_evict)")
+ evict_cursor.set_key(2)
+ self.assertEqual(evict_cursor.search(), 0)
+ self.assertEqual(evict_cursor.reset(), 0)
+ evict_cursor.close()
+
+ self.session.checkpoint()
+ self.assertEqual(1, self.get_stats(uri))
+
+ # Read the key 2 to avoid prepared conflict, this will bring back the page
+ # that has both the keys 1 & 2 into the memory.
+ self.read_key(uri)
+ self.session.checkpoint()
+ # The page with prepared update should not be reconciled again.
+ self.assertEqual(1, self.get_stats(uri))
+
+ # Read the key 2 to avoid prepared conflict, this will bring back the page
+ # that has both the keys 1 & 2 into the memory.
+ self.read_key(uri)
+ self.session.checkpoint()
+ # The page with prepared update should not be reconciled again.
+ self.assertEqual(1, self.get_stats(uri))
+
+if __name__ == '__main__':
+ wttest.run()