diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
| commit | 959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch) | |
| tree | acc8d60aedb12b70048e676e8a7349deb0010db8 /src/third_party/wiredtiger | |
| parent | 76588293975fc059cf076779e4283e6ffaf8afff (diff) | |
New upstream version 6.0.20upstream
Diffstat (limited to 'src/third_party/wiredtiger')
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{ 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{ 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{ 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{ 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{ 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{ 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{ - * 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{ 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{ 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{ 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() |
