diff options
author | Luke Chen <luke.chen@mongodb.com> | 2021-10-19 16:54:52 +1100 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-19 06:15:05 +0000 |
commit | 546487a45ad9cf22b3e03f71e1d640beeb8e988c (patch) | |
tree | d7f2b7d87646fbf1aaa65ba829d67b1fa4c9a68f | |
parent | e7aaf52d138c60e6b9fb7a3566c48469c4bfd3dc (diff) | |
download | mongo-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
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__ |