summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Chen <luke.chen@mongodb.com>2021-10-19 16:54:52 +1100
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-19 06:15:05 +0000
commit546487a45ad9cf22b3e03f71e1d640beeb8e988c (patch)
treed7f2b7d87646fbf1aaa65ba829d67b1fa4c9a68f
parente7aaf52d138c60e6b9fb7a3566c48469c4bfd3dc (diff)
downloadmongo-546487a45ad9cf22b3e03f71e1d640beeb8e988c.tar.gz
Import wiredtiger: c45301668c5fd6856fffe99a1ed766e23977c517 from branch mongodb-4.4
ref: e8bf2e5fcb..c45301668c for: 4.4.11 WT-5009 Migrate remaining wiredtiger-perf-lsm tests to Evergreen WT-5743 Rewrite cells when the transaction ids are cleared for VLCS WT-5939 Fix naming conflict resulting in "cannot remove directory" error in test_config06 (OSX only) WT-6077 Add new stats to track compact progress WT-7250 Fix the test to perform explicit eviction instead of relying on low cache size WT-7494 Add Python test to trigger update restore eviction during recovery WT-7885 Ensure WiredTiger testing uses tcmalloc where possible WT-8026 Run PPC/zSeries/macOS mainline builds less frequently in Evergreen WT-8067 Fix the code that ensures to insert the newest history store value as full update WT-8116 Fix issues related to inheritance in the cpp testing framework WT-8147 Detect invalid syntax in cppsuite configs WT-8168 Fix unused variables in search near cpp tests WT-8199 Make s_all accept Python PEP8 compliant line breaks WT-8203 Fix the layering violation in accessing the page WT-8204 Fix possible race condition in "wt7989_compact_checkpoint" CSuite test WT-8214 Only publish the docs from the WiredTiger develop Evergreen project WT-8225 Fix data race in zstd get context WT-8226 Fix largest_key failed to consider prepared update
-rw-r--r--src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/perf_stat_collection.py2
-rw-r--r--src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/wtperf_run.py21
-rw-r--r--src/third_party/wiredtiger/cmake/configs/auto.cmake1
-rw-r--r--src/third_party/wiredtiger/dist/s_string.ok3
-rwxr-xr-xsrc/third_party/wiredtiger/dist/s_whitespace1
-rw-r--r--src/third_party/wiredtiger/dist/stat_data.py12
-rw-r--r--src/third_party/wiredtiger/ext/compressors/zstd/zstd_compress.c5
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/block/block_compact.c13
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_compact.c14
-rw-r--r--src/third_party/wiredtiger/src/cursor/cur_std.c15
-rw-r--r--src/third_party/wiredtiger/src/docs/cursor-ops.dox6
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_page.c20
-rw-r--r--src/third_party/wiredtiger/src/history/hs_rec.c76
-rw-r--r--src/third_party/wiredtiger/src/include/stat.h14
-rw-r--r--src/third_party/wiredtiger/src/include/txn_inline.h21
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in1093
-rw-r--r--src/third_party/wiredtiger/src/os_common/os_alloc.c10
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_col.c15
-rw-r--r--src/third_party/wiredtiger/src/session/session_compact.c13
-rw-r--r--src/third_party/wiredtiger/src/support/stat.c50
-rw-r--r--src/third_party/wiredtiger/src/txn/txn.c17
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/Makefile.am1
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.cxx7
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.h2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/core/component.h2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.cxx17
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.h4
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.cxx6
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.h12
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/test.cxx8
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/test.h19
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/timestamp_manager.h3
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.cxx46
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.h56
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_types.h6
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_model.h2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.cxx2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.h2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload/thread_context.cxx6
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload/workload_tracking.h3
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/test_harness/workload_generator.h4
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/tests/csuite_style_example_test.cxx10
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/tests/example_test.cxx2
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/tests/hs_cleanup.cxx9
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/tests/search_near_01.cxx6
-rw-r--r--src/third_party/wiredtiger/test/cppsuite/tests/search_near_02.cxx13
-rw-r--r--src/third_party/wiredtiger/test/csuite/wt7989_compact_checkpoint/main.c17
-rwxr-xr-xsrc/third_party/wiredtiger/test/evergreen.yml370
-rw-r--r--src/third_party/wiredtiger/test/suite/test_cursor17.py41
-rw-r--r--src/third_party/wiredtiger/test/suite/test_hs28.py86
-rwxr-xr-xsrc/third_party/wiredtiger/test/suite/test_rollback_to_stable01.py12
-rwxr-xr-xsrc/third_party/wiredtiger/test/suite/test_rollback_to_stable10.py23
-rwxr-xr-xsrc/third_party/wiredtiger/test/suite/test_rollback_to_stable14.py46
-rw-r--r--src/third_party/wiredtiger/test/suite/test_rollback_to_stable21.py5
-rwxr-xr-xsrc/third_party/wiredtiger/test/suite/test_rollback_to_stable28.py149
-rwxr-xr-xsrc/third_party/wiredtiger/test/suite/wttest.py7
57 files changed, 1625 insertions, 803 deletions
diff --git a/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/perf_stat_collection.py b/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/perf_stat_collection.py
index d2784901311..b26c66a020b 100644
--- a/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/perf_stat_collection.py
+++ b/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/perf_stat_collection.py
@@ -1,6 +1,7 @@
import re
from perf_stat import PerfStat
+
def find_stat(test_stat_path: str, pattern: str, position_of_value: int):
for line in open(test_stat_path):
match = re.match(pattern, line)
@@ -8,6 +9,7 @@ def find_stat(test_stat_path: str, pattern: str, position_of_value: int):
return float(line.split()[position_of_value])
return 0
+
class PerfStatCollection:
def __init__(self):
self.perf_stats = {}
diff --git a/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/wtperf_run.py b/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/wtperf_run.py
index fcd9e8d0cb8..fb1b1f18d6c 100644
--- a/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/wtperf_run.py
+++ b/src/third_party/wiredtiger/bench/wtperf/wtperf_run_py/wtperf_run.py
@@ -11,18 +11,19 @@ from wtperf_config import WTPerfConfig
from perf_stat import PerfStat
from perf_stat_collection import PerfStatCollection
-# example parameters: -p /Users/jeremy.thorp/Git/wiredtiger/build/bench/wtperf/wtperf -t ../runners/small-lsm.wtperf -v -ho WT_TEST -m 3
-
# the 'test.stat' file is where wt-perf.c writes out it's statistics
# (within the directory specified by the 'home' parameter)
test_stats_file = 'test.stat'
+
def create_test_home_path(home: str, test_run: int):
return '{}_{}'.format(home, test_run)
+
def create_test_stat_path(test_home_path: str):
return os.path.join(test_home_path, test_stats_file)
+
def find_stat(test_stat_path: str, pattern: str, position_of_value: int):
for line in open(test_stat_path):
match = re.match(pattern, line)
@@ -30,6 +31,7 @@ def find_stat(test_stat_path: str, pattern: str, position_of_value: int):
return line.split()[position_of_value]
return 0
+
def construct_wtperf_command_line(wtperf: str, env: str, test: str, home: str):
command_line = []
if env is not None:
@@ -43,6 +45,7 @@ def construct_wtperf_command_line(wtperf: str, env: str, test: str, home: str):
command_line.append(home)
return command_line
+
def run_test(config: WTPerfConfig, test_run: int):
test_home = create_test_home_path(home=config.home_dir, test_run=test_run)
command_line = construct_wtperf_command_line(
@@ -53,6 +56,7 @@ def run_test(config: WTPerfConfig, test_run: int):
# print('Command Line for test: {}'.format(command_line))
subprocess.run(command_line)
+
def process_results(config: WTPerfConfig, perf_stats: PerfStatCollection):
for test_run in range(config.run_max):
test_home = create_test_home_path(home=config.home_dir, test_run=test_run)
@@ -72,6 +76,7 @@ def process_results(config: WTPerfConfig, perf_stats: PerfStatCollection):
}
return as_dict
+
def setup_perf_stats():
perf_stats = PerfStatCollection()
perf_stats.add_stat(PerfStat(short_label="load",
@@ -81,27 +86,28 @@ def setup_perf_stats():
output_precision=2,
conversion_function=float))
perf_stats.add_stat(PerfStat(short_label="insert",
- pattern='Executed \d+ insert operations',
+ pattern=r'Executed \d+ insert operations',
input_offset=1,
output_label='Insert count:'))
perf_stats.add_stat(PerfStat(short_label="modify",
- pattern='Executed \d+ modify operations',
+ pattern=r'Executed \d+ modify operations',
input_offset=1,
output_label='Modify count:'))
perf_stats.add_stat(PerfStat(short_label="read",
- pattern='Executed \d+ read operations',
+ pattern=r'Executed \d+ read operations',
input_offset=1,
output_label='Read count:'))
perf_stats.add_stat(PerfStat(short_label="truncate",
- pattern='Executed \d+ truncate operations',
+ pattern=r'Executed \d+ truncate operations',
input_offset=1,
output_label='Truncate count:'))
perf_stats.add_stat(PerfStat(short_label="update",
- pattern='Executed \d+ update operations',
+ pattern=r'Executed \d+ update operations',
input_offset=1,
output_label='Update count:'))
return perf_stats
+
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--wtperf', help='path of the wtperf executable')
@@ -163,5 +169,6 @@ def main():
with open(args.outfile, 'w') as outfile:
json.dump(perf_dict, outfile, indent=4, sort_keys=True)
+
if __name__ == '__main__':
main()
diff --git a/src/third_party/wiredtiger/cmake/configs/auto.cmake b/src/third_party/wiredtiger/cmake/configs/auto.cmake
index 3691da331a8..5b59949c4c7 100644
--- a/src/third_party/wiredtiger/cmake/configs/auto.cmake
+++ b/src/third_party/wiredtiger/cmake/configs/auto.cmake
@@ -282,6 +282,7 @@ config_lib(
HAVE_LIBTCMALLOC
"tcmalloc library exists."
LIB "tcmalloc"
+ HEADER "gperftools/tcmalloc.h"
)
config_compile(
diff --git a/src/third_party/wiredtiger/dist/s_string.ok b/src/third_party/wiredtiger/dist/s_string.ok
index 6c0cc16592c..b355d29c901 100644
--- a/src/third_party/wiredtiger/dist/s_string.ok
+++ b/src/third_party/wiredtiger/dist/s_string.ok
@@ -68,6 +68,7 @@ CMake
CONCAT
CONFIG
COVERITY
+CPP
CPUs
CRC
CSV
@@ -482,6 +483,7 @@ WithSeeds
Wpedantic
WriteFile
Wsign
+Wundef
Wuninitialized
Wunused
XP
@@ -647,6 +649,7 @@ copyin
copyout
countp
cp
+cplusplus
cpuid
crc
create's
diff --git a/src/third_party/wiredtiger/dist/s_whitespace b/src/third_party/wiredtiger/dist/s_whitespace
index 67f7da480f4..1e4b36563a0 100755
--- a/src/third_party/wiredtiger/dist/s_whitespace
+++ b/src/third_party/wiredtiger/dist/s_whitespace
@@ -21,7 +21,6 @@ find bench dist examples ext src test \
-name '*.[ch]' -o \
-name '*.dox' -o \
-name '*.in' -o \
- -name '*.py' -o \
-name 's_*' -o \
-name 'Makefile.am' |
sed -e '/Makefile.in/d' \
diff --git a/src/third_party/wiredtiger/dist/stat_data.py b/src/third_party/wiredtiger/dist/stat_data.py
index 362712d5de7..72cbbb3d470 100644
--- a/src/third_party/wiredtiger/dist/stat_data.py
+++ b/src/third_party/wiredtiger/dist/stat_data.py
@@ -488,7 +488,11 @@ conn_stats = [
SessionOpStat('session_table_alter_success', 'table alter successful calls', 'no_clear,no_scale'),
SessionOpStat('session_table_alter_trigger_checkpoint', 'table alter triggering checkpoint calls', 'no_clear,no_scale'),
SessionOpStat('session_table_compact_fail', 'table compact failed calls', 'no_clear,no_scale'),
+ SessionOpStat('session_table_compact_fail_cache_pressure', 'table compact failed calls due to cache pressure', 'no_clear,no_scale'),
+ SessionOpStat('session_table_compact_running', 'table compact running', 'no_clear,no_scale'),
+ SessionOpStat('session_table_compact_skipped', 'table compact skipped as process would not reduce file size', 'no_clear,no_scale'),
SessionOpStat('session_table_compact_success', 'table compact successful calls', 'no_clear,no_scale'),
+ SessionOpStat('session_table_compact_timeout', 'table compact timeout', 'no_clear,no_scale'),
SessionOpStat('session_table_create_fail', 'table create failed calls', 'no_clear,no_scale'),
SessionOpStat('session_table_create_success', 'table create successful calls', 'no_clear,no_scale'),
SessionOpStat('session_table_drop_fail', 'table drop failed calls', 'no_clear,no_scale'),
@@ -630,7 +634,11 @@ dsrc_stats = [
BtreeStat('btree_column_internal', 'column-store internal pages', 'no_scale,tree_walk'),
BtreeStat('btree_column_rle', 'column-store variable-size RLE encoded values', 'no_scale,tree_walk'),
BtreeStat('btree_column_variable', 'column-store variable-size leaf pages', 'no_scale,tree_walk'),
- BtreeStat('btree_compact_rewrite', 'pages rewritten by compaction'),
+ BtreeStat('btree_compact_pages_reviewed', 'btree compact pages reviewed', 'no_clear,no_scale'),
+ BtreeStat('btree_compact_pages_skipped', 'btree compact pages skipped', 'no_clear,no_scale'),
+ BtreeStat('btree_compact_pages_write_selected', 'btree compact pages selected to be rewritten', 'no_clear,no_scale'),
+ BtreeStat('btree_compact_pages_rewritten', 'pages rewritten by compaction'),
+ BtreeStat('btree_compact_skipped', 'btree skipped by compaction as process would not reduce size'),
BtreeStat('btree_entries', 'number of key/value pairs', 'no_scale,tree_walk'),
BtreeStat('btree_fixed_len', 'fixed-record size', 'max_aggregate,no_scale,size'),
BtreeStat('btree_maximum_depth', 'maximum tree depth', 'max_aggregate,no_scale'),
@@ -792,7 +800,9 @@ conn_dsrc_stats = [
CacheStat('cache_eviction_walks_gave_up_ratio', 'eviction walks gave up because they saw too many pages and found too few candidates'),
CacheStat('cache_eviction_walks_stopped', 'eviction walks gave up because they restarted their walk twice'),
CacheStat('cache_hs_insert', 'history store table insert calls'),
+ CacheStat('cache_hs_insert_full_update', 'the number of times full update inserted to history store'),
CacheStat('cache_hs_insert_restart', 'history store table insert calls that returned restart'),
+ CacheStat('cache_hs_insert_reverse_modify', 'the number of times reverse modify inserted to history store'),
CacheStat('cache_hs_key_truncate', 'history store table truncation to remove an update'),
CacheStat('cache_hs_key_truncate_onpage_removal', 'history store table truncation to remove range of updates due to key being removed from the data page during reconciliation'),
CacheStat('cache_hs_order_remove', 'history store table truncation to remove range of updates due to out-of-order timestamp update on data page'),
diff --git a/src/third_party/wiredtiger/ext/compressors/zstd/zstd_compress.c b/src/third_party/wiredtiger/ext/compressors/zstd/zstd_compress.c
index e1725142982..e67bea35367 100644
--- a/src/third_party/wiredtiger/ext/compressors/zstd/zstd_compress.c
+++ b/src/third_party/wiredtiger/ext/compressors/zstd/zstd_compress.c
@@ -136,6 +136,11 @@ zstd_get_context(
return;
wt_api->spin_lock(wt_api, session, &(ctx_pool->list_lock));
+ if (ctx_pool->free_ctx_list == NULL) {
+ wt_api->spin_unlock(wt_api, session, &(ctx_pool->list_lock));
+ return;
+ }
+
*contextp = ctx_pool->free_ctx_list;
ctx_pool->free_ctx_list = (*contextp)->next;
wt_api->spin_unlock(wt_api, session, &(ctx_pool->list_lock));
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data
index 34b33ccf645..ceff7ad6652 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-4.4",
- "commit": "e8bf2e5fcb33197b73c7bb550742926f59e22218"
+ "commit": "c45301668c5fd6856fffe99a1ed766e23977c517"
}
diff --git a/src/third_party/wiredtiger/src/block/block_compact.c b/src/third_party/wiredtiger/src/block/block_compact.c
index 6d7e87edbee..51614c4aae7 100644
--- a/src/third_party/wiredtiger/src/block/block_compact.c
+++ b/src/third_party/wiredtiger/src/block/block_compact.c
@@ -165,14 +165,11 @@ __wt_block_compact_page_skip(
}
__wt_spin_unlock(session, &block->live_lock);
- if (WT_VERBOSE_ISSET(session, WT_VERB_COMPACT) ||
- WT_VERBOSE_ISSET(session, WT_VERB_COMPACT_PROGRESS)) {
- ++block->compact_pages_reviewed;
- if (*skipp)
- ++block->compact_pages_skipped;
- else
- ++block->compact_pages_written;
- }
+ ++block->compact_pages_reviewed;
+ if (*skipp)
+ ++block->compact_pages_skipped;
+ else
+ ++block->compact_pages_written;
return (0);
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_compact.c b/src/third_party/wiredtiger/src/btree/bt_compact.c
index edbb2b35cc8..29e83c10beb 100644
--- a/src/third_party/wiredtiger/src/btree/bt_compact.c
+++ b/src/third_party/wiredtiger/src/btree/bt_compact.c
@@ -135,11 +135,21 @@ __wt_compact(WT_SESSION_IMPL *session)
* source if we make no progress, set a flag if the block layer thinks compaction is possible.
*/
WT_RET(bm->compact_skip(bm, session, &skip));
- if (skip)
+ if (skip) {
+ WT_STAT_CONN_INCR(session, session_table_compact_skipped);
+ WT_STAT_DATA_INCR(session, btree_compact_skipped);
return (0);
+ }
/* Walk the tree reviewing pages to see if they should be re-written. */
for (i = 0;;) {
+
+ /* Track progress. */
+ WT_STAT_DATA_SET(session, btree_compact_pages_reviewed, bm->block->compact_pages_reviewed);
+ WT_STAT_DATA_SET(session, btree_compact_pages_skipped, bm->block->compact_pages_skipped);
+ WT_STAT_DATA_SET(
+ session, btree_compact_pages_write_selected, bm->block->compact_pages_written);
+
/*
* Periodically check if we've timed out or eviction is stuck. Quit if eviction is stuck,
* we're making the problem worse.
@@ -196,7 +206,7 @@ __wt_compact(WT_SESSION_IMPL *session)
__wt_page_modify_set(session, ref->page);
session->compact_state = WT_COMPACT_SUCCESS;
- WT_STAT_DATA_INCR(session, btree_compact_rewrite);
+ WT_STAT_DATA_INCR(session, btree_compact_pages_rewritten);
}
err:
diff --git a/src/third_party/wiredtiger/src/cursor/cur_std.c b/src/third_party/wiredtiger/src/cursor/cur_std.c
index de5115845c7..1bf28de3f11 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_std.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_std.c
@@ -1124,23 +1124,24 @@ __wt_cursor_largest_key(WT_CURSOR *cursor)
WT_DECL_RET;
WT_SESSION_IMPL *session;
bool ignore_tombstone;
+ bool visible_all;
ignore_tombstone = F_ISSET(cursor, WT_CURSTD_IGNORE_TOMBSTONE);
+ visible_all = F_ISSET(cursor, WT_CURSTD_VISIBLE_ALL);
CURSOR_API_CALL(cursor, session, largest_key, NULL);
- if (F_ISSET(session->txn, WT_TXN_SHARED_TS_READ))
- WT_ERR_MSG(session, EINVAL, "largest key cannot be called with a read timestamp");
-
WT_ERR(__wt_scr_alloc(session, 0, &key));
/* Reset the cursor to give up the cursor position. */
WT_ERR(cursor->reset(cursor));
- /* Ignore deletion */
+ /* Ignore deletion. */
F_SET(cursor, WT_CURSTD_IGNORE_TOMBSTONE);
+ /* Ignore visibility. */
+ F_SET(cursor, WT_CURSTD_VISIBLE_ALL);
- /* Call cursor prev with read uncommitted isolation level. */
- WT_WITH_TXN_ISOLATION(session, WT_ISO_READ_UNCOMMITTED, ret = cursor->prev(cursor));
+ /* Call cursor prev to get the largest key. */
+ WT_ERR(cursor->prev(cursor));
WT_ERR(ret);
/* Copy the key as we will reset the cursor after that. */
@@ -1153,6 +1154,8 @@ __wt_cursor_largest_key(WT_CURSOR *cursor)
err:
if (!ignore_tombstone)
F_CLR(cursor, WT_CURSTD_IGNORE_TOMBSTONE);
+ if (!visible_all)
+ F_CLR(cursor, WT_CURSTD_VISIBLE_ALL);
__wt_scr_free(session, &key);
if (ret != 0)
WT_TRET(cursor->reset(cursor));
diff --git a/src/third_party/wiredtiger/src/docs/cursor-ops.dox b/src/third_party/wiredtiger/src/docs/cursor-ops.dox
index 82b763b563f..9618396a77c 100644
--- a/src/third_party/wiredtiger/src/docs/cursor-ops.dox
+++ b/src/third_party/wiredtiger/src/docs/cursor-ops.dox
@@ -108,10 +108,8 @@ record does not previously exist.
The WT_SESSION::largest_key \c gets the largest key in a table regardless of
visibility.
-It can only be called without a read timestamp, otherwise it returns an invalid
-argument error. Any following prev or next calls will behave as if they were
-invoked on an unpositioned cursor no matter the largest key call is successful
-or not.
+Any following prev or next calls will behave as if they were invoked on an
+unpositioned cursor no matter the largest key call is successful or not.
@section cursor_error Cursor position after error
diff --git a/src/third_party/wiredtiger/src/evict/evict_page.c b/src/third_party/wiredtiger/src/evict/evict_page.c
index eab73e9dc07..de249ec4a4b 100644
--- a/src/third_party/wiredtiger/src/evict/evict_page.c
+++ b/src/third_party/wiredtiger/src/evict/evict_page.c
@@ -95,7 +95,6 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32
WT_DECL_RET;
WT_PAGE *page;
uint64_t time_start, time_stop;
- uint32_t i;
bool clean_page, closing, force_evict_hs, inmem_split, local_gen, tree_dead;
conn = S2C(session);
@@ -223,25 +222,6 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32
if (0) {
err:
- /*
- * Mark the page dirty again if it has any prepared updates that are yet to be resolved
- * after a successful reconciliation and the page is failed to evict. Otherwise, the
- * resolved prepared updates are lost as the eviction don't reconcile page again and uses
- * the older reconciled image blocks to proceed with the eviction.
- */
- if (ref->page != NULL && ref->page->modify != NULL &&
- ref->page->modify->page_state == WT_PAGE_CLEAN) {
- if (ref->page->modify->rec_result == WT_PM_REC_REPLACE &&
- ref->page->modify->u1.r.replace.ta.prepare)
- __wt_page_modify_set(session, ref->page);
- else if (ref->page->modify->rec_result == WT_PM_REC_MULTIBLOCK) {
- for (i = 0; i < ref->page->modify->u1.m.multi_entries; i++) {
- if (ref->page->modify->u1.m.multi[i].addr.ta.prepare)
- __wt_page_modify_set(session, ref->page);
- }
- }
- }
-
if (!closing)
__evict_exclusive_clear(session, ref, previous_state);
diff --git a/src/third_party/wiredtiger/src/history/hs_rec.c b/src/third_party/wiredtiger/src/history/hs_rec.c
index 2da95291c12..bf9103fcc57 100644
--- a/src/third_party/wiredtiger/src/history/hs_rec.c
+++ b/src/third_party/wiredtiger/src/history/hs_rec.c
@@ -212,8 +212,7 @@ __hs_insert_record(WT_SESSION_IMPL *session, WT_CURSOR *cursor, WT_BTREE *btree,
cursor->set_value(
cursor, tw, tw->durable_stop_ts, tw->durable_start_ts, (uint64_t)type, hs_value);
WT_ERR(cursor->insert(cursor));
- WT_STAT_CONN_INCR(session, cache_hs_insert);
- WT_STAT_DATA_INCR(session, cache_hs_insert);
+ WT_STAT_CONN_DATA_INCR(session, cache_hs_insert);
err:
if (!hs_read_all_flag)
@@ -286,7 +285,7 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
WT_UPDATE_VECTOR out_of_order_ts_updates;
WT_SAVE_UPD *list;
WT_UPDATE *first_globally_visible_upd, *fix_ts_upd, *min_ts_upd, *out_of_order_ts_upd;
- WT_UPDATE *non_aborted_upd, *oldest_upd, *prev_upd, *tombstone, *upd;
+ WT_UPDATE *newest_hs, *non_aborted_upd, *oldest_upd, *prev_upd, *ref_upd, *tombstone, *upd;
WT_TIME_WINDOW tw;
wt_off_t hs_size;
uint64_t insert_cnt, max_hs_size, modify_cnt;
@@ -368,7 +367,11 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
WT_ERR(__wt_illegal_value(session, r->page->type));
}
- first_globally_visible_upd = min_ts_upd = out_of_order_ts_upd = NULL;
+ newest_hs = first_globally_visible_upd = min_ts_upd = out_of_order_ts_upd = NULL;
+ ref_upd = list->onpage_upd;
+
+ __wt_update_vector_clear(&out_of_order_ts_updates);
+ __wt_update_vector_clear(&updates);
/*
* Reverse deltas are only supported on 'S' and 'u' value formats.
@@ -404,6 +407,7 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
* tombstone.
* 4) We have a single tombstone on the chain, it is simply ignored.
*/
+ squashed = false;
for (upd = list->onpage_upd, non_aborted_upd = prev_upd = NULL; upd != NULL;
prev_upd = non_aborted_upd, upd = upd->next) {
if (upd->txnid == WT_TXN_ABORTED)
@@ -455,6 +459,24 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
enable_reverse_modify = false;
/*
+ * Find the first update to insert to the history store. (The value that is just older
+ * than the on-page value)
+ */
+ if (newest_hs == NULL) {
+ if (upd->txnid != ref_upd->txnid || upd->start_ts != ref_upd->start_ts) {
+ if (upd->type == WT_UPDATE_TOMBSTONE)
+ ref_upd = upd;
+ else
+ newest_hs = upd;
+ if (squashed) {
+ WT_STAT_CONN_DATA_INCR(session, cache_hs_write_squash);
+ squashed = false;
+ }
+ } else if (upd != ref_upd)
+ squashed = true;
+ }
+
+ /*
* No need to continue if we see the first self contained value after the first globally
* visible value.
*/
@@ -471,7 +493,6 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
prev_upd = upd = NULL;
- /* Construct the oldest full update. */
WT_ASSERT(session, updates.size > 0);
__wt_update_vector_peek(&updates, &oldest_upd);
@@ -499,21 +520,31 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
}
}
+ /* Skip if we have nothing to insert to the history store. */
+ if (newest_hs == NULL || F_ISSET(newest_hs, WT_UPDATE_HS)) {
+ /* The onpage value is squashed. */
+ if (newest_hs == NULL && squashed)
+ WT_STAT_CONN_DATA_INCR(session, cache_hs_write_squash);
+ continue;
+ }
+
+ /* Construct the oldest full update. */
WT_ERR(__hs_next_upd_full_value(session, &updates, NULL, full_value, &upd));
- hs_inserted = squashed = false;
+ hs_inserted = false;
/*
- * Flush the updates on stack. Stopping once we run out or we reach the onpage update or we
- * encounter a prepared update.
+ * Flush the updates on stack. Stopping once we finish inserting the newest history store
+ * value.
*/
modify_cnt = 0;
- for (; updates.size > 0 && upd->prepare_state != WT_PREPARE_INPROGRESS;
- tmp = full_value, full_value = prev_full_value, prev_full_value = tmp,
- upd = prev_upd) {
+ for (;; tmp = full_value, full_value = prev_full_value, prev_full_value = tmp,
+ upd = prev_upd) {
/* We should never insert the onpage value to the history store. */
WT_ASSERT(session, upd != list->onpage_upd);
WT_ASSERT(session, upd->type == WT_UPDATE_STANDARD || upd->type == WT_UPDATE_MODIFY);
+ /* We should never insert prepared updates to the history store. */
+ WT_ASSERT(session, upd->prepare_state != WT_PREPARE_INPROGRESS);
tombstone = NULL;
__wt_update_vector_peek(&updates, &prev_upd);
@@ -633,9 +664,9 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
/*
* Calculate reverse modify and clear the history store records with timestamps when
- * inserting the first update. Always write on-disk data store updates to the history
- * store as a full update because the on-disk update will be the base update for all the
- * updates that are older than the on-disk update. Limit the number of consecutive
+ * inserting the first update. Always write the newest update in the history store as a
+ * full update. We don't want to handle the edge cases that the reverse modifies be
+ * applied to the wrong on-disk base value. This also limits the number of consecutive
* reverse modifies for standard updates. We want to ensure we do not store a large
* chain of reverse modifies as to impact read performance.
*
@@ -645,19 +676,21 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
* the RTS.
*/
nentries = MAX_REVERSE_MODIFY_NUM;
- if (!F_ISSET(upd, WT_UPDATE_DS) && !F_ISSET(prev_upd, WT_UPDATE_DS) &&
- enable_reverse_modify && modify_cnt < WT_MAX_CONSECUTIVE_REVERSE_MODIFY &&
+ if (upd != newest_hs && enable_reverse_modify &&
+ modify_cnt < WT_MAX_CONSECUTIVE_REVERSE_MODIFY &&
__wt_calc_modify(session, prev_full_value, full_value, prev_full_value->size / 10,
entries, &nentries) == 0) {
WT_ERR(__wt_modify_pack(hs_cursor, entries, nentries, &modify_value));
ret = __hs_insert_record(session, hs_cursor, btree, key, WT_UPDATE_MODIFY,
modify_value, &tw, error_on_ooo_ts);
+ WT_STAT_CONN_DATA_INCR(session, cache_hs_insert_reverse_modify);
__wt_scr_free(session, &modify_value);
++modify_cnt;
} else {
modify_cnt = 0;
ret = __hs_insert_record(session, hs_cursor, btree, key, WT_UPDATE_STANDARD,
full_value, &tw, error_on_ooo_ts);
+ WT_STAT_CONN_DATA_INCR(session, cache_hs_insert_full_update);
}
/*
@@ -681,15 +714,14 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
WT_STAT_CONN_DATA_INCR(session, cache_hs_write_squash);
squashed = false;
}
- }
- /* If we squash the onpage value, we increase the counter here. */
- if (squashed)
- WT_STAT_CONN_DATA_INCR(session, cache_hs_write_squash);
+ if (upd == newest_hs)
+ break;
+ }
/*
* In the case that the onpage value is an out of order timestamp update and the update
- * older than it is a tombstone, it remains in the stack. Clean it up.
+ * older than it is a tombstone, it remains in the stack.
*/
WT_ASSERT(session, out_of_order_ts_updates.size <= 1);
#ifdef HAVE_DIAGNOSTIC
@@ -699,8 +731,6 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_MULTI *mult
upd->txnid == list->onpage_upd->txnid && upd->start_ts == list->onpage_upd->start_ts);
}
#endif
- __wt_update_vector_clear(&out_of_order_ts_updates);
- __wt_update_vector_clear(&updates);
}
/* Fail here 0.5% of the time if we are an eviction thread. */
diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h
index df1cd95de67..309d0b50805 100644
--- a/src/third_party/wiredtiger/src/include/stat.h
+++ b/src/third_party/wiredtiger/src/include/stat.h
@@ -466,6 +466,8 @@ struct __wt_connection_stats {
int64_t cache_write;
int64_t cache_write_restore;
int64_t cache_overhead;
+ int64_t cache_hs_insert_full_update;
+ int64_t cache_hs_insert_reverse_modify;
int64_t cache_bytes_internal;
int64_t cache_bytes_leaf;
int64_t cache_bytes_dirty;
@@ -696,7 +698,11 @@ struct __wt_connection_stats {
int64_t session_table_alter_trigger_checkpoint;
int64_t session_table_alter_skip;
int64_t session_table_compact_fail;
+ int64_t session_table_compact_fail_cache_pressure;
+ int64_t session_table_compact_running;
+ int64_t session_table_compact_skipped;
int64_t session_table_compact_success;
+ int64_t session_table_compact_timeout;
int64_t session_table_create_fail;
int64_t session_table_create_success;
int64_t session_table_drop_fail;
@@ -835,6 +841,10 @@ struct __wt_dsrc_stats {
int64_t block_minor;
int64_t btree_checkpoint_generation;
int64_t btree_clean_checkpoint_timer;
+ int64_t btree_compact_pages_reviewed;
+ int64_t btree_compact_pages_write_selected;
+ int64_t btree_compact_pages_skipped;
+ int64_t btree_compact_skipped;
int64_t btree_column_fix;
int64_t btree_column_internal;
int64_t btree_column_rle;
@@ -849,7 +859,7 @@ struct __wt_dsrc_stats {
int64_t btree_maximum_depth;
int64_t btree_entries;
int64_t btree_overflow;
- int64_t btree_compact_rewrite;
+ int64_t btree_compact_pages_rewritten;
int64_t btree_row_empty_values;
int64_t btree_row_internal;
int64_t btree_row_leaf;
@@ -909,6 +919,8 @@ struct __wt_dsrc_stats {
int64_t cache_eviction_pages_seen;
int64_t cache_write;
int64_t cache_write_restore;
+ int64_t cache_hs_insert_full_update;
+ int64_t cache_hs_insert_reverse_modify;
int64_t cache_bytes_dirty;
int64_t cache_eviction_clean;
int64_t cache_state_gen_avg_gap;
diff --git a/src/third_party/wiredtiger/src/include/txn_inline.h b/src/third_party/wiredtiger/src/include/txn_inline.h
index 908fe1d38dd..a6b13708057 100644
--- a/src/third_party/wiredtiger/src/include/txn_inline.h
+++ b/src/third_party/wiredtiger/src/include/txn_inline.h
@@ -766,9 +766,9 @@ __wt_txn_upd_visible_type(WT_SESSION_IMPL *session, WT_UPDATE *upd)
if (prepare_state == WT_PREPARE_LOCKED)
continue;
- if (WT_IS_HS(session->dhandle) && upd->txnid != WT_TXN_ABORTED &&
- upd->type == WT_UPDATE_STANDARD)
- /* Entries in the history store are always visible. */
+ /* Entries in the history store are always visible. */
+ if ((WT_IS_HS(session->dhandle) && upd->txnid != WT_TXN_ABORTED &&
+ upd->type == WT_UPDATE_STANDARD))
return (WT_VISIBLE_TRUE);
upd_visible = __wt_txn_visible(session, upd->txnid, upd->start_ts);
@@ -901,7 +901,10 @@ __wt_txn_read_upd_list_internal(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt,
continue;
}
- upd_visible = __wt_txn_upd_visible_type(session, upd);
+ if (F_ISSET(&cbt->iface, WT_CURSTD_VISIBLE_ALL))
+ upd_visible = WT_VISIBLE_TRUE;
+ else
+ upd_visible = __wt_txn_upd_visible_type(session, upd);
if (upd_visible == WT_VISIBLE_TRUE)
break;
@@ -1038,8 +1041,14 @@ retry:
cbt->upd_value->tw.prepare = tw.prepare;
}
- /* If the start time point is visible then we need to return the ondisk value. */
- if (WT_IS_HS(session->dhandle) || __wt_txn_tw_start_visible(session, &tw)) {
+ /*
+ * We return the onpage value in the following cases:
+ * 1. The record is from the history store.
+ * 2. It has the WT_CURSTD_VISIBLE_ALL flag set.
+ * 3. It is visible to the reader.
+ */
+ if (WT_IS_HS(session->dhandle) || F_ISSET(&cbt->iface, WT_CURSTD_VISIBLE_ALL) ||
+ __wt_txn_tw_start_visible(session, &tw)) {
if (cbt->upd_value->skip_buf) {
cbt->upd_value->buf.data = NULL;
cbt->upd_value->buf.size = 0;
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index fc8e542c33a..ec50d871f90 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -735,6 +735,7 @@ struct __wt_cursor {
#define WT_CURSTD_RAW_SEARCH 0x0800000u
#define WT_CURSTD_VALUE_EXT 0x1000000u /* Value points out of tree. */
#define WT_CURSTD_VALUE_INT 0x2000000u /* Value points into tree. */
+#define WT_CURSTD_VISIBLE_ALL 0x4000000u
/* AUTOMATIC FLAG VALUE GENERATION STOP 32 */
#define WT_CURSTD_KEY_SET (WT_CURSTD_KEY_EXT | WT_CURSTD_KEY_INT)
#define WT_CURSTD_VALUE_SET (WT_CURSTD_VALUE_EXT | WT_CURSTD_VALUE_INT)
@@ -5390,811 +5391,823 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1151
/*! cache: percentage overhead */
#define WT_STAT_CONN_CACHE_OVERHEAD 1152
+/*! cache: the number of times full update inserted to history store */
+#define WT_STAT_CONN_CACHE_HS_INSERT_FULL_UPDATE 1153
+/*! cache: the number of times reverse modify inserted to history store */
+#define WT_STAT_CONN_CACHE_HS_INSERT_REVERSE_MODIFY 1154
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1153
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1155
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1154
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1156
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1155
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1157
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1156
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1158
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1157
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1159
/*! capacity: background fsync file handles considered */
-#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1158
+#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1160
/*! capacity: background fsync file handles synced */
-#define WT_STAT_CONN_FSYNC_ALL_FH 1159
+#define WT_STAT_CONN_FSYNC_ALL_FH 1161
/*! capacity: background fsync time (msecs) */
-#define WT_STAT_CONN_FSYNC_ALL_TIME 1160
+#define WT_STAT_CONN_FSYNC_ALL_TIME 1162
/*! capacity: bytes read */
-#define WT_STAT_CONN_CAPACITY_BYTES_READ 1161
+#define WT_STAT_CONN_CAPACITY_BYTES_READ 1163
/*! capacity: bytes written for checkpoint */
-#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1162
+#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1164
/*! capacity: bytes written for eviction */
-#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1163
+#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1165
/*! capacity: bytes written for log */
-#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1164
+#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1166
/*! capacity: bytes written total */
-#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1165
+#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1167
/*! capacity: threshold to call fsync */
-#define WT_STAT_CONN_CAPACITY_THRESHOLD 1166
+#define WT_STAT_CONN_CAPACITY_THRESHOLD 1168
/*! capacity: time waiting due to total capacity (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1167
+#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1169
/*! capacity: time waiting during checkpoint (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1168
+#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1170
/*! capacity: time waiting during eviction (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1169
+#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1171
/*! capacity: time waiting during logging (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_LOG 1170
+#define WT_STAT_CONN_CAPACITY_TIME_LOG 1172
/*! capacity: time waiting during read (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_READ 1171
+#define WT_STAT_CONN_CAPACITY_TIME_READ 1173
/*! checkpoint-cleanup: pages added for eviction */
-#define WT_STAT_CONN_CC_PAGES_EVICT 1172
+#define WT_STAT_CONN_CC_PAGES_EVICT 1174
/*! checkpoint-cleanup: pages removed */
-#define WT_STAT_CONN_CC_PAGES_REMOVED 1173
+#define WT_STAT_CONN_CC_PAGES_REMOVED 1175
/*! checkpoint-cleanup: pages skipped during tree walk */
-#define WT_STAT_CONN_CC_PAGES_WALK_SKIPPED 1174
+#define WT_STAT_CONN_CC_PAGES_WALK_SKIPPED 1176
/*! checkpoint-cleanup: pages visited */
-#define WT_STAT_CONN_CC_PAGES_VISITED 1175
+#define WT_STAT_CONN_CC_PAGES_VISITED 1177
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1176
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1178
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1177
+#define WT_STAT_CONN_COND_AUTO_WAIT 1179
/*!
* connection: auto adjusting condition wait raced to update timeout and
* skipped updating
*/
-#define WT_STAT_CONN_COND_AUTO_WAIT_SKIPPED 1178
+#define WT_STAT_CONN_COND_AUTO_WAIT_SKIPPED 1180
/*! connection: detected system time went backwards */
-#define WT_STAT_CONN_TIME_TRAVEL 1179
+#define WT_STAT_CONN_TIME_TRAVEL 1181
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1180
+#define WT_STAT_CONN_FILE_OPEN 1182
/*! connection: hash bucket array size for data handles */
-#define WT_STAT_CONN_BUCKETS_DH 1181
+#define WT_STAT_CONN_BUCKETS_DH 1183
/*! connection: hash bucket array size general */
-#define WT_STAT_CONN_BUCKETS 1182
+#define WT_STAT_CONN_BUCKETS 1184
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1183
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1185
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1184
+#define WT_STAT_CONN_MEMORY_FREE 1186
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1185
+#define WT_STAT_CONN_MEMORY_GROW 1187
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1186
+#define WT_STAT_CONN_COND_WAIT 1188
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1187
+#define WT_STAT_CONN_RWLOCK_READ 1189
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1188
+#define WT_STAT_CONN_RWLOCK_WRITE 1190
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1189
+#define WT_STAT_CONN_FSYNC_IO 1191
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1190
+#define WT_STAT_CONN_READ_IO 1192
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1191
+#define WT_STAT_CONN_WRITE_IO 1193
/*! cursor: Total number of entries skipped by cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_TOTAL 1192
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_TOTAL 1194
/*! cursor: Total number of entries skipped by cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_TOTAL 1193
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_TOTAL 1195
/*!
* cursor: Total number of entries skipped to position the history store
* cursor
*/
-#define WT_STAT_CONN_CURSOR_SKIP_HS_CUR_POSITION 1194
+#define WT_STAT_CONN_CURSOR_SKIP_HS_CUR_POSITION 1196
/*!
* cursor: Total number of times a search near has exited due to prefix
* config
*/
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 1195
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 1197
/*! cursor: cached cursor count */
-#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1196
+#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1198
/*! cursor: cursor bulk loaded cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT_BULK 1197
+#define WT_STAT_CONN_CURSOR_INSERT_BULK 1199
/*! cursor: cursor close calls that result in cache */
-#define WT_STAT_CONN_CURSOR_CACHE 1198
+#define WT_STAT_CONN_CURSOR_CACHE 1200
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1199
+#define WT_STAT_CONN_CURSOR_CREATE 1201
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1200
+#define WT_STAT_CONN_CURSOR_INSERT 1202
/*! cursor: cursor insert key and value bytes */
-#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1201
+#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1203
/*! cursor: cursor modify calls */
-#define WT_STAT_CONN_CURSOR_MODIFY 1202
+#define WT_STAT_CONN_CURSOR_MODIFY 1204
/*! cursor: cursor modify key and value bytes affected */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1203
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1205
/*! cursor: cursor modify value bytes modified */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1204
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1206
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1205
+#define WT_STAT_CONN_CURSOR_NEXT 1207
/*!
* cursor: cursor next calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1206
+#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1208
/*!
* cursor: cursor next calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1207
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1209
/*! cursor: cursor next calls that skip less than 100 entries */
-#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1208
+#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1210
/*! cursor: cursor operation restarted */
-#define WT_STAT_CONN_CURSOR_RESTART 1209
+#define WT_STAT_CONN_CURSOR_RESTART 1211
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1210
+#define WT_STAT_CONN_CURSOR_PREV 1212
/*!
* cursor: cursor prev calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1211
+#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1213
/*!
* cursor: cursor prev calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1212
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1214
/*! cursor: cursor prev calls that skip less than 100 entries */
-#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1213
+#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1215
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1214
+#define WT_STAT_CONN_CURSOR_REMOVE 1216
/*! cursor: cursor remove key bytes removed */
-#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1215
+#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1217
/*! cursor: cursor reserve calls */
-#define WT_STAT_CONN_CURSOR_RESERVE 1216
+#define WT_STAT_CONN_CURSOR_RESERVE 1218
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1217
+#define WT_STAT_CONN_CURSOR_RESET 1219
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1218
+#define WT_STAT_CONN_CURSOR_SEARCH 1220
/*! cursor: cursor search history store calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_HS 1219
+#define WT_STAT_CONN_CURSOR_SEARCH_HS 1221
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1220
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1222
/*! cursor: cursor sweep buckets */
-#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1221
+#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1223
/*! cursor: cursor sweep cursors closed */
-#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1222
+#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1224
/*! cursor: cursor sweep cursors examined */
-#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1223
+#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1225
/*! cursor: cursor sweeps */
-#define WT_STAT_CONN_CURSOR_SWEEP 1224
+#define WT_STAT_CONN_CURSOR_SWEEP 1226
/*! cursor: cursor truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1225
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1227
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1226
+#define WT_STAT_CONN_CURSOR_UPDATE 1228
/*! cursor: cursor update key and value bytes */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1227
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1229
/*! cursor: cursor update value size change */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1228
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1230
/*! cursor: cursors reused from cache */
-#define WT_STAT_CONN_CURSOR_REOPEN 1229
+#define WT_STAT_CONN_CURSOR_REOPEN 1231
/*! cursor: open cursor count */
-#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1230
+#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1232
/*! data-handle: connection data handle size */
-#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1231
+#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1233
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1232
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1234
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1233
+#define WT_STAT_CONN_DH_SWEEP_REF 1235
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1234
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1236
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1235
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1237
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1236
+#define WT_STAT_CONN_DH_SWEEP_TOD 1238
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1237
+#define WT_STAT_CONN_DH_SWEEPS 1239
/*!
* data-handle: connection sweeps skipped due to checkpoint gathering
* handles
*/
-#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1238
+#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1240
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1239
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1241
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1240
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1242
/*! lock: checkpoint lock acquisitions */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1241
+#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1243
/*! lock: checkpoint lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1242
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1244
/*! lock: checkpoint lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1243
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1245
/*! lock: dhandle lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1244
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1246
/*! lock: dhandle lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1245
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1247
/*! lock: dhandle read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1246
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1248
/*! lock: dhandle write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1247
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1249
/*!
* lock: durable timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1248
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1250
/*!
* lock: durable timestamp queue lock internal thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1249
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1251
/*! lock: durable timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1250
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1252
/*! lock: durable timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1251
+#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1253
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1252
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1254
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1253
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1255
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1254
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1256
/*!
* lock: read timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1255
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1257
/*! lock: read timestamp queue lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1256
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1258
/*! lock: read timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1257
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1259
/*! lock: read timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1258
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1260
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1259
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1261
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1260
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1262
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1261
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1263
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1262
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1264
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1263
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1265
/*! lock: table read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1264
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1266
/*! lock: table write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1265
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1267
/*! lock: txn global lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1266
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1268
/*! lock: txn global lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1267
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1269
/*! lock: txn global read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1268
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1270
/*! lock: txn global write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1269
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1271
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1270
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1272
/*! log: force archive time sleeping (usecs) */
-#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1271
+#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1273
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1272
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1274
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1273
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1275
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1274
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1276
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1275
+#define WT_STAT_CONN_LOG_FLUSH 1277
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1276
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1278
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1277
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1279
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1278
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1280
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1279
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1281
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1280
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1282
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1281
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1283
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1282
+#define WT_STAT_CONN_LOG_SCANS 1284
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1283
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1285
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1284
+#define WT_STAT_CONN_LOG_WRITE_LSN 1286
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1285
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1287
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1286
+#define WT_STAT_CONN_LOG_SYNC 1288
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1287
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1289
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1288
+#define WT_STAT_CONN_LOG_SYNC_DIR 1290
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1289
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1291
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1290
+#define WT_STAT_CONN_LOG_WRITES 1292
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1291
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1293
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1292
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1294
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1293
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1295
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1294
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1296
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1295
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1297
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1296
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1298
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1297
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1299
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1298
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1300
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1299
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1301
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1300
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1302
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1301
+#define WT_STAT_CONN_LOG_SLOT_RACES 1303
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1302
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1304
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1303
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1305
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1304
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1306
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1305
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1307
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1306
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1308
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1307
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1309
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1308
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1310
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1309
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1311
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1310
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1312
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1311
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1313
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1312
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1314
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1313
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1315
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1314
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1316
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1315
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1317
/*! perf: file system read latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1316
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1318
/*! perf: file system read latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1317
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1319
/*! perf: file system read latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1318
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1320
/*! perf: file system read latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1319
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1321
/*! perf: file system read latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1320
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1322
/*! perf: file system read latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1321
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1323
/*! perf: file system write latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1322
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1324
/*! perf: file system write latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1323
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1325
/*! perf: file system write latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1324
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1326
/*! perf: file system write latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1325
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1327
/*! perf: file system write latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1326
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1328
/*! perf: file system write latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1327
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1329
/*! perf: operation read latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1328
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1330
/*! perf: operation read latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1329
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1331
/*! perf: operation read latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1330
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1332
/*! perf: operation read latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1331
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1333
/*! perf: operation read latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1332
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1334
/*! perf: operation write latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1333
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1335
/*! perf: operation write latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1334
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1336
/*! perf: operation write latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1335
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1337
/*! perf: operation write latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1336
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1338
/*! perf: operation write latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1337
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1339
/*! reconciliation: approximate byte size of timestamps in pages written */
-#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1338
+#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1340
/*!
* reconciliation: approximate byte size of transaction IDs in pages
* written
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1339
+#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1341
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1340
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1342
/*! reconciliation: internal-page overflow keys */
-#define WT_STAT_CONN_REC_OVERFLOW_KEY_INTERNAL 1341
+#define WT_STAT_CONN_REC_OVERFLOW_KEY_INTERNAL 1343
/*! reconciliation: leaf-page overflow keys */
-#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1342
+#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1344
/*! reconciliation: maximum seconds spent in a reconciliation call */
-#define WT_STAT_CONN_REC_MAXIMUM_SECONDS 1343
+#define WT_STAT_CONN_REC_MAXIMUM_SECONDS 1345
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1344
+#define WT_STAT_CONN_REC_PAGES 1346
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1345
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1347
/*!
* reconciliation: page reconciliation calls that resulted in values with
* prepared transaction metadata
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1346
+#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1348
/*!
* reconciliation: page reconciliation calls that resulted in values with
* timestamps
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_TS 1347
+#define WT_STAT_CONN_REC_PAGES_WITH_TS 1349
/*!
* reconciliation: page reconciliation calls that resulted in values with
* transaction ids
*/
-#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1348
+#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1350
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1349
+#define WT_STAT_CONN_REC_PAGE_DELETE 1351
/*!
* reconciliation: pages written including an aggregated newest start
* durable timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1350
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1352
/*!
* reconciliation: pages written including an aggregated newest stop
* durable timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1351
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1353
/*!
* reconciliation: pages written including an aggregated newest stop
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1352
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1354
/*!
* reconciliation: pages written including an aggregated newest stop
* transaction ID
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1353
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1355
/*!
* reconciliation: pages written including an aggregated newest
* transaction ID
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1354
+#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1356
/*!
* reconciliation: pages written including an aggregated oldest start
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1355
+#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1357
/*! reconciliation: pages written including an aggregated prepare */
-#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1356
+#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1358
/*! reconciliation: pages written including at least one prepare state */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1357
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1359
/*!
* reconciliation: pages written including at least one start durable
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1358
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1360
/*! reconciliation: pages written including at least one start timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1359
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1361
/*!
* reconciliation: pages written including at least one start transaction
* ID
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1360
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1362
/*!
* reconciliation: pages written including at least one stop durable
* timestamp
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1361
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1363
/*! reconciliation: pages written including at least one stop timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1362
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1364
/*!
* reconciliation: pages written including at least one stop transaction
* ID
*/
-#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1363
+#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1365
/*! reconciliation: records written including a prepare state */
-#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1364
+#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1366
/*! reconciliation: records written including a start durable timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1365
+#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1367
/*! reconciliation: records written including a start timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1366
+#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1368
/*! reconciliation: records written including a start transaction ID */
-#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1367
+#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1369
/*! reconciliation: records written including a stop durable timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1368
+#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1370
/*! reconciliation: records written including a stop timestamp */
-#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1369
+#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1371
/*! reconciliation: records written including a stop transaction ID */
-#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1370
+#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1372
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1371
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1373
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1372
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1374
/*! session: attempts to remove a local object and the object is in use */
-#define WT_STAT_CONN_LOCAL_OBJECTS_INUSE 1373
+#define WT_STAT_CONN_LOCAL_OBJECTS_INUSE 1375
/*! session: flush_tier operation calls */
-#define WT_STAT_CONN_FLUSH_TIER 1374
+#define WT_STAT_CONN_FLUSH_TIER 1376
/*! session: local objects removed */
-#define WT_STAT_CONN_LOCAL_OBJECTS_REMOVED 1375
+#define WT_STAT_CONN_LOCAL_OBJECTS_REMOVED 1377
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1376
+#define WT_STAT_CONN_SESSION_OPEN 1378
/*! session: session query timestamp calls */
-#define WT_STAT_CONN_SESSION_QUERY_TS 1377
+#define WT_STAT_CONN_SESSION_QUERY_TS 1379
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1378
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1380
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1379
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1381
/*! session: table alter triggering checkpoint calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1380
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1382
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1381
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1383
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1382
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1384
+/*! session: table compact failed calls due to cache pressure */
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL_CACHE_PRESSURE 1385
+/*! session: table compact running */
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_RUNNING 1386
+/*! session: table compact skipped as process would not reduce file size */
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SKIPPED 1387
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1383
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1388
+/*! session: table compact timeout */
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_TIMEOUT 1389
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1384
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1390
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1385
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1391
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1386
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1392
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1387
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1393
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1388
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1394
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1389
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1395
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1390
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1396
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1391
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1397
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1392
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1398
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1393
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1399
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1394
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1400
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1395
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1401
/*! session: tiered operations dequeued and processed */
-#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1396
+#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1402
/*! session: tiered operations scheduled */
-#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1397
+#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1403
/*! session: tiered storage local retention time (secs) */
-#define WT_STAT_CONN_TIERED_RETENTION 1398
+#define WT_STAT_CONN_TIERED_RETENTION 1404
/*! session: tiered storage object size */
-#define WT_STAT_CONN_TIERED_OBJECT_SIZE 1399
+#define WT_STAT_CONN_TIERED_OBJECT_SIZE 1405
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1400
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1406
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1401
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1407
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1402
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1408
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1403
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1409
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1404
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1410
/*!
* thread-yield: connection close blocked waiting for transaction state
* stabilization
*/
-#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1405
+#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1411
/*! thread-yield: connection close yielded for lsm manager shutdown */
-#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1406
+#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1412
/*! thread-yield: data handle lock yielded */
-#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1407
+#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1413
/*!
* thread-yield: get reference for page index and slot time sleeping
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1408
+#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1414
/*! thread-yield: page access yielded due to prepare state change */
-#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1409
+#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1415
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1410
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1416
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1411
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1417
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1412
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1418
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1413
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1419
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1414
+#define WT_STAT_CONN_PAGE_SLEEP 1420
/*!
* thread-yield: page delete rollback time sleeping for state change
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1415
+#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1421
/*! thread-yield: page reconciliation yielded due to child modification */
-#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1416
+#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1422
/*! transaction: Number of prepared updates */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1417
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1423
/*! transaction: Number of prepared updates committed */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1418
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1424
/*! transaction: Number of prepared updates repeated on the same key */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1419
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1425
/*! transaction: Number of prepared updates rolled back */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1420
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1426
/*! transaction: prepared transactions */
-#define WT_STAT_CONN_TXN_PREPARE 1421
+#define WT_STAT_CONN_TXN_PREPARE 1427
/*! transaction: prepared transactions committed */
-#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1422
+#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1428
/*! transaction: prepared transactions currently active */
-#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1423
+#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1429
/*! transaction: prepared transactions rolled back */
-#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1424
+#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1430
/*!
* transaction: prepared transactions rolled back and do not remove the
* history store entry
*/
-#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_DO_NOT_REMOVE_HS_UPDATE 1425
+#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_DO_NOT_REMOVE_HS_UPDATE 1431
/*!
* transaction: prepared transactions rolled back and fix the history
* store entry with checkpoint reserved transaction id
*/
-#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_FIX_HS_UPDATE_WITH_CKPT_RESERVED_TXNID 1426
+#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_FIX_HS_UPDATE_WITH_CKPT_RESERVED_TXNID 1432
/*! transaction: query timestamp calls */
-#define WT_STAT_CONN_TXN_QUERY_TS 1427
+#define WT_STAT_CONN_TXN_QUERY_TS 1433
/*! transaction: race to read prepared update retry */
-#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1428
+#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1434
/*! transaction: rollback to stable calls */
-#define WT_STAT_CONN_TXN_RTS 1429
+#define WT_STAT_CONN_TXN_RTS 1435
/*!
* 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 1430
+#define WT_STAT_CONN_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 1436
/*! transaction: rollback to stable inconsistent checkpoint */
-#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1431
+#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1437
/*! transaction: rollback to stable keys removed */
-#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1432
+#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1438
/*! transaction: rollback to stable keys restored */
-#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1433
+#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1439
/*! transaction: rollback to stable pages visited */
-#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1434
+#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1440
/*! transaction: rollback to stable restored tombstones from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1435
+#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1441
/*! transaction: rollback to stable restored updates from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1436
+#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1442
/*! transaction: rollback to stable skipping delete rle */
-#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1437
+#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1443
/*! transaction: rollback to stable skipping stable rle */
-#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1438
+#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1444
/*! transaction: rollback to stable sweeping history store keys */
-#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1439
+#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1445
/*! transaction: rollback to stable tree walk skipping pages */
-#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1440
+#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1446
/*! transaction: rollback to stable updates aborted */
-#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1441
+#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1447
/*! transaction: rollback to stable updates removed from history store */
-#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1442
+#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1448
/*! transaction: sessions scanned in each walk of concurrent sessions */
-#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1443
+#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1449
/*! transaction: set timestamp calls */
-#define WT_STAT_CONN_TXN_SET_TS 1444
+#define WT_STAT_CONN_TXN_SET_TS 1450
/*! transaction: set timestamp durable calls */
-#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1445
+#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1451
/*! transaction: set timestamp durable updates */
-#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1446
+#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1452
/*! transaction: set timestamp oldest calls */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1447
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1453
/*! transaction: set timestamp oldest updates */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1448
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1454
/*! transaction: set timestamp stable calls */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE 1449
+#define WT_STAT_CONN_TXN_SET_TS_STABLE 1455
/*! transaction: set timestamp stable updates */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1450
+#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1456
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1451
+#define WT_STAT_CONN_TXN_BEGIN 1457
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1452
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1458
/*!
* transaction: transaction checkpoint currently running for history
* store file
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1453
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1459
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1454
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1460
/*!
* transaction: transaction checkpoint history store file duration
* (usecs)
*/
-#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1455
+#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1461
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1456
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1462
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1457
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1463
/*!
* transaction: transaction checkpoint most recent duration for gathering
* all handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1458
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1464
/*!
* transaction: transaction checkpoint most recent duration for gathering
* applied handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1459
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1465
/*!
* transaction: transaction checkpoint most recent duration for gathering
* skipped handles (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1460
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1466
/*! transaction: transaction checkpoint most recent handles applied */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1461
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1467
/*! transaction: transaction checkpoint most recent handles skipped */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1462
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1468
/*! transaction: transaction checkpoint most recent handles walked */
-#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1463
+#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1469
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1464
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1470
/*! transaction: transaction checkpoint prepare currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1465
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1471
/*! transaction: transaction checkpoint prepare max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1466
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1472
/*! transaction: transaction checkpoint prepare min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1467
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1473
/*! transaction: transaction checkpoint prepare most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1468
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1474
/*! transaction: transaction checkpoint prepare total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1469
+#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1475
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1470
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1476
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1471
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1477
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1472
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1478
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1473
+#define WT_STAT_CONN_TXN_CHECKPOINT 1479
/*! transaction: transaction checkpoints due to obsolete pages */
-#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1474
+#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1480
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1475
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1481
/*! transaction: transaction failures due to history store */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1476
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1482
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1477
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1483
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1478
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1484
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1479
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1485
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1480
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1486
/*! transaction: transaction range of timestamps currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1481
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1487
/*! transaction: transaction range of timestamps pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1482
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1488
/*!
* transaction: transaction range of timestamps pinned by the oldest
* active read timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1483
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1489
/*!
* transaction: transaction range of timestamps pinned by the oldest
* timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1484
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1490
/*! transaction: transaction read timestamp of the oldest active reader */
-#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1485
+#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1491
/*! transaction: transaction rollback to stable currently running */
-#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1486
+#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1492
/*! transaction: transaction walk of concurrent sessions */
-#define WT_STAT_CONN_TXN_WALK_SESSIONS 1487
+#define WT_STAT_CONN_TXN_WALK_SESSIONS 1493
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1488
+#define WT_STAT_CONN_TXN_COMMIT 1494
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1489
+#define WT_STAT_CONN_TXN_ROLLBACK 1495
/*! transaction: update conflicts */
-#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1490
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1496
/*!
* @}
@@ -6253,600 +6266,612 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_DSRC_BTREE_CHECKPOINT_GENERATION 2022
/*! btree: btree clean tree checkpoint expiration time */
#define WT_STAT_DSRC_BTREE_CLEAN_CHECKPOINT_TIMER 2023
+/*! btree: btree compact pages reviewed */
+#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_REVIEWED 2024
+/*! btree: btree compact pages selected to be rewritten */
+#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_WRITE_SELECTED 2025
+/*! btree: btree compact pages skipped */
+#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_SKIPPED 2026
+/*! btree: btree skipped by compaction as process would not reduce size */
+#define WT_STAT_DSRC_BTREE_COMPACT_SKIPPED 2027
/*!
* btree: column-store fixed-size leaf pages, only reported if tree_walk
* or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_FIX 2024
+#define WT_STAT_DSRC_BTREE_COLUMN_FIX 2028
/*!
* btree: column-store internal pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_INTERNAL 2025
+#define WT_STAT_DSRC_BTREE_COLUMN_INTERNAL 2029
/*!
* 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 2026
+#define WT_STAT_DSRC_BTREE_COLUMN_RLE 2030
/*!
* btree: column-store variable-size deleted values, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_DELETED 2027
+#define WT_STAT_DSRC_BTREE_COLUMN_DELETED 2031
/*!
* btree: column-store variable-size leaf pages, only reported if
* tree_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_COLUMN_VARIABLE 2028
+#define WT_STAT_DSRC_BTREE_COLUMN_VARIABLE 2032
/*! btree: fixed-record size */
-#define WT_STAT_DSRC_BTREE_FIXED_LEN 2029
+#define WT_STAT_DSRC_BTREE_FIXED_LEN 2033
/*! btree: maximum internal page key size */
-#define WT_STAT_DSRC_BTREE_MAXINTLKEY 2030
+#define WT_STAT_DSRC_BTREE_MAXINTLKEY 2034
/*! btree: maximum internal page size */
-#define WT_STAT_DSRC_BTREE_MAXINTLPAGE 2031
+#define WT_STAT_DSRC_BTREE_MAXINTLPAGE 2035
/*! btree: maximum leaf page key size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFKEY 2032
+#define WT_STAT_DSRC_BTREE_MAXLEAFKEY 2036
/*! btree: maximum leaf page size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFPAGE 2033
+#define WT_STAT_DSRC_BTREE_MAXLEAFPAGE 2037
/*! btree: maximum leaf page value size */
-#define WT_STAT_DSRC_BTREE_MAXLEAFVALUE 2034
+#define WT_STAT_DSRC_BTREE_MAXLEAFVALUE 2038
/*! btree: maximum tree depth */
-#define WT_STAT_DSRC_BTREE_MAXIMUM_DEPTH 2035
+#define WT_STAT_DSRC_BTREE_MAXIMUM_DEPTH 2039
/*!
* btree: number of key/value pairs, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ENTRIES 2036
+#define WT_STAT_DSRC_BTREE_ENTRIES 2040
/*!
* btree: overflow pages, only reported if tree_walk or all statistics
* are enabled
*/
-#define WT_STAT_DSRC_BTREE_OVERFLOW 2037
+#define WT_STAT_DSRC_BTREE_OVERFLOW 2041
/*! btree: pages rewritten by compaction */
-#define WT_STAT_DSRC_BTREE_COMPACT_REWRITE 2038
+#define WT_STAT_DSRC_BTREE_COMPACT_PAGES_REWRITTEN 2042
/*!
* btree: row-store empty values, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_EMPTY_VALUES 2039
+#define WT_STAT_DSRC_BTREE_ROW_EMPTY_VALUES 2043
/*!
* btree: row-store internal pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_INTERNAL 2040
+#define WT_STAT_DSRC_BTREE_ROW_INTERNAL 2044
/*!
* btree: row-store leaf pages, only reported if tree_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_BTREE_ROW_LEAF 2041
+#define WT_STAT_DSRC_BTREE_ROW_LEAF 2045
/*! cache: bytes currently in the cache */
-#define WT_STAT_DSRC_CACHE_BYTES_INUSE 2042
+#define WT_STAT_DSRC_CACHE_BYTES_INUSE 2046
/*! cache: bytes dirty in the cache cumulative */
-#define WT_STAT_DSRC_CACHE_BYTES_DIRTY_TOTAL 2043
+#define WT_STAT_DSRC_CACHE_BYTES_DIRTY_TOTAL 2047
/*! cache: bytes read into cache */
-#define WT_STAT_DSRC_CACHE_BYTES_READ 2044
+#define WT_STAT_DSRC_CACHE_BYTES_READ 2048
/*! cache: bytes written from cache */
-#define WT_STAT_DSRC_CACHE_BYTES_WRITE 2045
+#define WT_STAT_DSRC_CACHE_BYTES_WRITE 2049
/*! cache: checkpoint blocked page eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_CHECKPOINT 2046
+#define WT_STAT_DSRC_CACHE_EVICTION_CHECKPOINT 2050
/*!
* cache: checkpoint of history store file blocked non-history store page
* eviction
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_CHECKPOINT_HS 2047
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_CHECKPOINT_HS 2051
/*! cache: data source pages selected for eviction unable to be evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_FAIL 2048
+#define WT_STAT_DSRC_CACHE_EVICTION_FAIL 2052
/*!
* 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 2049
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_1 2053
/*!
* 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 2050
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_2 2054
/*!
* 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 2051
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_3 2055
/*!
* 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 2052
+#define WT_STAT_DSRC_CACHE_EVICTION_BLOCKED_OOO_CHECKPOINT_RACE_4 2056
/*! cache: eviction walk passes of a file */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_PASSES 2053
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_PASSES 2057
/*! cache: eviction walk target pages histogram - 0-9 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT10 2054
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT10 2058
/*! cache: eviction walk target pages histogram - 10-31 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT32 2055
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT32 2059
/*! cache: eviction walk target pages histogram - 128 and higher */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_GE128 2056
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_GE128 2060
/*! cache: eviction walk target pages histogram - 32-63 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT64 2057
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT64 2061
/*! cache: eviction walk target pages histogram - 64-128 */
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT128 2058
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_LT128 2062
/*!
* cache: eviction walk target pages reduced due to history store cache
* pressure
*/
-#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_REDUCED 2059
+#define WT_STAT_DSRC_CACHE_EVICTION_TARGET_PAGE_REDUCED 2063
/*! cache: eviction walks abandoned */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ABANDONED 2060
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ABANDONED 2064
/*! cache: eviction walks gave up because they restarted their walk twice */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_STOPPED 2061
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_STOPPED 2065
/*!
* 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 2062
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 2066
/*!
* 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 2063
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 2067
/*! cache: eviction walks reached end of tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ENDED 2064
+#define WT_STAT_DSRC_CACHE_EVICTION_WALKS_ENDED 2068
/*! cache: eviction walks restarted */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_RESTART 2065
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_RESTART 2069
/*! cache: eviction walks started from root of tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_FROM_ROOT 2066
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_FROM_ROOT 2070
/*! cache: eviction walks started from saved location in tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_WALK_SAVED_POS 2067
+#define WT_STAT_DSRC_CACHE_EVICTION_WALK_SAVED_POS 2071
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_HAZARD 2068
+#define WT_STAT_DSRC_CACHE_EVICTION_HAZARD 2072
/*! cache: history store table insert calls */
-#define WT_STAT_DSRC_CACHE_HS_INSERT 2069
+#define WT_STAT_DSRC_CACHE_HS_INSERT 2073
/*! cache: history store table insert calls that returned restart */
-#define WT_STAT_DSRC_CACHE_HS_INSERT_RESTART 2070
+#define WT_STAT_DSRC_CACHE_HS_INSERT_RESTART 2074
/*!
* cache: history store table out-of-order resolved updates that lose
* their durable timestamp
*/
-#define WT_STAT_DSRC_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 2071
+#define WT_STAT_DSRC_CACHE_HS_ORDER_LOSE_DURABLE_TIMESTAMP 2075
/*!
* 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 2072
+#define WT_STAT_DSRC_CACHE_HS_ORDER_REINSERT 2076
/*! cache: history store table reads */
-#define WT_STAT_DSRC_CACHE_HS_READ 2073
+#define WT_STAT_DSRC_CACHE_HS_READ 2077
/*! cache: history store table reads missed */
-#define WT_STAT_DSRC_CACHE_HS_READ_MISS 2074
+#define WT_STAT_DSRC_CACHE_HS_READ_MISS 2078
/*! cache: history store table reads requiring squashed modifies */
-#define WT_STAT_DSRC_CACHE_HS_READ_SQUASH 2075
+#define WT_STAT_DSRC_CACHE_HS_READ_SQUASH 2079
/*!
* cache: history store table truncation by rollback to stable to remove
* an unstable update
*/
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 2076
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS_UNSTABLE 2080
/*!
* cache: history store table truncation by rollback to stable to remove
* an update
*/
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS 2077
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_RTS 2081
/*! cache: history store table truncation to remove an update */
-#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE 2078
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE 2082
/*!
* 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 2079
+#define WT_STAT_DSRC_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 2083
/*!
* 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 2080
+#define WT_STAT_DSRC_CACHE_HS_ORDER_REMOVE 2084
/*! cache: history store table writes requiring squashed modifies */
-#define WT_STAT_DSRC_CACHE_HS_WRITE_SQUASH 2081
+#define WT_STAT_DSRC_CACHE_HS_WRITE_SQUASH 2085
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_DSRC_CACHE_INMEM_SPLITTABLE 2082
+#define WT_STAT_DSRC_CACHE_INMEM_SPLITTABLE 2086
/*! cache: in-memory page splits */
-#define WT_STAT_DSRC_CACHE_INMEM_SPLIT 2083
+#define WT_STAT_DSRC_CACHE_INMEM_SPLIT 2087
/*! cache: internal pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_INTERNAL 2084
+#define WT_STAT_DSRC_CACHE_EVICTION_INTERNAL 2088
/*! cache: internal pages split during eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_INTERNAL 2085
+#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_INTERNAL 2089
/*! cache: leaf pages split during eviction */
-#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_LEAF 2086
+#define WT_STAT_DSRC_CACHE_EVICTION_SPLIT_LEAF 2090
/*! cache: modified pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_DIRTY 2087
+#define WT_STAT_DSRC_CACHE_EVICTION_DIRTY 2091
/*! cache: overflow pages read into cache */
-#define WT_STAT_DSRC_CACHE_READ_OVERFLOW 2088
+#define WT_STAT_DSRC_CACHE_READ_OVERFLOW 2092
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_DSRC_CACHE_EVICTION_DEEPEN 2089
+#define WT_STAT_DSRC_CACHE_EVICTION_DEEPEN 2093
/*! cache: page written requiring history store records */
-#define WT_STAT_DSRC_CACHE_WRITE_HS 2090
+#define WT_STAT_DSRC_CACHE_WRITE_HS 2094
/*! cache: pages read into cache */
-#define WT_STAT_DSRC_CACHE_READ 2091
+#define WT_STAT_DSRC_CACHE_READ 2095
/*! cache: pages read into cache after truncate */
-#define WT_STAT_DSRC_CACHE_READ_DELETED 2092
+#define WT_STAT_DSRC_CACHE_READ_DELETED 2096
/*! cache: pages read into cache after truncate in prepare state */
-#define WT_STAT_DSRC_CACHE_READ_DELETED_PREPARED 2093
+#define WT_STAT_DSRC_CACHE_READ_DELETED_PREPARED 2097
/*! cache: pages requested from the cache */
-#define WT_STAT_DSRC_CACHE_PAGES_REQUESTED 2094
+#define WT_STAT_DSRC_CACHE_PAGES_REQUESTED 2098
/*! cache: pages seen by eviction walk */
-#define WT_STAT_DSRC_CACHE_EVICTION_PAGES_SEEN 2095
+#define WT_STAT_DSRC_CACHE_EVICTION_PAGES_SEEN 2099
/*! cache: pages written from cache */
-#define WT_STAT_DSRC_CACHE_WRITE 2096
+#define WT_STAT_DSRC_CACHE_WRITE 2100
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_DSRC_CACHE_WRITE_RESTORE 2097
+#define WT_STAT_DSRC_CACHE_WRITE_RESTORE 2101
+/*! cache: the number of times full update inserted to history store */
+#define WT_STAT_DSRC_CACHE_HS_INSERT_FULL_UPDATE 2102
+/*! cache: the number of times reverse modify inserted to history store */
+#define WT_STAT_DSRC_CACHE_HS_INSERT_REVERSE_MODIFY 2103
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_DSRC_CACHE_BYTES_DIRTY 2098
+#define WT_STAT_DSRC_CACHE_BYTES_DIRTY 2104
/*! cache: unmodified pages evicted */
-#define WT_STAT_DSRC_CACHE_EVICTION_CLEAN 2099
+#define WT_STAT_DSRC_CACHE_EVICTION_CLEAN 2105
/*!
* 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 2100
+#define WT_STAT_DSRC_CACHE_STATE_GEN_AVG_GAP 2106
/*!
* 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 2101
+#define WT_STAT_DSRC_CACHE_STATE_AVG_WRITTEN_SIZE 2107
/*!
* 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 2102
+#define WT_STAT_DSRC_CACHE_STATE_AVG_VISITED_AGE 2108
/*!
* 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 2103
+#define WT_STAT_DSRC_CACHE_STATE_AVG_UNVISITED_AGE 2109
/*!
* 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 2104
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_CLEAN 2110
/*!
* cache_walk: Current eviction generation, only reported if cache_walk
* or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_GEN_CURRENT 2105
+#define WT_STAT_DSRC_CACHE_STATE_GEN_CURRENT 2111
/*!
* 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 2106
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_DIRTY 2112
/*!
* 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 2107
+#define WT_STAT_DSRC_CACHE_STATE_ROOT_ENTRIES 2113
/*!
* 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 2108
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_INTERNAL 2114
/*!
* 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 2109
+#define WT_STAT_DSRC_CACHE_STATE_PAGES_LEAF 2115
/*!
* 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 2110
+#define WT_STAT_DSRC_CACHE_STATE_GEN_MAX_GAP 2116
/*!
* cache_walk: Maximum page size seen, only reported if cache_walk or all
* statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_MAX_PAGESIZE 2111
+#define WT_STAT_DSRC_CACHE_STATE_MAX_PAGESIZE 2117
/*!
* 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 2112
+#define WT_STAT_DSRC_CACHE_STATE_MIN_WRITTEN_SIZE 2118
/*!
* 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 2113
+#define WT_STAT_DSRC_CACHE_STATE_UNVISITED_COUNT 2119
/*!
* 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 2114
+#define WT_STAT_DSRC_CACHE_STATE_SMALLER_ALLOC_SIZE 2120
/*!
* 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 2115
+#define WT_STAT_DSRC_CACHE_STATE_MEMORY 2121
/*!
* cache_walk: Pages currently queued for eviction, only reported if
* cache_walk or all statistics are enabled
*/
-#define WT_STAT_DSRC_CACHE_STATE_QUEUED 2116
+#define WT_STAT_DSRC_CACHE_STATE_QUEUED 2122
/*!
* 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 2117
+#define WT_STAT_DSRC_CACHE_STATE_NOT_QUEUEABLE 2123
/*!
* 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 2118
+#define WT_STAT_DSRC_CACHE_STATE_REFS_SKIPPED 2124
/*!
* 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 2119
+#define WT_STAT_DSRC_CACHE_STATE_ROOT_SIZE 2125
/*!
* 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 2120
+#define WT_STAT_DSRC_CACHE_STATE_PAGES 2126
/*! checkpoint-cleanup: pages added for eviction */
-#define WT_STAT_DSRC_CC_PAGES_EVICT 2121
+#define WT_STAT_DSRC_CC_PAGES_EVICT 2127
/*! checkpoint-cleanup: pages removed */
-#define WT_STAT_DSRC_CC_PAGES_REMOVED 2122
+#define WT_STAT_DSRC_CC_PAGES_REMOVED 2128
/*! checkpoint-cleanup: pages skipped during tree walk */
-#define WT_STAT_DSRC_CC_PAGES_WALK_SKIPPED 2123
+#define WT_STAT_DSRC_CC_PAGES_WALK_SKIPPED 2129
/*! checkpoint-cleanup: pages visited */
-#define WT_STAT_DSRC_CC_PAGES_VISITED 2124
+#define WT_STAT_DSRC_CC_PAGES_VISITED 2130
/*!
* compression: compressed page maximum internal page size prior to
* compression
*/
-#define WT_STAT_DSRC_COMPRESS_PRECOMP_INTL_MAX_PAGE_SIZE 2125
+#define WT_STAT_DSRC_COMPRESS_PRECOMP_INTL_MAX_PAGE_SIZE 2131
/*!
* compression: compressed page maximum leaf page size prior to
* compression
*/
-#define WT_STAT_DSRC_COMPRESS_PRECOMP_LEAF_MAX_PAGE_SIZE 2126
+#define WT_STAT_DSRC_COMPRESS_PRECOMP_LEAF_MAX_PAGE_SIZE 2132
/*! compression: compressed pages read */
-#define WT_STAT_DSRC_COMPRESS_READ 2127
+#define WT_STAT_DSRC_COMPRESS_READ 2133
/*! compression: compressed pages written */
-#define WT_STAT_DSRC_COMPRESS_WRITE 2128
+#define WT_STAT_DSRC_COMPRESS_WRITE 2134
/*! compression: page written failed to compress */
-#define WT_STAT_DSRC_COMPRESS_WRITE_FAIL 2129
+#define WT_STAT_DSRC_COMPRESS_WRITE_FAIL 2135
/*! compression: page written was too small to compress */
-#define WT_STAT_DSRC_COMPRESS_WRITE_TOO_SMALL 2130
+#define WT_STAT_DSRC_COMPRESS_WRITE_TOO_SMALL 2136
/*! cursor: Total number of entries skipped by cursor next calls */
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_TOTAL 2131
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_TOTAL 2137
/*! cursor: Total number of entries skipped by cursor prev calls */
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_TOTAL 2132
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_TOTAL 2138
/*!
* cursor: Total number of entries skipped to position the history store
* cursor
*/
-#define WT_STAT_DSRC_CURSOR_SKIP_HS_CUR_POSITION 2133
+#define WT_STAT_DSRC_CURSOR_SKIP_HS_CUR_POSITION 2139
/*!
* cursor: Total number of times a search near has exited due to prefix
* config
*/
-#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2134
+#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2140
/*! cursor: bulk loaded cursor insert calls */
-#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2135
+#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2141
/*! cursor: cache cursors reuse count */
-#define WT_STAT_DSRC_CURSOR_REOPEN 2136
+#define WT_STAT_DSRC_CURSOR_REOPEN 2142
/*! cursor: close calls that result in cache */
-#define WT_STAT_DSRC_CURSOR_CACHE 2137
+#define WT_STAT_DSRC_CURSOR_CACHE 2143
/*! cursor: create calls */
-#define WT_STAT_DSRC_CURSOR_CREATE 2138
+#define WT_STAT_DSRC_CURSOR_CREATE 2144
/*!
* cursor: cursor next calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2139
+#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2145
/*!
* cursor: cursor next calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2140
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2146
/*! cursor: cursor next calls that skip less than 100 entries */
-#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2141
+#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2147
/*!
* cursor: cursor prev calls that skip due to a globally visible history
* store tombstone
*/
-#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2142
+#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2148
/*!
* cursor: cursor prev calls that skip greater than or equal to 100
* entries
*/
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2143
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2149
/*! cursor: cursor prev calls that skip less than 100 entries */
-#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2144
+#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2150
/*! cursor: insert calls */
-#define WT_STAT_DSRC_CURSOR_INSERT 2145
+#define WT_STAT_DSRC_CURSOR_INSERT 2151
/*! cursor: insert key and value bytes */
-#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2146
+#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2152
/*! cursor: modify */
-#define WT_STAT_DSRC_CURSOR_MODIFY 2147
+#define WT_STAT_DSRC_CURSOR_MODIFY 2153
/*! cursor: modify key and value bytes affected */
-#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2148
+#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2154
/*! cursor: modify value bytes modified */
-#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2149
+#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2155
/*! cursor: next calls */
-#define WT_STAT_DSRC_CURSOR_NEXT 2150
+#define WT_STAT_DSRC_CURSOR_NEXT 2156
/*! cursor: open cursor count */
-#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2151
+#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2157
/*! cursor: operation restarted */
-#define WT_STAT_DSRC_CURSOR_RESTART 2152
+#define WT_STAT_DSRC_CURSOR_RESTART 2158
/*! cursor: prev calls */
-#define WT_STAT_DSRC_CURSOR_PREV 2153
+#define WT_STAT_DSRC_CURSOR_PREV 2159
/*! cursor: remove calls */
-#define WT_STAT_DSRC_CURSOR_REMOVE 2154
+#define WT_STAT_DSRC_CURSOR_REMOVE 2160
/*! cursor: remove key bytes removed */
-#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2155
+#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2161
/*! cursor: reserve calls */
-#define WT_STAT_DSRC_CURSOR_RESERVE 2156
+#define WT_STAT_DSRC_CURSOR_RESERVE 2162
/*! cursor: reset calls */
-#define WT_STAT_DSRC_CURSOR_RESET 2157
+#define WT_STAT_DSRC_CURSOR_RESET 2163
/*! cursor: search calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH 2158
+#define WT_STAT_DSRC_CURSOR_SEARCH 2164
/*! cursor: search history store calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2159
+#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2165
/*! cursor: search near calls */
-#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2160
+#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2166
/*! cursor: truncate calls */
-#define WT_STAT_DSRC_CURSOR_TRUNCATE 2161
+#define WT_STAT_DSRC_CURSOR_TRUNCATE 2167
/*! cursor: update calls */
-#define WT_STAT_DSRC_CURSOR_UPDATE 2162
+#define WT_STAT_DSRC_CURSOR_UPDATE 2168
/*! cursor: update key and value bytes */
-#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2163
+#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2169
/*! cursor: update value size change */
-#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2164
+#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2170
/*! reconciliation: approximate byte size of timestamps in pages written */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2165
+#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2171
/*!
* reconciliation: approximate byte size of transaction IDs in pages
* written
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2166
+#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2172
/*! reconciliation: dictionary matches */
-#define WT_STAT_DSRC_REC_DICTIONARY 2167
+#define WT_STAT_DSRC_REC_DICTIONARY 2173
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2168
+#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2174
/*!
* reconciliation: internal page key bytes discarded using suffix
* compression
*/
-#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2169
+#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2175
/*! reconciliation: internal page multi-block writes */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2170
+#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2176
/*! reconciliation: internal-page overflow keys */
-#define WT_STAT_DSRC_REC_OVERFLOW_KEY_INTERNAL 2171
+#define WT_STAT_DSRC_REC_OVERFLOW_KEY_INTERNAL 2177
/*! reconciliation: leaf page key bytes discarded using prefix compression */
-#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2172
+#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2178
/*! reconciliation: leaf page multi-block writes */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2173
+#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2179
/*! reconciliation: leaf-page overflow keys */
-#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2174
+#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2180
/*! reconciliation: maximum blocks required for a page */
-#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2175
+#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2181
/*! reconciliation: overflow values written */
-#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2176
+#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2182
/*! reconciliation: page checksum matches */
-#define WT_STAT_DSRC_REC_PAGE_MATCH 2177
+#define WT_STAT_DSRC_REC_PAGE_MATCH 2183
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_DSRC_REC_PAGES 2178
+#define WT_STAT_DSRC_REC_PAGES 2184
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_DSRC_REC_PAGES_EVICTION 2179
+#define WT_STAT_DSRC_REC_PAGES_EVICTION 2185
/*! reconciliation: pages deleted */
-#define WT_STAT_DSRC_REC_PAGE_DELETE 2180
+#define WT_STAT_DSRC_REC_PAGE_DELETE 2186
/*!
* reconciliation: pages written including an aggregated newest start
* durable timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2181
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2187
/*!
* reconciliation: pages written including an aggregated newest stop
* durable timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2182
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2188
/*!
* reconciliation: pages written including an aggregated newest stop
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2183
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2189
/*!
* reconciliation: pages written including an aggregated newest stop
* transaction ID
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2184
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2190
/*!
* reconciliation: pages written including an aggregated newest
* transaction ID
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2185
+#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2191
/*!
* reconciliation: pages written including an aggregated oldest start
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2186
+#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2192
/*! reconciliation: pages written including an aggregated prepare */
-#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2187
+#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2193
/*! reconciliation: pages written including at least one prepare */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2188
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2194
/*!
* reconciliation: pages written including at least one start durable
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2189
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2195
/*! reconciliation: pages written including at least one start timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2190
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2196
/*!
* reconciliation: pages written including at least one start transaction
* ID
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2191
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2197
/*!
* reconciliation: pages written including at least one stop durable
* timestamp
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2192
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2198
/*! reconciliation: pages written including at least one stop timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2193
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2199
/*!
* reconciliation: pages written including at least one stop transaction
* ID
*/
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2194
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2200
/*! reconciliation: records written including a prepare */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2195
+#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2201
/*! reconciliation: records written including a start durable timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2196
+#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2202
/*! reconciliation: records written including a start timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2197
+#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2203
/*! reconciliation: records written including a start transaction ID */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2198
+#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2204
/*! reconciliation: records written including a stop durable timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2199
+#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2205
/*! reconciliation: records written including a stop timestamp */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2200
+#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2206
/*! reconciliation: records written including a stop transaction ID */
-#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2201
+#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2207
/*! session: object compaction */
-#define WT_STAT_DSRC_SESSION_COMPACT 2202
+#define WT_STAT_DSRC_SESSION_COMPACT 2208
/*! session: tiered operations dequeued and processed */
-#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2203
+#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2209
/*! session: tiered operations scheduled */
-#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2204
+#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2210
/*! session: tiered storage local retention time (secs) */
-#define WT_STAT_DSRC_TIERED_RETENTION 2205
+#define WT_STAT_DSRC_TIERED_RETENTION 2211
/*! session: tiered storage object size */
-#define WT_STAT_DSRC_TIERED_OBJECT_SIZE 2206
+#define WT_STAT_DSRC_TIERED_OBJECT_SIZE 2212
/*! transaction: race to read prepared update retry */
-#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2207
+#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2213
/*!
* 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 2208
+#define WT_STAT_DSRC_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 2214
/*! transaction: rollback to stable inconsistent checkpoint */
-#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2209
+#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2215
/*! transaction: rollback to stable keys removed */
-#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2210
+#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2216
/*! transaction: rollback to stable keys restored */
-#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2211
+#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2217
/*! transaction: rollback to stable restored tombstones from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2212
+#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2218
/*! transaction: rollback to stable restored updates from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2213
+#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2219
/*! transaction: rollback to stable skipping delete rle */
-#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2214
+#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2220
/*! transaction: rollback to stable skipping stable rle */
-#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2215
+#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2221
/*! transaction: rollback to stable sweeping history store keys */
-#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2216
+#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2222
/*! transaction: rollback to stable updates removed from history store */
-#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2217
+#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2223
/*! transaction: transaction checkpoints due to obsolete pages */
-#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2218
+#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2224
/*! transaction: update conflicts */
-#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2219
+#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2225
/*!
* @}
diff --git a/src/third_party/wiredtiger/src/os_common/os_alloc.c b/src/third_party/wiredtiger/src/os_common/os_alloc.c
index 3a8e786484f..93e77805f72 100644
--- a/src/third_party/wiredtiger/src/os_common/os_alloc.c
+++ b/src/third_party/wiredtiger/src/os_common/os_alloc.c
@@ -14,7 +14,17 @@
* to replace C run-time memory management functions with alternatives.
*/
#ifdef HAVE_LIBTCMALLOC
+/*
+ * Include the TCMalloc header with the "-Wundef" diagnostic flag disabled. Compiling with strict
+ * (where the 'Wundef' diagnostic flag is enabled), generates compilation errors where the
+ * '__cplusplus' CPP macro is not defined. This being employed by the TCMalloc header to
+ * differentiate C & C++ compilation environments. We don't want to define '__cplusplus' when
+ * compiling C sources.
+ */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wundef"
#include <gperftools/tcmalloc.h>
+#pragma GCC diagnostic pop
#define calloc tc_calloc
#define malloc tc_malloc
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_col.c b/src/third_party/wiredtiger/src/reconcile/rec_col.c
index 10dd1d9daea..56390a6c50d 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_col.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_col.c
@@ -276,10 +276,15 @@ __wt_rec_col_int(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_REF *pageref)
addr = ref->addr;
if (addr == NULL) {
__wt_cell_unpack_addr(session, page->dsk, ref->addr, vpack);
- val->buf.data = ref->addr;
- val->buf.size = __wt_cell_total_len(vpack);
- val->cell_len = 0;
- val->len = val->buf.size;
+ if (F_ISSET(vpack, WT_CELL_UNPACK_TIME_WINDOW_CLEARED)) {
+ /* Need to rebuild the cell with the updated time info. */
+ __wt_rec_cell_build_addr(session, r, NULL, vpack, false, ref->ref_recno);
+ } else {
+ val->buf.data = ref->addr;
+ val->buf.size = __wt_cell_total_len(vpack);
+ val->cell_len = 0;
+ val->len = val->buf.size;
+ }
WT_TIME_AGGREGATE_COPY(&ta, &vpack->ta);
} else {
__wt_rec_cell_build_addr(session, r, addr, NULL, false, ref->ref_recno);
@@ -291,7 +296,7 @@ __wt_rec_col_int(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_REF *pageref)
if (__wt_rec_need_split(r, val->len))
WT_ERR(__wt_rec_split_crossing_bnd(session, r, val->len, false));
- /* Copy the value onto the page. */
+ /* Copy the value (which is in val, val == r->v) onto the page. */
__wt_rec_image_copy(session, r, val);
WT_TIME_AGGREGATE_MERGE(session, &r->cur_ptr->ta, &ta);
}
diff --git a/src/third_party/wiredtiger/src/session/session_compact.c b/src/third_party/wiredtiger/src/session/session_compact.c
index 9e0ac6ce549..b57a734b29b 100644
--- a/src/third_party/wiredtiger/src/session/session_compact.c
+++ b/src/third_party/wiredtiger/src/session/session_compact.c
@@ -183,13 +183,17 @@ int
__wt_session_compact_check_timeout(WT_SESSION_IMPL *session)
{
struct timespec end;
+ WT_DECL_RET;
if (session->compact->max_time == 0)
return (0);
__wt_epoch(session, &end);
- return (
- session->compact->max_time > WT_TIMEDIFF_SEC(end, session->compact->begin) ? 0 : ETIMEDOUT);
+ ret =
+ session->compact->max_time > WT_TIMEDIFF_SEC(end, session->compact->begin) ? 0 : ETIMEDOUT;
+ if (ret != 0)
+ WT_STAT_CONN_INCR(session, session_table_compact_timeout);
+ return (ret);
}
/*
@@ -208,7 +212,6 @@ __compact_checkpoint(WT_SESSION_IMPL *session)
/* Checkpoints take a lot of time, check if we've run out. */
WT_RET(__wt_session_compact_check_timeout(session));
-
return (__wt_txn_checkpoint(session, checkpoint_cfg, true));
}
@@ -271,6 +274,7 @@ __compact_worker(WT_SESSION_IMPL *session)
*/
if (ret == EBUSY) {
if (__wt_cache_stuck(session)) {
+ WT_STAT_CONN_INCR(session, session_table_compact_fail_cache_pressure);
WT_ERR_MSG(session, EBUSY, "compaction halted by eviction pressure");
}
ret = 0;
@@ -313,6 +317,8 @@ __wt_session_compact(WT_SESSION *wt_session, const char *uri, const char *config
session = (WT_SESSION_IMPL *)wt_session;
SESSION_API_CALL(session, compact, config, cfg);
+ WT_STAT_CONN_SET(session, session_table_compact_running, 1);
+
/*
* The compaction thread should not block when the cache is full: it is holding locks blocking
* checkpoints and once the cache is full, it can spend a long time doing eviction.
@@ -397,6 +403,7 @@ err:
WT_STAT_CONN_INCR(session, session_table_compact_fail);
else
WT_STAT_CONN_INCR(session, session_table_compact_success);
+ WT_STAT_CONN_SET(session, session_table_compact_running, 0);
API_END_RET_NOTFOUND_MAP(session, ret);
}
diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c
index f5ae97c8cea..43527b9092a 100644
--- a/src/third_party/wiredtiger/src/support/stat.c
+++ b/src/third_party/wiredtiger/src/support/stat.c
@@ -27,6 +27,10 @@ static const char *const __stats_dsrc_desc[] = {
"block-manager: minor version number",
"btree: btree checkpoint generation",
"btree: btree clean tree checkpoint expiration time",
+ "btree: btree compact pages reviewed",
+ "btree: btree compact pages selected to be rewritten",
+ "btree: btree compact pages skipped",
+ "btree: btree skipped by compaction as process would not reduce size",
"btree: column-store fixed-size leaf pages",
"btree: column-store internal pages",
"btree: column-store variable-size RLE encoded values",
@@ -108,6 +112,8 @@ static const char *const __stats_dsrc_desc[] = {
"cache: pages seen by eviction walk",
"cache: pages written from cache",
"cache: pages written requiring in-memory restoration",
+ "cache: the number of times full update inserted to history store",
+ "cache: the number of times reverse modify inserted to history store",
"cache: tracked dirty bytes in the cache",
"cache: unmodified pages evicted",
"cache_walk: Average difference between current eviction generation when the page was last "
@@ -297,6 +303,10 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->block_minor = 0;
/* not clearing btree_checkpoint_generation */
/* not clearing btree_clean_checkpoint_timer */
+ /* not clearing btree_compact_pages_reviewed */
+ /* not clearing btree_compact_pages_write_selected */
+ /* not clearing btree_compact_pages_skipped */
+ stats->btree_compact_skipped = 0;
stats->btree_column_fix = 0;
stats->btree_column_internal = 0;
stats->btree_column_rle = 0;
@@ -311,7 +321,7 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->btree_maximum_depth = 0;
stats->btree_entries = 0;
stats->btree_overflow = 0;
- stats->btree_compact_rewrite = 0;
+ stats->btree_compact_pages_rewritten = 0;
stats->btree_row_empty_values = 0;
stats->btree_row_internal = 0;
stats->btree_row_leaf = 0;
@@ -371,6 +381,8 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats)
stats->cache_eviction_pages_seen = 0;
stats->cache_write = 0;
stats->cache_write_restore = 0;
+ stats->cache_hs_insert_full_update = 0;
+ stats->cache_hs_insert_reverse_modify = 0;
/* not clearing cache_bytes_dirty */
stats->cache_eviction_clean = 0;
/* not clearing cache_state_gen_avg_gap */
@@ -536,6 +548,10 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->block_minor = from->block_minor;
to->btree_checkpoint_generation += from->btree_checkpoint_generation;
to->btree_clean_checkpoint_timer += from->btree_clean_checkpoint_timer;
+ to->btree_compact_pages_reviewed += from->btree_compact_pages_reviewed;
+ to->btree_compact_pages_write_selected += from->btree_compact_pages_write_selected;
+ to->btree_compact_pages_skipped += from->btree_compact_pages_skipped;
+ to->btree_compact_skipped += from->btree_compact_skipped;
to->btree_column_fix += from->btree_column_fix;
to->btree_column_internal += from->btree_column_internal;
to->btree_column_rle += from->btree_column_rle;
@@ -557,7 +573,7 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->btree_maximum_depth = from->btree_maximum_depth;
to->btree_entries += from->btree_entries;
to->btree_overflow += from->btree_overflow;
- to->btree_compact_rewrite += from->btree_compact_rewrite;
+ to->btree_compact_pages_rewritten += from->btree_compact_pages_rewritten;
to->btree_row_empty_values += from->btree_row_empty_values;
to->btree_row_internal += from->btree_row_internal;
to->btree_row_leaf += from->btree_row_leaf;
@@ -621,6 +637,8 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to)
to->cache_eviction_pages_seen += from->cache_eviction_pages_seen;
to->cache_write += from->cache_write;
to->cache_write_restore += from->cache_write_restore;
+ to->cache_hs_insert_full_update += from->cache_hs_insert_full_update;
+ to->cache_hs_insert_reverse_modify += from->cache_hs_insert_reverse_modify;
to->cache_bytes_dirty += from->cache_bytes_dirty;
to->cache_eviction_clean += from->cache_eviction_clean;
to->cache_state_gen_avg_gap += from->cache_state_gen_avg_gap;
@@ -780,6 +798,11 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->block_minor = v;
to->btree_checkpoint_generation += WT_STAT_READ(from, btree_checkpoint_generation);
to->btree_clean_checkpoint_timer += WT_STAT_READ(from, btree_clean_checkpoint_timer);
+ to->btree_compact_pages_reviewed += WT_STAT_READ(from, btree_compact_pages_reviewed);
+ to->btree_compact_pages_write_selected +=
+ WT_STAT_READ(from, btree_compact_pages_write_selected);
+ to->btree_compact_pages_skipped += WT_STAT_READ(from, btree_compact_pages_skipped);
+ 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_internal += WT_STAT_READ(from, btree_column_internal);
to->btree_column_rle += WT_STAT_READ(from, btree_column_rle);
@@ -801,7 +824,7 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->btree_maximum_depth = v;
to->btree_entries += WT_STAT_READ(from, btree_entries);
to->btree_overflow += WT_STAT_READ(from, btree_overflow);
- to->btree_compact_rewrite += WT_STAT_READ(from, btree_compact_rewrite);
+ to->btree_compact_pages_rewritten += WT_STAT_READ(from, btree_compact_pages_rewritten);
to->btree_row_empty_values += WT_STAT_READ(from, btree_row_empty_values);
to->btree_row_internal += WT_STAT_READ(from, btree_row_internal);
to->btree_row_leaf += WT_STAT_READ(from, btree_row_leaf);
@@ -872,6 +895,8 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to)
to->cache_eviction_pages_seen += WT_STAT_READ(from, cache_eviction_pages_seen);
to->cache_write += WT_STAT_READ(from, cache_write);
to->cache_write_restore += WT_STAT_READ(from, cache_write_restore);
+ to->cache_hs_insert_full_update += WT_STAT_READ(from, cache_hs_insert_full_update);
+ to->cache_hs_insert_reverse_modify += WT_STAT_READ(from, cache_hs_insert_reverse_modify);
to->cache_bytes_dirty += WT_STAT_READ(from, cache_bytes_dirty);
to->cache_eviction_clean += WT_STAT_READ(from, cache_eviction_clean);
to->cache_state_gen_avg_gap += WT_STAT_READ(from, cache_state_gen_avg_gap);
@@ -1172,6 +1197,8 @@ static const char *const __stats_connection_desc[] = {
"cache: pages written from cache",
"cache: pages written requiring in-memory restoration",
"cache: percentage overhead",
+ "cache: the number of times full update inserted to history store",
+ "cache: the number of times reverse modify inserted to history store",
"cache: tracked bytes belonging to internal pages in the cache",
"cache: tracked bytes belonging to leaf pages in the cache",
"cache: tracked dirty bytes in the cache",
@@ -1403,7 +1430,11 @@ static const char *const __stats_connection_desc[] = {
"session: table alter triggering checkpoint calls",
"session: table alter unchanged and skipped",
"session: table compact failed calls",
+ "session: table compact failed calls due to cache pressure",
+ "session: table compact running",
+ "session: table compact skipped as process would not reduce file size",
"session: table compact successful calls",
+ "session: table compact timeout",
"session: table create failed calls",
"session: table create successful calls",
"session: table drop failed calls",
@@ -1707,6 +1738,8 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_write = 0;
stats->cache_write_restore = 0;
/* not clearing cache_overhead */
+ stats->cache_hs_insert_full_update = 0;
+ stats->cache_hs_insert_reverse_modify = 0;
/* not clearing cache_bytes_internal */
/* not clearing cache_bytes_leaf */
/* not clearing cache_bytes_dirty */
@@ -1937,7 +1970,11 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
/* not clearing session_table_alter_trigger_checkpoint */
/* not clearing session_table_alter_skip */
/* not clearing session_table_compact_fail */
+ /* not clearing session_table_compact_fail_cache_pressure */
+ /* not clearing session_table_compact_running */
+ /* not clearing session_table_compact_skipped */
/* not clearing session_table_compact_success */
+ /* not clearing session_table_compact_timeout */
/* not clearing session_table_create_fail */
/* not clearing session_table_create_success */
/* not clearing session_table_drop_fail */
@@ -2244,6 +2281,8 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
to->cache_write += WT_STAT_READ(from, cache_write);
to->cache_write_restore += WT_STAT_READ(from, cache_write_restore);
to->cache_overhead += WT_STAT_READ(from, cache_overhead);
+ to->cache_hs_insert_full_update += WT_STAT_READ(from, cache_hs_insert_full_update);
+ to->cache_hs_insert_reverse_modify += WT_STAT_READ(from, cache_hs_insert_reverse_modify);
to->cache_bytes_internal += WT_STAT_READ(from, cache_bytes_internal);
to->cache_bytes_leaf += WT_STAT_READ(from, cache_bytes_leaf);
to->cache_bytes_dirty += WT_STAT_READ(from, cache_bytes_dirty);
@@ -2484,7 +2523,12 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS *
WT_STAT_READ(from, session_table_alter_trigger_checkpoint);
to->session_table_alter_skip += WT_STAT_READ(from, session_table_alter_skip);
to->session_table_compact_fail += WT_STAT_READ(from, session_table_compact_fail);
+ to->session_table_compact_fail_cache_pressure +=
+ WT_STAT_READ(from, session_table_compact_fail_cache_pressure);
+ to->session_table_compact_running += WT_STAT_READ(from, session_table_compact_running);
+ to->session_table_compact_skipped += WT_STAT_READ(from, session_table_compact_skipped);
to->session_table_compact_success += WT_STAT_READ(from, session_table_compact_success);
+ to->session_table_compact_timeout += WT_STAT_READ(from, session_table_compact_timeout);
to->session_table_create_fail += WT_STAT_READ(from, session_table_create_fail);
to->session_table_create_success += WT_STAT_READ(from, session_table_create_success);
to->session_table_drop_fail += WT_STAT_READ(from, session_table_drop_fail);
diff --git a/src/third_party/wiredtiger/src/txn/txn.c b/src/third_party/wiredtiger/src/txn/txn.c
index 754860845ad..f113463a1ef 100644
--- a/src/third_party/wiredtiger/src/txn/txn.c
+++ b/src/third_party/wiredtiger/src/txn/txn.c
@@ -1181,6 +1181,7 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit,
WT_CURSOR_BTREE *cbt;
WT_DECL_RET;
WT_ITEM hs_recno_key;
+ WT_PAGE *page;
WT_TXN *txn;
WT_UPDATE *first_committed_upd, *fix_upd, *tombstone, *upd;
#ifdef HAVE_DIAGNOSTIC
@@ -1239,6 +1240,14 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit,
;
/*
+ * Get the underlying btree and the in-memory page with the prepared updates that are to be
+ * resolved. The hazard pointer on the page is already acquired during the cursor search
+ * operation to prevent eviction evicting the page while resolving the prepared updates.
+ */
+ cbt = (WT_CURSOR_BTREE *)(*cursorp);
+ page = cbt->ref->page;
+
+ /*
* Locate the previous update from the history store and append it to the update chain if
* required. We know there may be content in the history store if the prepared update is written
* to the disk image or first committed update older than the prepared update is marked as
@@ -1262,7 +1271,6 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit,
first_committed_upd != NULL && F_ISSET(first_committed_upd, WT_UPDATE_HS);
if (prepare_on_disk || first_committed_upd_in_hs) {
btree = S2BT(session);
- cbt = (WT_CURSOR_BTREE *)(*cursorp);
/*
* Open a history store table cursor and scan the history store for the given btree and key
@@ -1305,8 +1313,8 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit,
WT_ERR(ret);
tombstone = NULL;
} else if (ret == 0)
- WT_ERR(__txn_locate_hs_record(session, hs_cursor, cbt->ref->page, upd, commit, &fix_upd,
- &upd_appended, first_committed_upd));
+ WT_ERR(__txn_locate_hs_record(
+ session, hs_cursor, page, upd, commit, &fix_upd, &upd_appended, first_committed_upd));
else
ret = 0;
}
@@ -1368,8 +1376,7 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit,
}
/* Mark the page dirty once the prepared updates are resolved. */
- cbt = (WT_CURSOR_BTREE *)(*cursorp);
- __wt_page_modify_set(session, cbt->ref->page);
+ __wt_page_modify_set(session, page);
/*
* Fix the history store contents if they exist, when there are no more updates in the update
diff --git a/src/third_party/wiredtiger/test/cppsuite/Makefile.am b/src/third_party/wiredtiger/test/cppsuite/Makefile.am
index 5e896ce2e04..8221f882014 100644
--- a/src/third_party/wiredtiger/test/cppsuite/Makefile.am
+++ b/src/third_party/wiredtiger/test/cppsuite/Makefile.am
@@ -15,6 +15,7 @@ test_harness = test_harness/core/component.cxx \
test_harness/core/configuration.cxx \
test_harness/core/throttle.cxx \
test_harness/util/logger.cxx \
+ test_harness/util/scoped_connection.cxx \
test_harness/util/scoped_types.cxx \
test_harness/workload/database_model.cxx \
test_harness/workload/database_operation.cxx \
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.cxx
index 8a8b75b7b8f..292cfbbfeab 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.cxx
@@ -29,6 +29,7 @@
#include "connection_manager.h"
#include "util/api_const.h"
#include "util/logger.h"
+#include "util/scoped_connection.h"
namespace test_harness {
connection_manager &
@@ -73,9 +74,8 @@ connection_manager::create_session()
testutil_die(EINVAL, "Connection is NULL");
}
- _conn_mutex.lock();
+ std::lock_guard<std::mutex> lg(_conn_mutex);
scoped_session session(_conn);
- _conn_mutex.unlock();
return (session);
}
@@ -92,9 +92,8 @@ connection_manager::get_connection()
void
connection_manager::set_timestamp(const std::string &config)
{
- _conn_mutex.lock();
+ std::lock_guard<std::mutex> lg(_conn_mutex);
testutil_check(_conn->set_timestamp(_conn, config.c_str()));
- _conn_mutex.unlock();
}
connection_manager::connection_manager() {}
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.h
index a5d44903717..2fef81d2af8 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/connection_manager.h
@@ -61,7 +61,7 @@ class connection_manager {
connection_manager &operator=(connection_manager const &) = delete;
void close();
- void create(const std::string &config, const std::string &home = DEFAULT_DIR);
+ void create(const std::string &config, const std::string &home);
scoped_session create_session();
WT_CONNECTION *get_connection();
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/component.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/component.h
index 398ca11e442..65a2215cdac 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/component.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/component.h
@@ -39,7 +39,7 @@ namespace test_harness {
*/
class component {
public:
- component(const std::string &name, configuration *config);
+ explicit component(const std::string &name, configuration *config);
virtual ~component();
/* Delete the copy constructor and the assignment operator. */
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.cxx
index b6c53397955..3a785f395ad 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.cxx
@@ -258,6 +258,14 @@ configuration::split_config(const std::string &config)
in_subconfig = !parens.empty();
}
if (cut_config[i] == '=' && !in_subconfig) {
+ if (len == 0) {
+ testutil_die(EINVAL, "error parsing config: detected empty key");
+ }
+ if (expect_value) {
+ testutil_die(EINVAL,
+ "error parsing config: syntax error parsing value for key ['%s']: '%s'",
+ key.c_str(), cut_config.substr(start, len).c_str());
+ }
expect_value = true;
key = cut_config.substr(start, len);
start += len + 1;
@@ -265,6 +273,15 @@ configuration::split_config(const std::string &config)
continue;
}
if (cut_config[i] == ',' && !in_subconfig) {
+ if (len == 0) {
+ testutil_die(
+ EINVAL, "error parsing config: detected empty value for key:'%s'", key.c_str());
+ }
+ if (!expect_value) {
+ testutil_die(EINVAL,
+ "error parsing config: syntax error parsing key value pair: '%s'",
+ cut_config.substr(start, len).c_str());
+ }
expect_value = false;
if (start + len >= cut_config.size())
break;
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.h
index f34465904ad..4c7aeb0ac3f 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/core/configuration.h
@@ -60,8 +60,8 @@ split_string(const std::string &str, const char delim)
class configuration {
public:
- configuration(const std::string &test_config_name, const std::string &config);
- configuration(const WT_CONFIG_ITEM &nested);
+ explicit configuration(const std::string &test_config_name, const std::string &config);
+ explicit configuration(const WT_CONFIG_ITEM &nested);
~configuration();
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.cxx
index 0e454a4f4f0..d123ae9f7c8 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.cxx
@@ -80,7 +80,7 @@ runtime_statistic::enabled() const
/* cache_limit_statistic class implementation */
cache_limit_statistic::cache_limit_statistic(configuration *config) : runtime_statistic(config)
{
- limit = config->get_int(LIMIT);
+ _limit = config->get_int(LIMIT);
}
void
@@ -98,9 +98,9 @@ cache_limit_statistic::check(scoped_cursor &cursor)
* point conversion errors.
*/
use_percent = ((cache_bytes_image + cache_bytes_other + 0.0) / cache_bytes_max) * 100;
- if (use_percent > limit) {
+ if (use_percent > _limit) {
const std::string error_string =
- "runtime_monitor: Cache usage exceeded during test! Limit: " + std::to_string(limit) +
+ "runtime_monitor: Cache usage exceeded during test! Limit: " + std::to_string(_limit) +
" usage: " + std::to_string(use_percent);
testutil_die(-1, error_string.c_str());
} else
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.h
index 0f63585290d..4ee0d1055ba 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/runtime_monitor.h
@@ -48,13 +48,11 @@ namespace test_harness {
class runtime_statistic {
public:
explicit runtime_statistic(configuration *config);
+ virtual ~runtime_statistic() = default;
/* Check that the given statistic is within bounds. */
virtual void check(scoped_cursor &cursor) = 0;
- /* Suppress warning about destructor being non-virtual. */
- virtual ~runtime_statistic() {}
-
bool enabled() const;
protected:
@@ -64,16 +62,17 @@ class runtime_statistic {
class cache_limit_statistic : public runtime_statistic {
public:
explicit cache_limit_statistic(configuration *config);
+ virtual ~cache_limit_statistic() = default;
void check(scoped_cursor &cursor) override final;
private:
- int64_t limit;
+ int64_t _limit;
};
class db_size_statistic : public runtime_statistic {
public:
- db_size_statistic(configuration *config, database &database);
+ explicit db_size_statistic(configuration *config, database &database);
virtual ~db_size_statistic() = default;
/* Don't need the stat cursor for this. */
@@ -90,7 +89,6 @@ class db_size_statistic : public runtime_statistic {
class postrun_statistic_check {
public:
explicit postrun_statistic_check(configuration *config);
- virtual ~postrun_statistic_check() = default;
void check(scoped_cursor &cursor) const;
@@ -119,7 +117,7 @@ class runtime_monitor : public component {
static void get_stat(scoped_cursor &, int, int64_t *);
public:
- runtime_monitor(configuration *config, database &database);
+ explicit runtime_monitor(configuration *config, database &database);
~runtime_monitor();
/* Delete the copy constructor and the assignment operator. */
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/test.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/test.cxx
index 4ce0de2e381..8cdea3170df 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/test.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/test.cxx
@@ -119,8 +119,12 @@ test::run()
/* Add the user supplied wiredtiger open config. */
db_create_config += _args.wt_open_config;
- /* Set up the test environment. */
- connection_manager::instance().create(db_create_config);
+ /*
+ * Set up the test environment. A smart pointer is used here so that the connection can
+ * automatically be closed by the scoped_connection's destructor when the test finishes and the
+ * pointer goes out of scope.
+ */
+ _scoped_conn = std::make_shared<scoped_connection>(db_create_config);
/* Initiate the load stage of each component. */
for (const auto &it : _components)
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/test.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/test.h
index 8c5e2d17434..ba899339bb0 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/test.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/test.h
@@ -39,6 +39,7 @@ extern "C" {
#include "checkpoint_manager.h"
#include "connection_manager.h"
#include "runtime_monitor.h"
+#include "util/scoped_connection.h"
#include "workload/database_operation.h"
#include "workload_generator.h"
@@ -59,8 +60,8 @@ class test_args {
*/
class test : public database_operation {
public:
- test(const test_args &args);
- ~test();
+ explicit test(const test_args &args);
+ virtual ~test();
/* Delete the copy constructor and the assignment operator. */
test(const test &) = delete;
@@ -92,18 +93,8 @@ class test : public database_operation {
timestamp_manager *_timestamp_manager = nullptr;
workload_generator *_workload_generator = nullptr;
workload_tracking *_workload_tracking = nullptr;
- /*
- * FIX-ME-Test-Framework: We can't put this code in the destructor of `test` since it will run
- * before the destructors of each of our members (meaning that sessions will get closed after
- * the connection gets closed). To work around this, we've added a member with a destructor that
- * closes the connection.
- */
- struct connection_closer {
- ~connection_closer()
- {
- connection_manager::instance().close();
- }
- } _connection_closer;
+
+ std::shared_ptr<scoped_connection> _scoped_conn;
database _database;
};
} // namespace test_harness
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/timestamp_manager.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/timestamp_manager.h
index e510614d077..c10d10df5c0 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/timestamp_manager.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/timestamp_manager.h
@@ -50,7 +50,8 @@ class timestamp_manager : public component {
static const std::string decimal_to_hex(uint64_t value);
public:
- timestamp_manager(configuration *config);
+ explicit timestamp_manager(configuration *config);
+ virtual ~timestamp_manager() = default;
void load() override final;
void do_work() override final;
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.cxx
new file mode 100644
index 00000000000..39a8fede916
--- /dev/null
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.cxx
@@ -0,0 +1,46 @@
+/*-
+ * 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.
+ */
+#include <iostream>
+#include <utility>
+
+#include "../connection_manager.h"
+#include "scoped_connection.h"
+
+namespace test_harness {
+
+scoped_connection::scoped_connection(const std::string &db_conn_config, const std::string &home)
+{
+ connection_manager::instance().create(db_conn_config, home);
+}
+
+scoped_connection::~scoped_connection()
+{
+ connection_manager::instance().close();
+}
+
+} // namespace test_harness
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.h
new file mode 100644
index 00000000000..6e999b6db54
--- /dev/null
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_connection.h
@@ -0,0 +1,56 @@
+/*-
+ * 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.
+ */
+
+#ifndef SCOPED_CONNECTION_H
+#define SCOPED_CONNECTION_H
+
+/* Following definitions are required in order to use printing format specifiers in C++. */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+#endif
+#ifndef __STDC_FORMAT_MACROS
+#define __STDC_FORMAT_MACROS
+#endif
+
+extern "C" {
+#include "test_util.h"
+}
+
+#include "../connection_manager.h"
+
+namespace test_harness {
+
+class scoped_connection {
+ public:
+ explicit scoped_connection(
+ const std::string &db_conn_config, const std::string &home = DEFAULT_DIR);
+ ~scoped_connection();
+};
+
+} // namespace test_harness
+#endif
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_types.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_types.h
index edb38e3e22c..71fc24f6c26 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_types.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/util/scoped_types.h
@@ -45,12 +45,12 @@ namespace test_harness {
class scoped_cursor {
public:
scoped_cursor() = default;
- scoped_cursor(WT_SESSION *session, const char *uri, const char *cfg);
+ explicit scoped_cursor(WT_SESSION *session, const char *uri, const char *cfg);
/* Moving is ok but copying is not. */
scoped_cursor(scoped_cursor &&other);
- virtual ~scoped_cursor();
+ ~scoped_cursor();
scoped_cursor &operator=(scoped_cursor &&other);
scoped_cursor(const scoped_cursor &) = delete;
@@ -72,7 +72,7 @@ class scoped_session {
scoped_session() = default;
explicit scoped_session(WT_CONNECTION *conn);
- virtual ~scoped_session();
+ ~scoped_session();
/* Moving is ok but copying is not. */
scoped_session(scoped_session &&other);
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_model.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_model.h
index edbb5bd2675..c8d54524873 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_model.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_model.h
@@ -45,7 +45,7 @@ typedef std::string key_value_t;
/* A collection is made of mapped key value objects. */
class collection {
public:
- collection(const uint64_t id, const uint64_t key_count, const std::string &name);
+ explicit collection(const uint64_t id, const uint64_t key_count, const std::string &name);
/* Copies aren't allowed. */
collection(const collection &) = delete;
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.cxx
index 2f85cab681e..402a1e5237e 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.cxx
@@ -287,7 +287,7 @@ database_operation::update_operation(thread_context *tc)
/* Commit the current transaction if we're able to. */
if (tc->transaction.can_commit())
- tc->transaction.commit();
+ WT_IGNORE_RET(tc->transaction.commit());
}
/* Make sure the last operation is rolled back now the work is finished. */
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.h
index c8dd7370b0f..767ef50c5b7 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/database_operation.h
@@ -57,6 +57,8 @@ class database_operation {
* Basic update operation that chooses a random key and updates it.
*/
virtual void update_operation(thread_context *tc);
+
+ virtual ~database_operation() = default;
};
} // namespace test_harness
#endif
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/thread_context.cxx b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/thread_context.cxx
index f087d45cd06..8c8c4f10f88 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/thread_context.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/thread_context.cxx
@@ -91,11 +91,11 @@ transaction_context::commit(const std::string &config)
{
WT_DECL_RET;
testutil_assert(_in_txn && !_needs_rollback);
- if ((ret = _session->commit_transaction(_session, config.empty() ? nullptr : config.c_str())) !=
- 0) {
+ ret = _session->commit_transaction(_session, config.empty() ? nullptr : config.c_str());
+ testutil_assert(ret == 0 || ret == WT_ROLLBACK);
+ if (ret != 0)
logger::log_msg(LOG_WARN,
"Failed to commit transaction in commit, received error code: " + std::to_string(ret));
- }
_op_count = 0;
_in_txn = false;
return (ret == 0);
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/workload_tracking.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/workload_tracking.h
index 704f26ac84b..b6c232376c7 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/workload_tracking.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload/workload_tracking.h
@@ -58,9 +58,10 @@ enum class tracking_operation { CREATE_COLLECTION, DELETE_COLLECTION, DELETE_KEY
/* Class used to track operations performed on collections */
class workload_tracking : public component {
public:
- workload_tracking(configuration *_config, const std::string &operation_table_config,
+ explicit workload_tracking(configuration *_config, const std::string &operation_table_config,
const std::string &operation_table_name, const std::string &schema_table_config,
const std::string &schema_table_name, const bool use_compression, timestamp_manager &tsm);
+ virtual ~workload_tracking() = default;
const std::string &get_schema_table_name() const;
const std::string &get_operation_table_name() const;
diff --git a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload_generator.h b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload_generator.h
index e29410f6116..78950b18677 100644
--- a/src/third_party/wiredtiger/test/cppsuite/test_harness/workload_generator.h
+++ b/src/third_party/wiredtiger/test/cppsuite/test_harness/workload_generator.h
@@ -48,7 +48,7 @@ namespace test_harness {
*/
class operation_config {
public:
- operation_config(configuration *config, thread_type type);
+ explicit operation_config(configuration *config, thread_type type);
/* Returns a function pointer to the member function of the supplied database operation. */
std::function<void(test_harness::thread_context *)> get_func(database_operation *dbo);
@@ -64,7 +64,7 @@ class operation_config {
*/
class workload_generator : public component {
public:
- workload_generator(configuration *configuration, database_operation *db_operation,
+ explicit workload_generator(configuration *configuration, database_operation *db_operation,
timestamp_manager *timestamp_manager, workload_tracking *tracking, database &database);
~workload_generator();
diff --git a/src/third_party/wiredtiger/test/cppsuite/tests/csuite_style_example_test.cxx b/src/third_party/wiredtiger/test/cppsuite/tests/csuite_style_example_test.cxx
index d0059880446..bcacf115665 100644
--- a/src/third_party/wiredtiger/test/cppsuite/tests/csuite_style_example_test.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/tests/csuite_style_example_test.cxx
@@ -37,6 +37,7 @@
#include "test_harness/thread_manager.h"
#include "test_harness/util/api_const.h"
#include "test_harness/util/logger.h"
+#include "test_harness/util/scoped_connection.h"
#include "test_harness/workload/random_generator.h"
extern "C" {
@@ -94,7 +95,11 @@ main(int argc, char *argv[])
/* Create a connection, set the cache size and specify the home directory. */
const std::string conn_config = std::string(CONNECTION_CREATE) + ",cache_size=500MB";
const std::string home_dir = std::string(DEFAULT_DIR) + '_' + progname;
- connection_manager::instance().create(conn_config, home_dir);
+ /*
+ * A smart pointer is used here so that the connection can automatically be closed by the
+ * scoped_connection's destructor when the test finishes and the pointer goes out of scope.
+ */
+ std::unique_ptr<scoped_connection> scoped_conn(new scoped_connection(conn_config, home_dir));
WT_CONNECTION *conn = connection_manager::instance().get_connection();
/* Open different sessions. */
@@ -159,9 +164,6 @@ main(int argc, char *argv[])
for (auto c : cursors)
testutil_check(c->close(c));
- /* Close the connection. */
- connection_manager::instance().close();
-
/* Another message. */
logger::log_msg(LOG_INFO, "End of test.");
diff --git a/src/third_party/wiredtiger/test/cppsuite/tests/example_test.cxx b/src/third_party/wiredtiger/test/cppsuite/tests/example_test.cxx
index 4b49ad2b148..c5f344ac1df 100644
--- a/src/third_party/wiredtiger/test/cppsuite/tests/example_test.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/tests/example_test.cxx
@@ -37,7 +37,7 @@ class example_test : public test_harness::test {
example_test(const test_harness::test_args &args) : test(args) {}
void
- run()
+ run() override final
{
/* You can remove the call to the base class to fully customized your test. */
test::run();
diff --git a/src/third_party/wiredtiger/test/cppsuite/tests/hs_cleanup.cxx b/src/third_party/wiredtiger/test/cppsuite/tests/hs_cleanup.cxx
index 5a828f865f5..fc17f0c5efe 100644
--- a/src/third_party/wiredtiger/test/cppsuite/tests/hs_cleanup.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/tests/hs_cleanup.cxx
@@ -51,6 +51,8 @@ class hs_cleanup : public test {
LOG_INFO, type_string(tc->type) + " thread {" + std::to_string(tc->id) + "} commencing.");
const char *key_tmp;
+ const uint64_t MAX_ROLLBACKS = 100;
+ uint32_t rollback_retries = 0;
collection &coll = tc->db.get_collection(tc->id);
@@ -93,11 +95,16 @@ class hs_cleanup : public test {
*/
if (tc->update(cursor, coll.id, key_value_t(key_tmp))) {
if (tc->transaction.can_commit()) {
- tc->transaction.commit();
+ if (tc->transaction.commit())
+ rollback_retries = 0;
+ else
+ ++rollback_retries;
}
} else {
tc->transaction.rollback();
+ ++rollback_retries;
}
+ testutil_assert(rollback_retries < MAX_ROLLBACKS);
}
/* Ensure our last transaction is resolved. */
if (tc->transaction.active())
diff --git a/src/third_party/wiredtiger/test/cppsuite/tests/search_near_01.cxx b/src/third_party/wiredtiger/test/cppsuite/tests/search_near_01.cxx
index abacf3dc196..20bcebff4a0 100644
--- a/src/third_party/wiredtiger/test/cppsuite/tests/search_near_01.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/tests/search_near_01.cxx
@@ -55,7 +55,6 @@ class search_near_01 : public test_harness::test {
uint64_t collections_per_thread = tc->collection_count;
const uint64_t MAX_ROLLBACKS = 100;
uint32_t rollback_retries = 0;
- int cmpp;
/*
* Generate a table of data with prefix keys aaa -> zzz. We have 26 threads from ids
@@ -84,8 +83,8 @@ class search_near_01 : public test_harness::test {
--count;
} else {
/* Commit txn at commit timestamp 100. */
- tc->transaction.commit(
- "commit_timestamp=" + tc->tsm->decimal_to_hex(100));
+ testutil_assert(tc->transaction.commit(
+ "commit_timestamp=" + tc->tsm->decimal_to_hex(100)));
rollback_retries = 0;
}
}
@@ -254,7 +253,6 @@ class search_near_01 : public test_harness::test {
/* Reset our cursor to avoid pinning content. */
testutil_check(cursor->reset(cursor.get()));
}
- tc->transaction.commit();
/* Make sure the last transaction is rolled back now the work is finished. */
if (tc->transaction.active())
tc->transaction.rollback();
diff --git a/src/third_party/wiredtiger/test/cppsuite/tests/search_near_02.cxx b/src/third_party/wiredtiger/test/cppsuite/tests/search_near_02.cxx
index 1df75a83bc0..58c3047dfa9 100644
--- a/src/third_party/wiredtiger/test/cppsuite/tests/search_near_02.cxx
+++ b/src/third_party/wiredtiger/test/cppsuite/tests/search_near_02.cxx
@@ -95,7 +95,9 @@ class search_near_02 : public test_harness::test {
}
std::string key;
+ const uint64_t MAX_ROLLBACKS = 100;
uint64_t counter = 0;
+ uint32_t rollback_retries = 0;
while (tc->running()) {
@@ -109,12 +111,18 @@ class search_near_02 : public test_harness::test {
/* Insert a key value pair. */
if (tc->insert(cc.cursor, cc.coll.id, key)) {
- if (tc->transaction.can_commit())
+ if (tc->transaction.can_commit()) {
/* We are not checking the result of commit as it is not necessary. */
- tc->transaction.commit();
+ if (tc->transaction.commit())
+ rollback_retries = 0;
+ else
+ ++rollback_retries;
+ }
} else {
tc->transaction.rollback();
+ ++rollback_retries;
}
+ testutil_assert(rollback_retries < MAX_ROLLBACKS);
/* Sleep the duration defined by the configuration. */
tc->sleep();
@@ -268,7 +276,6 @@ class search_near_02 : public test_harness::test {
{
const char *k;
std::string k_str;
- int ret;
/*
* The prefix search near call cannot retrieve a key with a smaller value than the prefix we
diff --git a/src/third_party/wiredtiger/test/csuite/wt7989_compact_checkpoint/main.c b/src/third_party/wiredtiger/test/csuite/wt7989_compact_checkpoint/main.c
index a93d83b0985..8cd8c4b3e77 100644
--- a/src/third_party/wiredtiger/test/csuite/wt7989_compact_checkpoint/main.c
+++ b/src/third_party/wiredtiger/test/csuite/wt7989_compact_checkpoint/main.c
@@ -48,6 +48,7 @@ static const char conn_config[] = "create,cache_size=2GB,statistics=(all)";
static const char table_config[] =
"allocation_size=4KB,leaf_page_max=4KB,key_format=i,value_format=QQQS";
static char data_str[1024] = "";
+static pthread_t thread_compact;
/* Structures definition. */
struct thread_data {
@@ -105,7 +106,7 @@ run_test(bool stress_test, const char *home, const char *uri)
struct thread_data td;
WT_CONNECTION *conn;
WT_SESSION *session;
- pthread_t thread_checkpoint, thread_compact;
+ pthread_t thread_checkpoint;
uint64_t file_sz_after, file_sz_before;
testutil_make_work_dir(home);
@@ -147,8 +148,8 @@ run_test(bool stress_test, const char *home, const char *uri)
/* Create and initialize conditional variable. */
testutil_check(__wt_cond_alloc((WT_SESSION_IMPL *)session, "compact operation", &td.cond));
+ /* The checkpoint thread will spawn the compact thread when it's ready. */
testutil_check(pthread_create(&thread_checkpoint, NULL, thread_func_checkpoint, &td));
- testutil_check(pthread_create(&thread_compact, NULL, thread_func_compact, &td));
}
/* Wait for the threads to finish the work. */
@@ -188,12 +189,6 @@ thread_func_compact(void *arg)
testutil_check(td->conn->open_session(td->conn, NULL, NULL, &session));
if (td->cond != NULL) {
- /*
- * Make sure checkpoint thread is initialized and waiting for the signal. Sleep for one
- * second.
- */
- __wt_sleep(1, 0);
-
/* Wake up the checkpoint thread. */
printf("Sending the signal!\n");
__wt_cond_signal((WT_SESSION_IMPL *)session, td->cond);
@@ -237,6 +232,12 @@ thread_func_checkpoint(void *arg)
__wt_random_init_seed((WT_SESSION_IMPL *)session, &rnd);
if (td->cond != NULL) {
+ /*
+ * Spawn the compact thread here to make sure the both threads are ready for the synced
+ * start.
+ */
+ testutil_check(pthread_create(&thread_compact, NULL, thread_func_compact, td));
+
printf("Waiting for the signal...\n");
/*
* Wait for the signal and time out after 20 seconds. wait_run_check is required because the
diff --git a/src/third_party/wiredtiger/test/evergreen.yml b/src/third_party/wiredtiger/test/evergreen.yml
index a775a9aec7a..6b100d1d431 100755
--- a/src/third_party/wiredtiger/test/evergreen.yml
+++ b/src/third_party/wiredtiger/test/evergreen.yml
@@ -1,9 +1,31 @@
#
# This file defines the tasks and platforms for WiredTiger in the
-# MongoDB continuous integration system (see https://mci.mongodb.com).
+# MongoDB continuous integration system (https://evergreen.mongodb.com).
#
+#######################################
+# Project Settings #
+#######################################
+
+stepback: true
+pre:
+ - func: "cleanup"
+post:
+ - func: "upload artifact"
+ vars:
+ postfix: -${execution}
+ - func: "save wt hang analyzer core/debugger files"
+ - func: "dump stderr/stdout"
+ - func: "cleanup"
+timeout:
+ - func: "run wt hang analyzer"
+
+#######################################
+# Functions #
+#######################################
+
functions:
+
"get project" :
command: git.get_project
params:
@@ -100,8 +122,15 @@ functions:
working_dir: "wiredtiger"
shell: bash
script: |
+ # Fetch the gperftools library.
+ if [[ "${posix_configure_flags|}" =~ (tcmalloc|TCMALLOC) ]]; then
+ 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|false}
+ fi
+
set -o errexit
set -o verbose
+
# Check if the build variant has specified a build type, always default to
# Autoconf/Libtool if $is_cmake_build is not declared.
if [ ${is_cmake_build|false} = true ]; then
@@ -291,11 +320,18 @@ functions:
done
- command: shell.exec
params:
- working_dir: "wiredtiger.github.com"
shell: bash
silent: true
script: |
set -o errexit
+
+ # We could have exited the previous command for the same reason.
+ if [[ "${branch_name}" != "develop" ]]; then
+ echo "We only run the documentation update task on the WiredTiger (develop) Evergreen project."
+ exit 0
+ fi
+
+ cd wiredtiger.github.com
git push https://"${doc-update-github-token}"@github.com/wiredtiger/wiredtiger.github.com
"make check directory":
@@ -583,15 +619,18 @@ functions:
display_name: "Test results (JSON)"
remote_file: wiredtiger/${build_variant}/${revision}/perf-test-${perf-test-name}-${build_id}-${execution}/test-results.json
+#######################################
+# Variables #
+#######################################
+
+variables:
+
#########################################################################################
-# VARIABLES
-#
# The following stress tests are configured to run for six hours via the "-t 360"
# argument to format.sh: format-stress-test, format-stress-sanitizer-test, and
# race-condition-stress-sanitizer-test. The smoke and recovery tests run in a loop,
# with the number of runs adjusted to provide aproximately six hours of testing.
#########################################################################################
-variables:
- &format-stress-test
exec_timeout_secs: 25200
@@ -665,19 +704,12 @@ variables:
vars:
times: 25
-pre:
- - func: "cleanup"
-post:
- - func: "upload artifact"
- vars:
- postfix: -${execution}
- - func: "save wt hang analyzer core/debugger files"
- - func: "dump stderr/stdout"
- - func: "cleanup"
-timeout:
- - func: "run wt hang analyzer"
+#######################################
+# Tasks #
+#######################################
tasks:
+
# Base compile task on posix flavours
- name: compile
tags: ["pull_request"]
@@ -2154,6 +2186,7 @@ tasks:
- name: doc-update
patchable: false
+ stepback: false
commands:
- func: "get project"
- func: "compile wiredtiger docs"
@@ -2488,7 +2521,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args}" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args}" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s1
depends_on:
@@ -2502,7 +2535,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 1" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 1" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s2
depends_on:
@@ -2516,7 +2549,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 2" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 2" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s3
depends_on:
@@ -2530,7 +2563,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 3" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 3" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s4
depends_on:
@@ -2544,7 +2577,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 4" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 4" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s5
depends_on:
@@ -2558,7 +2591,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 5" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 5" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s6
depends_on:
@@ -2572,7 +2605,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 6" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 6" WT_TEST.$t' 120
- name: data-validation-stress-test-checkpoint-fp-hs-insert-s7
depends_on:
@@ -2586,7 +2619,7 @@ tasks:
script: |
set -o errexit
set -o verbose
- ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 7" WT_TEST.$t' 120
+ ${test_env_vars|} ../../../tools/run_parallel.sh 'nice ../../../test/checkpoint/recovery-test.sh "${data_validation_stress_test_args} -s 7" WT_TEST.$t' 120
- name: format-failure-configs-test
depends_on:
@@ -2600,7 +2633,7 @@ tasks:
set -o errexit
set -o verbose
- ./run_format_configs.sh
+ ${test_env_vars|} ./run_format_configs.sh
- name: static-wt-build-test
commands:
@@ -2954,6 +2987,30 @@ tasks:
vars:
perf-test-name: medium-multi-lsm
+ - name: perf-test-parallel-pop-lsm
+ commands:
+ - func: "get project"
+ - func: "compile wiredtiger"
+ - func: "generic-perf-test"
+ vars:
+ perf-test-name: parallel-pop-lsm
+ maxruns: 1
+ - func: "generic-perf-test-push-results"
+ vars:
+ perf-test-name: parallel-pop-lsm
+
+ - name: perf-test-update-lsm
+ commands:
+ - func: "get project"
+ - func: "compile wiredtiger"
+ - func: "generic-perf-test"
+ vars:
+ perf-test-name: update-lsm
+ maxruns: 1
+ - func: "generic-perf-test-push-results"
+ vars:
+ perf-test-name: update-lsm
+
###############################
# Performance Tests for btree #
###############################
@@ -3006,6 +3063,9 @@ tasks:
vars:
perf-test-name: medium-btree-backup
+#######################################
+# Buildvariants #
+#######################################
buildvariants:
@@ -3014,9 +3074,23 @@ buildvariants:
run_on:
- ubuntu2004-test
expansions:
- test_env_vars: LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs:$top_dir/TCMALLOC_LIB/lib
smp_command: -j $(echo "`grep -c ^processor /proc/cpuinfo` * 2" | bc)
- posix_configure_flags: --enable-silent-rules --enable-diagnostic --enable-python --enable-zlib --enable-snappy --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ posix_configure_flags:
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-python
+ --enable-zlib
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --enable-tcmalloc
+ --prefix=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
data_validation_stress_test_args: -t r -m -W 3 -D -p -x -n 100000 -k 100000 -C cache_size=100MB
@@ -3053,8 +3127,21 @@ buildvariants:
run_on:
- ubuntu2004-test
expansions:
- test_env_vars: LD_LIBRARY_PATH=$(pwd) WT_BUILDDIR=$(pwd)
- posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake -DCMAKE_C_FLAGS="-ggdb" -DHAVE_DIAGNOSTIC=1 -DENABLE_PYTHON=1 -DENABLE_ZLIB=1 -DENABLE_SNAPPY=1 -DENABLE_STRICT=1 -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
+ test_env_vars:
+ WT_TOPDIR=$(git rev-parse --show-toplevel)
+ WT_BUILDDIR=$WT_TOPDIR/cmake_build
+ LD_LIBRARY_PATH=$WT_BUILDDIR:$WT_TOPDIR/TCMALLOC_LIB/lib
+ posix_configure_flags:
+ -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake
+ -DCMAKE_C_FLAGS="-ggdb"
+ -DHAVE_DIAGNOSTIC=1
+ -DENABLE_PYTHON=1
+ -DENABLE_ZLIB=1
+ -DENABLE_SNAPPY=1
+ -DENABLE_STRICT=1
+ -DENABLE_TCMALLOC=1
+ -DCMAKE_PREFIX_PATH="$(pwd)/../TCMALLOC_LIB"
+ -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(echo "`grep -c ^processor /proc/cpuinfo` * 2" | bc)
cmake_generator: Ninja
@@ -3076,14 +3163,23 @@ buildvariants:
PATH=/opt/mongodbtoolchain/v3/bin:$PATH
CFLAGS="-fsanitize=address -fno-omit-frame-pointer -ggdb"
CXXFLAGS="-fsanitize=address -fno-omit-frame-pointer -ggdb"
- posix_configure_flags: --enable-silent-rules --enable-strict --enable-diagnostic --disable-static --prefix=$(pwd)/LOCAL_INSTALL
+ posix_configure_flags:
+ --enable-silent-rules
+ --enable-strict
+ --enable-diagnostic
+ --disable-static
+ --prefix=$(pwd)/LOCAL_INSTALL
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
ASAN_OPTIONS="detect_leaks=1:abort_on_error=1:disable_coredump=0"
ASAN_SYMBOLIZER_PATH=/opt/mongodbtoolchain/v3/bin/llvm-symbolizer
TESTUTIL_BYPASS_ASAN=1
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
tasks:
- name: ".pull_request !.windows_only !.pull_request_compilers !.python"
- name: examples-c-test
@@ -3099,15 +3195,21 @@ buildvariants:
PATH=/opt/mongodbtoolchain/v3/bin:$PATH
CFLAGS="-fsanitize=memory -fno-omit-frame-pointer -fno-optimize-sibling-calls -O1 -ggdb"
posix_configure_flags:
- --enable-silent-rules --enable-strict --enable-diagnostic
- --disable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-strict
+ --enable-diagnostic
+ --disable-static
+ --prefix=$(pwd)/LOCAL_INSTALL
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
MSAN_OPTIONS="abort_on_error=1:disable_coredump=0:print_stacktrace=1"
MSAN_SYMBOLIZER_PATH=/opt/mongodbtoolchain/v3/bin/llvm-symbolizer
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so LD_LIBRARY_PATH=$(pwd)/.libs
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
TESTUTIL_SLOW_MACHINE=1
tasks:
- name: clang-analyzer
@@ -3131,14 +3233,21 @@ buildvariants:
CFLAGS="-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls -O1 -ggdb"
CXXFLAGS="-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls -O1 -ggdb"
posix_configure_flags:
- --enable-silent-rules --enable-strict --enable-diagnostic
- --disable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-strict
+ --enable-diagnostic
+ --disable-static
+ --enable-tcmalloc
+ --prefix=$(pwd)/LOCAL_INSTALL
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
UBSAN_OPTIONS="detect_leaks=1:disable_coredump=0:external_symbolizer_path=/opt/mongodbtoolchain/v3/bin/llvm-symbolizer:halt_on_error=1:print_stacktrace=1"
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so LD_LIBRARY_PATH=$(pwd)/.libs
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs:$top_dir/TCMALLOC_LIB/lib
tasks:
- name: clang-analyzer
- name: compile
@@ -3157,7 +3266,16 @@ buildvariants:
run_on:
- ubuntu2004-wt-build
expansions:
- posix_configure_flags: --enable-silent-rules --enable-diagnostic --enable-strict --enable-lz4 --enable-snappy --enable-zlib --enable-zstd --enable-python
+ posix_configure_flags:
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-strict
+ --enable-lz4
+ --enable-snappy
+ --enable-zlib
+ --enable-zstd
+ --enable-python
+ --enable-tcmalloc
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
@@ -3172,11 +3290,21 @@ buildvariants:
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so LD_LIBRARY_PATH=$(pwd)/.libs
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs:$top_dir/TCMALLOC_LIB/lib
posix_configure_flags:
- --enable-silent-rules --enable-diagnostic --enable-python --enable-zlib --enable-snappy
- --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-python
+ --enable-zlib
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --enable-tcmalloc
+ --prefix=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
tasks:
- name: ".stress-test-1"
@@ -3210,6 +3338,8 @@ buildvariants:
- name: perf-test-medium-lsm
- name: perf-test-medium-lsm-compact
- name: perf-test-medium-multi-lsm
+ - name: perf-test-parallel-pop-lsm
+ - name: perf-test-update-lsm
- name: large-scale-tests
@@ -3220,8 +3350,14 @@ buildvariants:
expansions:
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
posix_configure_flags:
- --enable-silent-rules --enable-python --enable-zlib --enable-snappy
- --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-python
+ --enable-zlib
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --enable-tcmalloc
+ --prefix=$(pwd)/LOCAL_INSTALL
test_env_vars:
PATH=/opt/mongodbtoolchain/v3/bin:$PATH
upload_source_dir: mongo-tests/largescale/many-collection/dbpath/diagnostic.data
@@ -3237,11 +3373,21 @@ buildvariants:
run_on:
- ubuntu2004-test
expansions:
- test_env_vars: LD_LIBRARY_PATH=$(pwd)/../../.libs PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ test_env_vars:
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs:$top_dir/TCMALLOC_LIB/lib
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
posix_configure_flags:
- --enable-diagnostic --enable-python --enable-silent-rules --enable-snappy --enable-static
- --enable-strict --enable-zlib
+ --enable-diagnostic
+ --enable-python
+ --enable-silent-rules
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --enable-tcmalloc
+ --enable-zlib
tasks:
- name: compile
- name: cppsuite-hs-cleanup-stress
@@ -3272,7 +3418,12 @@ buildvariants:
run_on:
- ubuntu2004-test
expansions:
- test_env_vars: LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
@@ -3287,7 +3438,12 @@ buildvariants:
run_on:
- rhel80-test
expansions:
- test_env_vars: LD_PRELOAD=/usr/local/lib/libeatmydata.so PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ LD_PRELOAD=/usr/local/lib/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
@@ -3318,7 +3474,12 @@ buildvariants:
run_on:
- ubuntu2004-test
expansions:
- test_env_vars: LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libeatmydata.so
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
tasks:
- name: coverage-report
- name: cyclomatic-complexity
@@ -3360,7 +3521,7 @@ buildvariants:
expansions:
python_binary: 'python'
is_cmake_build: true
- test_env_vars: WT_BUILDDIR=$(pwd)
+ test_env_vars: WT_BUILDDIR=$(git rev-parse --show-toplevel)/cmake_build
windows_configure_flags: -vcvars_bat "'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat'"
tasks:
- name: compile
@@ -3371,13 +3532,25 @@ buildvariants:
display_name: OS X 10.14
run_on:
- macos-1014
+ batchtime: 120 # 2 hours
expansions:
configure_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH ADD_CFLAGS="-ggdb -fPIC"
- posix_configure_flags: --enable-silent-rules --enable-diagnostic --enable-python --enable-zlib --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ posix_configure_flags:
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-python
+ --enable-zlib
+ --enable-strict
+ --enable-static
+ --prefix=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(sysctl -n hw.logicalcpu)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future make
- test_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH DYLD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ DYLD_LIBRARY_PATH=$top_builddir/.libs
tasks:
- name: compile
- name: make-check-test
@@ -3388,13 +3561,22 @@ buildvariants:
display_name: "* OS X 10.14 CMake"
run_on:
- macos-1014
+ batchtime: 120 # 2 hours
expansions:
- posix_configure_flags: -DCMAKE_C_FLAGS="-ggdb" -DHAVE_DIAGNOSTIC=1 -DENABLE_PYTHON=1 -DENABLE_ZLIB=1 -DENABLE_STRICT=1 -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
+ posix_configure_flags:
+ -DCMAKE_C_FLAGS="-ggdb"
+ -DHAVE_DIAGNOSTIC=1
+ -DENABLE_PYTHON=1
+ -DENABLE_ZLIB=1
+ -DENABLE_STRICT=1
+ -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
python_binary: 'python3'
smp_command: -j $(sysctl -n hw.logicalcpu)
cmake_generator: "Unix Makefiles"
make_command: make
- test_env_vars: DYLD_LIBRARY_PATH=$(pwd) WT_BUILDDIR=$(pwd)
+ test_env_vars:
+ WT_BUILDDIR=$(git rev-parse --show-toplevel)/cmake_build
+ DYLD_LIBRARY_PATH=$WT_BUILDDIR
is_cmake_build: true
tasks:
- name: compile
@@ -3409,7 +3591,11 @@ buildvariants:
expansions:
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
- test_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
tasks:
- name: compile
- name: generate-datafile-little-endian
@@ -3426,7 +3612,11 @@ buildvariants:
expansions:
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
- test_env_vars: PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.lib top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ test_env_vars:
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.lib
tasks:
- name: compile
- name: generate-datafile-big-endian
@@ -3437,16 +3627,25 @@ buildvariants:
display_name: "~ Ubuntu 18.04 PPC"
run_on:
- ubuntu1804-power8-test
+ batchtime: 120 # 2 hours
expansions:
format_test_setting: ulimit -c unlimited
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs
- top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
posix_configure_flags:
- --enable-silent-rules --enable-diagnostic --enable-python --enable-zlib --enable-snappy
- --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-python
+ --enable-zlib
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --prefix=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
tasks:
- name: compile
@@ -3461,8 +3660,18 @@ buildvariants:
- ubuntu1804-power8-test
batchtime: 10080 # 7 days
expansions:
- test_env_vars: LD_LIBRARY_PATH=$(pwd) WT_BUILDDIR=$(pwd)
- posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake -DCMAKE_C_FLAGS="-ggdb" -DHAVE_DIAGNOSTIC=1 -DENABLE_PYTHON=1 -DENABLE_ZLIB=1 -DENABLE_SNAPPY=1 -DENABLE_STRICT=1 -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
+ test_env_vars:
+ 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_C_FLAGS="-ggdb"
+ -DHAVE_DIAGNOSTIC=1
+ -DENABLE_PYTHON=1
+ -DENABLE_ZLIB=1
+ -DENABLE_SNAPPY=1
+ -DENABLE_STRICT=1
+ -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
cmake_generator: Ninja
@@ -3477,15 +3686,24 @@ buildvariants:
display_name: "~ Ubuntu 18.04 zSeries"
run_on:
- ubuntu1804-zseries-test
+ batchtime: 120 # 2 hours
expansions:
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
make_command: PATH=/opt/mongodbtoolchain/v3/bin:$PATH make
test_env_vars:
- PATH=/opt/mongodbtoolchain/v3/bin:$PATH LD_LIBRARY_PATH=$(pwd)/.libs:$(pwd)/lang/python
- top_srcdir=$(pwd)/.. top_builddir=$(pwd)
+ PATH=/opt/mongodbtoolchain/v3/bin:$PATH
+ top_dir=$(git rev-parse --show-toplevel)
+ top_builddir=$top_dir/build_posix
+ LD_LIBRARY_PATH=$top_builddir/.libs
posix_configure_flags:
- --enable-silent-rules --enable-diagnostic --enable-python --enable-zlib --enable-snappy
- --enable-strict --enable-static --prefix=$(pwd)/LOCAL_INSTALL
+ --enable-silent-rules
+ --enable-diagnostic
+ --enable-python
+ --enable-zlib
+ --enable-snappy
+ --enable-strict
+ --enable-static
+ --prefix=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
tasks:
- name: compile
@@ -3500,8 +3718,18 @@ buildvariants:
- ubuntu1804-zseries-test
batchtime: 10080 # 7 days
expansions:
- test_env_vars: LD_LIBRARY_PATH=$(pwd) WT_BUILDDIR=$(pwd)
- posix_configure_flags: -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/mongodbtoolchain_v3_gcc.cmake -DCMAKE_C_FLAGS="-ggdb" -DHAVE_DIAGNOSTIC=1 -DENABLE_PYTHON=1 -DENABLE_ZLIB=1 -DENABLE_SNAPPY=1 -DENABLE_STRICT=1 -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
+ test_env_vars:
+ 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_C_FLAGS="-ggdb"
+ -DHAVE_DIAGNOSTIC=1
+ -DENABLE_PYTHON=1
+ -DENABLE_ZLIB=1
+ -DENABLE_SNAPPY=1
+ -DENABLE_STRICT=1
+ -DCMAKE_INSTALL_PREFIX=$(pwd)/LOCAL_INSTALL
python_binary: '/opt/mongodbtoolchain/v3/bin/python3'
smp_command: -j $(grep -c ^processor /proc/cpuinfo)
cmake_generator: Ninja
diff --git a/src/third_party/wiredtiger/test/suite/test_cursor17.py b/src/third_party/wiredtiger/test/suite/test_cursor17.py
index 322b82a65f8..becb6fcd5d3 100644
--- a/src/third_party/wiredtiger/test/suite/test_cursor17.py
+++ b/src/third_party/wiredtiger/test/suite/test_cursor17.py
@@ -118,32 +118,47 @@ class test_cursor17(wttest.WiredTigerTestCase):
session2 = self.setUpSessionOpen(self.conn)
cursor2 = session2.open_cursor(self.type + self.tablename, None)
session2.begin_transaction()
- cursor2[101] = self.ds.value(101)
+ cursor2[200] = self.ds.value(200)
cursor = self.session.open_cursor(self.type + self.tablename, None)
# Verify the largest key.
self.session.begin_transaction()
self.assertEqual(cursor.largest_key(), 0)
- self.assertEqual(cursor.get_key(), 101)
+ self.assertEqual(cursor.get_key(), 200)
self.session.rollback_transaction()
session2.rollback_transaction()
+
+ def test_invisible_timestamp(self):
+ self.populate(100)
- def test_read_timestamp(self):
+ cursor = self.session.open_cursor(self.type + self.tablename, None)
+ self.session.begin_transaction()
+ cursor[200] = self.ds.value(200)
+ self.session.commit_transaction("commit_timestamp=" + self.timestamp_str(10))
+
+ # Verify the largest key.
+ self.session.begin_transaction("read_timestamp=" + self.timestamp_str(5))
+ self.assertEqual(cursor.largest_key(), 0)
+ self.assertEqual(cursor.get_key(), 200)
+ self.session.rollback_transaction()
+
+ def test_prepared_update(self):
self.populate(100)
+ session2 = self.setUpSessionOpen(self.conn)
+ cursor2 = session2.open_cursor(self.type + self.tablename, None)
+ session2.begin_transaction()
+ cursor2[200] = self.ds.value(200)
+ session2.prepare_transaction("prepare_timestamp=" + self.timestamp_str(10))
+
cursor = self.session.open_cursor(self.type + self.tablename, None)
- self.session.begin_transaction('read_timestamp=' + self.timestamp_str(5))
- # Expect the largest key to throw.
- with self.expectedStderrPattern("largest key cannot be called with a read timestamp"):
- try:
- cursor.largest_key()
- except wiredtiger.WiredTigerError as e:
- gotException = True
- self.pr('got expected exception: ' + str(e))
- self.assertTrue(str(e).find('nvalid argument') >= 0)
- self.assertTrue(gotException, msg = 'expected exception')
+
+ # Verify the largest key.
+ self.session.begin_transaction("read_timestamp=" + self.timestamp_str(20))
+ self.assertEqual(cursor.largest_key(), 0)
+ self.assertEqual(cursor.get_key(), 200)
self.session.rollback_transaction()
def test_not_positioned(self):
diff --git a/src/third_party/wiredtiger/test/suite/test_hs28.py b/src/third_party/wiredtiger/test/suite/test_hs28.py
new file mode 100644
index 00000000000..3768262e86e
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_hs28.py
@@ -0,0 +1,86 @@
+#!/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_hs28.py
+# Test that we insert a full update instead of a reverse modify to the
+# history store if a modify follows a squashed on page value.
+
+class test_hs28(wttest.WiredTigerTestCase):
+ conn_config = ''
+ session_config = 'isolation=snapshot'
+
+ key_format_values = [
+ ('column', dict(key_format='r')),
+ ('integer_row', dict(key_format='i')),
+ ]
+
+ scenarios = make_scenarios(key_format_values)
+
+ def conn_config(self):
+ config = 'cache_size=50MB,statistics=(all),statistics_log=(json,on_close,wait=1)'
+ return config
+
+ def test_insert_hs_full_update(self):
+ uri = 'table:test_hs28'
+ self.session.create(uri, 'key_format={},value_format=S'.format(self.key_format))
+
+ value1 = "a"
+ value2 = "b"
+
+ cursor = self.session.open_cursor(uri)
+ # Insert a full value
+ self.session.begin_transaction()
+ cursor[1] = value1
+ self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(2))
+
+ # Do a modify update
+ self.session.begin_transaction()
+ cursor.set_key(1)
+ mods = [wiredtiger.Modify('A', 0, 1)]
+ self.assertEqual(cursor.modify(mods), 0)
+ self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(5))
+
+ # Commit a transaction with multiple updates on the same key
+ self.session.begin_transaction()
+ cursor[1] = value1
+ cursor[1] = value2
+ self.session.commit_transaction('commit_timestamp=' + self.timestamp_str(10))
+
+ # Move the updates to the history store
+ self.session.checkpoint()
+
+ stat_cursor = self.session.open_cursor('statistics:', None, None)
+ hs_full_update = stat_cursor[wiredtiger.stat.conn.cache_hs_insert_full_update][2]
+ hs_reverse_modify = stat_cursor[wiredtiger.stat.conn.cache_hs_insert_reverse_modify][2]
+ stat_cursor.close()
+
+ self.assertEqual(hs_full_update, 2)
+ self.assertEqual(hs_reverse_modify, 0)
diff --git a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable01.py b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable01.py
index e85de366970..5d1fe8029cd 100755
--- a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable01.py
+++ b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable01.py
@@ -154,6 +154,18 @@ class test_rollback_to_stable_base(wttest.WiredTigerTestCase):
self.assertEqual(count, nrows)
cursor.close()
+ def evict_cursor(self, uri, nrows, check_value):
+ # Configure debug behavior on a cursor to evict the page positioned on when the reset API is used.
+ evict_cursor = self.session.open_cursor(uri, None, "debug=(release_evict)")
+ self.session.begin_transaction("ignore_prepare=true")
+ for i in range (1, nrows + 1):
+ evict_cursor.set_key(i)
+ self.assertEqual(evict_cursor[i], check_value)
+ if i % 10 == 0:
+ evict_cursor.reset()
+ evict_cursor.close()
+ self.session.rollback_transaction()
+
# Test that rollback to stable clears the remove operation.
class test_rollback_to_stable01(test_rollback_to_stable_base):
session_config = 'isolation=snapshot'
diff --git a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable10.py b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable10.py
index 63989155146..cf4e43282da 100755
--- a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable10.py
+++ b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable10.py
@@ -26,13 +26,13 @@
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
-import fnmatch, os, shutil, threading, time
+import threading, time
from helper import copy_wiredtiger_home, simulate_crash_restart
from test_rollback_to_stable01 import test_rollback_to_stable_base
from wiredtiger import stat
from wtdataset import SimpleDataSet
from wtscenario import make_scenarios
-from wtthread import checkpoint_thread, op_thread
+from wtthread import checkpoint_thread
# test_rollback_to_stable10.py
# Test the rollback to stable operation performs sweeping history store.
@@ -52,7 +52,7 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
scenarios = make_scenarios(key_format_values, prepare_values)
def conn_config(self):
- config = 'cache_size=6MB,statistics=(all),statistics_log=(json,on_close,wait=1),log=(enabled=true),timing_stress_for_test=[history_store_checkpoint_delay]'
+ config = 'cache_size=25MB,statistics=(all),statistics_log=(json,on_close,wait=1),log=(enabled=true),timing_stress_for_test=[history_store_checkpoint_delay]'
return config
def test_rollback_to_stable(self):
@@ -117,6 +117,8 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
try:
self.pr("start checkpoint")
ckpt.start()
+ # Sleep for sometime so that checkpoint starts.
+ time.sleep(2)
# Perform several updates in parallel with checkpoint.
# Rollbacks may occur when checkpoint is running, so retry as needed.
@@ -125,10 +127,14 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
lambda: self.large_updates(uri_1, value_e, ds_1, nrows, self.prepare, 70))
self.retry_rollback('update ds2, e', None,
lambda: self.large_updates(uri_2, value_e, ds_2, nrows, self.prepare, 70))
+ self.evict_cursor(uri_1, nrows, value_e)
+ self.evict_cursor(uri_2, nrows, value_e)
self.retry_rollback('update ds1, f', None,
lambda: self.large_updates(uri_1, value_f, ds_1, nrows, self.prepare, 80))
self.retry_rollback('update ds2, f', None,
lambda: self.large_updates(uri_2, value_f, ds_2, nrows, self.prepare, 80))
+ self.evict_cursor(uri_1, nrows, value_f)
+ self.evict_cursor(uri_2, nrows, value_f)
finally:
done.set()
ckpt.join()
@@ -173,10 +179,6 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
def test_rollback_to_stable_prepare(self):
nrows = 1000
- # FIXME-WT-7250 This test fails because of cache stuck on Windows.
- if os.name == "nt":
- self.skipTest('rollback_to_stable10 prepare test skipped on Windows')
-
# Create a table without logging.
self.pr("create/populate tables")
uri_1 = "table:rollback_to_stable10_1"
@@ -199,7 +201,6 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
value_c = "ccccc" * 100
value_d = "ddddd" * 100
value_e = "eeeee" * 100
- value_f = "fffff" * 100
# Perform several updates.
self.pr("large updates")
@@ -216,13 +217,11 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
# Verify data is visible and correct.
self.check(value_d, uri_1, nrows, 20)
self.check(value_c, uri_1, nrows, 30)
- self.session.breakpoint()
self.check(value_b, uri_1, nrows, 40)
self.check(value_a, uri_1, nrows, 50)
self.check(value_d, uri_2, nrows, 20)
self.check(value_c, uri_2, nrows, 30)
- self.session.breakpoint()
self.check(value_b, uri_2, nrows, 40)
self.check(value_a, uri_2, nrows, 50)
@@ -250,6 +249,8 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
try:
self.pr("start checkpoint")
ckpt.start()
+ # Sleep for sometime so that checkpoint starts.
+ time.sleep(2)
# Perform several updates in parallel with checkpoint.
session_p1 = self.conn.open_session()
@@ -259,6 +260,7 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
lambda: prepare_range_updates(
session_p1, cursor_p1, ds_1, value_e, nrows,
'prepare_timestamp=' + self.timestamp_str(69)))
+ self.evict_cursor(uri_1, nrows, value_a)
# Perform several updates in parallel with checkpoint.
session_p2 = self.conn.open_session()
@@ -268,6 +270,7 @@ class test_rollback_to_stable10(test_rollback_to_stable_base):
lambda: prepare_range_updates(
session_p2, cursor_p2, ds_2, value_e, nrows,
'prepare_timestamp=' + self.timestamp_str(69)))
+ self.evict_cursor(uri_2, nrows, value_a)
finally:
done.set()
ckpt.join()
diff --git a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable14.py b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable14.py
index 25b625e1cfa..601302b0762 100755
--- a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable14.py
+++ b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable14.py
@@ -26,13 +26,13 @@
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
-import fnmatch, os, shutil, threading, time
+import threading, time
from helper import simulate_crash_restart
from test_rollback_to_stable01 import test_rollback_to_stable_base
from wiredtiger import stat
from wtdataset import SimpleDataSet
from wtscenario import make_scenarios
-from wtthread import checkpoint_thread, op_thread
+from wtthread import checkpoint_thread
def mod_val(value, char, location, nbytes=1):
return value[0:location] + char + value[location+nbytes:]
@@ -58,11 +58,11 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
scenarios = make_scenarios(key_format_values, prepare_values)
def conn_config(self):
- config = 'cache_size=8MB,statistics=(all),statistics_log=(json,on_close,wait=1),log=(enabled=true),timing_stress_for_test=[history_store_checkpoint_delay]'
+ config = 'cache_size=25MB,statistics=(all),statistics_log=(json,on_close,wait=1),log=(enabled=true),timing_stress_for_test=[history_store_checkpoint_delay]'
return config
def test_rollback_to_stable(self):
- nrows = 1500
+ nrows = 100
# Create a table without logging.
self.pr("create/populate table")
@@ -81,6 +81,10 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
value_modR = mod_val(value_modQ, 'R', 1)
value_modS = mod_val(value_modR, 'S', 2)
value_modT = mod_val(value_modS, 'T', 3)
+ value_modW = mod_val(value_modT, 'W', 4)
+ value_modX = mod_val(value_modW, 'X', 5)
+ value_modY = mod_val(value_modX, 'Y', 6)
+ value_modZ = mod_val(value_modY, 'Z', 7)
# Perform a combination of modifies and updates.
self.pr("large updates and modifies")
@@ -109,18 +113,24 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
try:
self.pr("start checkpoint")
ckpt.start()
+ # Sleep for sometime so that checkpoint starts.
+ time.sleep(2)
# Perform several modifies in parallel with checkpoint.
# Rollbacks may occur when checkpoint is running, so retry as needed.
self.pr("modifies")
self.retry_rollback('modify ds1, W', None,
lambda: self.large_modifies(uri, 'W', ds, 4, 1, nrows, self.prepare, 70))
+ self.evict_cursor(uri, nrows, value_modW)
self.retry_rollback('modify ds1, X', None,
lambda: self.large_modifies(uri, 'X', ds, 5, 1, nrows, self.prepare, 80))
+ self.evict_cursor(uri, nrows, value_modX)
self.retry_rollback('modify ds1, Y', None,
lambda: self.large_modifies(uri, 'Y', ds, 6, 1, nrows, self.prepare, 90))
+ self.evict_cursor(uri, nrows, value_modY)
self.retry_rollback('modify ds1, Z', None,
lambda: self.large_modifies(uri, 'Z', ds, 7, 1, nrows, self.prepare, 100))
+ self.evict_cursor(uri, nrows, value_modZ)
finally:
done.set()
ckpt.join()
@@ -163,7 +173,7 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
self.ignoreStdoutPatternIfExists("oldest pinned transaction ID rolled back for eviction")
def test_rollback_to_stable_same_ts(self):
- nrows = 1500
+ nrows = 100
# Create a table without logging.
self.pr("create/populate table")
@@ -182,6 +192,10 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
value_modR = mod_val(value_modQ, 'R', 1)
value_modS = mod_val(value_modR, 'S', 2)
value_modT = mod_val(value_modS, 'T', 3)
+ value_modW = mod_val(value_modT, 'W', 4)
+ value_modX = mod_val(value_modW, 'X', 5)
+ value_modY = mod_val(value_modX, 'Y', 6)
+ value_modZ = mod_val(value_modY, 'Z', 7)
# Perform a combination of modifies and updates.
self.pr("large updates and modifies")
@@ -210,18 +224,24 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
try:
self.pr("start checkpoint")
ckpt.start()
+ # Sleep for sometime so that checkpoint starts.
+ time.sleep(2)
# Perform several modifies in parallel with checkpoint.
# Rollbacks may occur when checkpoint is running, so retry as needed.
self.pr("modifies")
self.retry_rollback('modify ds1, W', None,
lambda: self.large_modifies(uri, 'W', ds, 4, 1, nrows, self.prepare, 70))
+ self.evict_cursor(uri, nrows, value_modW)
self.retry_rollback('modify ds1, X', None,
lambda: self.large_modifies(uri, 'X', ds, 5, 1, nrows, self.prepare, 80))
+ self.evict_cursor(uri, nrows, value_modX)
self.retry_rollback('modify ds1, Y', None,
lambda: self.large_modifies(uri, 'Y', ds, 6, 1, nrows, self.prepare, 90))
+ self.evict_cursor(uri, nrows, value_modY)
self.retry_rollback('modify ds1, Z', None,
lambda: self.large_modifies(uri, 'Z', ds, 7, 1, nrows, self.prepare, 100))
+ self.evict_cursor(uri, nrows, value_modZ)
finally:
done.set()
ckpt.join()
@@ -262,7 +282,7 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
self.ignoreStdoutPatternIfExists("oldest pinned transaction ID rolled back for eviction")
def test_rollback_to_stable_same_ts_append(self):
- nrows = 1500
+ nrows = 100
# Create a table without logging.
self.pr("create/populate table")
@@ -281,6 +301,10 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
value_modR = append_val(value_modQ, 'R')
value_modS = append_val(value_modR, 'S')
value_modT = append_val(value_modS, 'T')
+ value_modW = append_val(value_modT, 'W')
+ value_modX = append_val(value_modW, 'X')
+ value_modY = append_val(value_modX, 'Y')
+ value_modZ = append_val(value_modY, 'Z')
# Perform a combination of modifies and updates.
self.pr("large updates and modifies")
@@ -309,6 +333,8 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
try:
self.pr("start checkpoint")
ckpt.start()
+ # Sleep for sometime so that checkpoint starts.
+ time.sleep(2)
# Perform several modifies in parallel with checkpoint.
# Rollbacks may occur when checkpoint is running, so retry as needed.
@@ -316,11 +342,13 @@ class test_rollback_to_stable14(test_rollback_to_stable_base):
self.retry_rollback('modify ds1, W', None,
lambda: self.large_modifies(uri, 'W', ds, len(value_modT), 1, nrows, self.prepare, 70))
self.retry_rollback('modify ds1, X', None,
- lambda: self.large_modifies(uri, 'X', ds, len(value_modT) + 1, 1, nrows, self.prepare, 80))
+ lambda: self.large_modifies(uri, 'X', ds, len(value_modW), 1, nrows, self.prepare, 80))
+ self.evict_cursor(uri, nrows, value_modX)
self.retry_rollback('modify ds1, Y', None,
- lambda: self.large_modifies(uri, 'Y', ds, len(value_modT) + 2, 1, nrows, self.prepare, 90))
+ lambda: self.large_modifies(uri, 'Y', ds, len(value_modX), 1, nrows, self.prepare, 90))
self.retry_rollback('modify ds1, Z', None,
- lambda: self.large_modifies(uri, 'Z', ds, len(value_modT) + 3, 1, nrows, self.prepare, 100))
+ lambda: self.large_modifies(uri, 'Z', ds, len(value_modY), 1, nrows, self.prepare, 100))
+ self.evict_cursor(uri, nrows, value_modZ)
finally:
done.set()
ckpt.join()
diff --git a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable21.py b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable21.py
index 3a348d00dc0..5d1f01f43e5 100644
--- a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable21.py
+++ b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable21.py
@@ -245,5 +245,6 @@ class test_rollback_to_stable21(test_rollback_to_stable_base):
hs_restored_tombstone = stat_cursor[stat.conn.txn_rts_hs_restore_tombstones][2]
stat_cursor.close()
- self.assertGreater(hs_removed, 0)
- self.assertGreater(hs_restored_tombstone, 0)
+ # The udpate and delete operations are not inserted into the history store as they are not visible
+ self.assertEquals(hs_removed, 0)
+ self.assertEquals(hs_restored_tombstone, 0)
diff --git a/src/third_party/wiredtiger/test/suite/test_rollback_to_stable28.py b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable28.py
new file mode 100755
index 00000000000..50a8a8fb2fb
--- /dev/null
+++ b/src/third_party/wiredtiger/test/suite/test_rollback_to_stable28.py
@@ -0,0 +1,149 @@
+#!/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 os, shutil, re
+from wiredtiger import stat
+import wttest
+from wtdataset import SimpleDataSet
+from helper import simulate_crash_restart
+from test_rollback_to_stable01 import test_rollback_to_stable_base
+
+# test_rollback_to_stable28.py
+# Test the debug mode setting for update_restore_evict during recovery.
+# Force update restore eviction, whenever we evict a page. We want to
+# perform this in recovery to ensure that all the in-memory images have
+# the proper write generation number and we don't end up reading stale
+# transaction ID's stored on the page.
+class test_rollback_to_stable28(test_rollback_to_stable_base):
+ conn_config = 'log=(enabled=true),statistics=(all)'
+ # Recovery connection config: The debug mode is only effective on high cache pressure as WiredTiger can potentially decide
+ # to do an update restore evict on a page when the cache pressure requirements are not met.
+ # This means setting eviction target low and cache size high.
+ conn_recon = ',eviction_updates_trigger=10,eviction_dirty_trigger=5,cache_size=10MB,' + \
+ 'debug_mode=(update_restore_evict=true),log=(recover=on)'
+
+ def parse_write_gen(self, uri):
+ meta_cursor = self.session.open_cursor('metadata:')
+ config = meta_cursor[uri]
+ meta_cursor.close()
+ # The search string will look like: 'run_write_gen=<num>'.
+ # Just reverse the string and take the digits from the back until we hit '='.
+ write_gen = re.search('write_gen=\d+', config)
+ run_write_gen = re.search('run_write_gen=\d+', config)
+ self.assertTrue(write_gen is not None)
+ write_gen_str = str()
+ run_write_gen_str = str()
+ for c in reversed(write_gen.group(0)):
+ if not c.isdigit():
+ self.assertEqual(c, '=')
+ break
+ write_gen_str = c + write_gen_str
+ for c in reversed(run_write_gen.group(0)):
+ if not c.isdigit():
+ self.assertEqual(c, '=')
+ break
+ run_write_gen_str = c + run_write_gen_str
+
+ return int(write_gen_str), int(run_write_gen_str)
+
+ def test_update_restore_evict_recovery(self):
+ uri = 'table:test_debug_mode10'
+ nrows = 10000
+
+ # Create our table.
+ ds = SimpleDataSet(self, uri, 0, key_format='i', value_format='S',config='log=(enabled=false)')
+ ds.populate()
+
+ value_a = 'a' * 500
+ value_b = 'b' * 500
+ value_c = 'c' * 500
+ value_d = 'd' * 500
+
+ # Perform several updates.
+ self.large_updates(uri, value_a, ds, nrows, False, 20)
+ self.large_updates(uri, value_b, ds, nrows, False, 30)
+ self.large_updates(uri, value_c, ds, nrows, False, 40)
+ # Verify data is visible and correct.
+ self.check(value_a, uri, nrows, 20)
+ self.check(value_b, uri, nrows, 30)
+ self.check(value_c, uri, nrows, 40)
+
+ # Pin the stable timestamp to 40. We will be validating the state of the data post-stable timestamp
+ # after we perform a recovery.
+ self.conn.set_timestamp('stable_timestamp=' + self.timestamp_str(40))
+
+ # Perform additional updates post-stable timestamp.
+ self.large_updates(uri, value_d, ds, nrows, False, 50)
+ self.large_updates(uri, value_a, ds, nrows, False, 60)
+ self.large_updates(uri, value_b, ds, nrows, False, 70)
+
+ # Verify additional updated data is visible and correct.
+ self.check(value_d, uri, nrows, 50)
+ self.check(value_a, uri, nrows, 60)
+ self.check(value_b, uri, nrows, 70)
+
+ # Checkpoint to ensure the data is flushed to disk.
+ self.session.checkpoint()
+
+ # Extract the most recent checkpoints write gen & run write gen. As we are still on a new DB connection,
+ # the run write gen should be 1 at this point, equal to the connection-wide base write gen.
+ # Since we checkpointed after a series of large writes/updates, the write gen of the pages should
+ # definitely be greater than 1.
+ checkpoint_write_gen, checkpoint_run_write_gen = self.parse_write_gen("file:test_debug_mode10.wt")
+ self.assertEqual(checkpoint_run_write_gen, 1)
+ self.assertGreater(checkpoint_write_gen, checkpoint_run_write_gen)
+
+ # Simulate a crash/restart, opening our new DB in recovery. As we open in recovery we want to additionally
+ # use the 'update_restore_evict' debug option to trigger update restore eviction.
+ self.conn_config = self.conn_config + self.conn_recon
+ simulate_crash_restart(self, ".", "RESTART")
+
+ # As we've created a new DB connection post-shutdown, the connection-wide
+ # base write gen should eventually initialise from the previous checkpoint's base 'write_gen' during the recovery process
+ # ('write_gen'+1). This should be reflected in the initialisation of the 'run_write_gen' field of the newest
+ # checkpoint post-recovery. As the recovery/rts process updates our pages, we'd also expect the latest checkpoint's
+ # 'write_gen' to again be greater than its 'run_write_gen'.
+ recovery_write_gen, recovery_run_write_gen = self.parse_write_gen("file:test_debug_mode10.wt")
+ self.assertGreater(recovery_run_write_gen, checkpoint_write_gen)
+ self.assertGreater(recovery_write_gen, recovery_run_write_gen)
+
+ # Read the statistics of pages that have been update restored (to check the mechanism was used).
+ stat_cursor = self.session.open_cursor('statistics:')
+ pages_update_restored = stat_cursor[stat.conn.cache_write_restore][2]
+ stat_cursor.close()
+ self.assertGreater(pages_update_restored, 0)
+
+ # Check that after recovery, we see the correct data with respect to our previous stable timestamp (40).
+ self.check(value_c, uri, nrows, 40)
+ self.check(value_c, uri, nrows, 50)
+ self.check(value_c, uri, nrows, 60)
+ self.check(value_c, uri, nrows, 70)
+ self.check(value_b, uri, nrows, 30)
+ self.check(value_a, uri, nrows, 20)
+ # Passing 0 results in opening a transaction with no read timestamp.
+ self.check(value_c, uri, nrows, 0)
diff --git a/src/third_party/wiredtiger/test/suite/wttest.py b/src/third_party/wiredtiger/test/suite/wttest.py
index 01c4f315f9c..07e5b0b6610 100755
--- a/src/third_party/wiredtiger/test/suite/wttest.py
+++ b/src/third_party/wiredtiger/test/suite/wttest.py
@@ -780,7 +780,12 @@ class WiredTigerTestCase(unittest.TestCase):
'test_file.test_file.test_funcname(scen1.scen2.scen3)'.
So transform '(', but remove final ')'.
"""
- return self.shortid().translate(str.maketrans('($[]/ ','______', ')'))
+ name = self.shortid().translate(str.maketrans('($[]/ ','______', ')'))
+
+ # On OS/X, we can get name conflicts if names differ by case. Upper
+ # case letters are uncommon in our python class and method names, so
+ # we lowercase them and prefix with '@', e.g. "AbC" -> "@ab@c".
+ return re.sub(r'[A-Z]', lambda x: '@' + x.group(0).lower(), name)
def className(self):
return self.__class__.__name__