diff options
author | Luke Chen <luke.chen@mongodb.com> | 2021-10-07 17:44:57 +1100 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-07 07:04:01 +0000 |
commit | 58971da1ef93435a9f62bf4708a81713def6e88c (patch) | |
tree | c75ff94f74016177b2eef5f82c76a7d79238e8a5 /src/third_party/wiredtiger/src | |
parent | cf4ce26ca21a836aa336313a4a10676ca91c3131 (diff) | |
download | mongo-2d4e12caf7ca1bc44735216b64bb68ce3b527eab.tar.gz |
Import wiredtiger: e8bf2e5fcb33197b73c7bb550742926f59e22218 from branch mongodb-4.4r4.4.10-rc0r4.4.10
ref: a9bd69a7ca..e8bf2e5fcb
for: 4.4.10
WT-5270 Create wtperf script for evergreen
WT-7169 Commit ts should not be lesser than the last durable ts in test_timestamp22.py
WT-7392 Added evicted flag to dhandle for use by session sweep
WT-7757 Skip obsolete leaf pages without having to read them
WT-7924 Create a stress test for prefix search near key validation
WT-7980 Create interface to "log:" cursor which switches log files before returning them
WT-7992 Provide API to return the last key in a table regardless of visibility
WT-8022 Verify WT_CURSOR.modify return values in format test program
WT-8036 Added connection panic flag in two assert statements in wt_evict_thread_run and _wt_evict_thread_stop.
WT-8048 Remove split_8 timing stress configuration
WT-8055 Fix issue when compact quits when running at the same time as a checkpoint
WT-8059 Add a check in salvage when no overflow items are found
WT-8068 Improve __rollback_row_modify control flow
WT-8069 Coverity analysis defect 120706: Redundant test
WT-8070 Remove discrepancy between prefix_key and prefix_search
WT-8078 Implement tiered storage local retention caching
WT-8086 Create cpp test for prefix search near entries
WT-8092 Prefix early exit when keys are present in the insert list
WT-8101 Enable diagnostic mode for the CPP tests in evergreen
WT-8115 Define macros only when necessary in cpp files
WT-8119 Add targeted compact testing to the existing testing framework
WT-8146 Stop the tracking component when a CPP test ends
WT-8161 Reduce verbosity of CMake Evergreen smoke
WT-8162 Refactor uses of SMOKE arg in 'define_c_test' helper
WT-8164 Disable rollback_to_stable10 python test on Windows
WT-8171 Implement a C style test in the CPP testing framework
WT-8193 Wrong corner case in VLCS rollback-to-stable
Diffstat (limited to 'src/third_party/wiredtiger/src')
49 files changed, 1021 insertions, 801 deletions
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c index 8506083e006..6953eb3dc02 100644 --- a/src/third_party/wiredtiger/src/btree/bt_curnext.c +++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c @@ -343,10 +343,12 @@ __cursor_row_next( WT_PAGE *page; WT_ROW *rip; WT_SESSION_IMPL *session; + bool prefix_search; - session = CUR2S(cbt); - page = cbt->ref->page; key = &cbt->iface.key; + page = cbt->ref->page; + session = CUR2S(cbt); + prefix_search = prefix != NULL && F_ISSET(&cbt->iface, WT_CURSTD_PREFIX_SEARCH); *skippedp = 0; /* If restarting after a prepare conflict, jump to the right spot. */ @@ -394,6 +396,14 @@ restart_read_insert: if ((ins = cbt->ins) != NULL) { key->data = WT_INSERT_KEY(ins); key->size = WT_INSERT_KEY_SIZE(ins); + /* + * If the cursor has prefix search configured we can early exit here if the key that we + * are visiting is after our prefix. + */ + if (prefix_search && __wt_prefix_match(prefix, key) < 0) { + WT_STAT_CONN_DATA_INCR(session, cursor_search_near_prefix_fast_paths); + return (WT_NOTFOUND); + } WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd)); if (cbt->upd_value->type == WT_UPDATE_INVALID) { ++*skippedp; @@ -435,10 +445,7 @@ restart_read_page: * If the cursor has prefix search configured we can early exit here if the key that we are * visiting is after our prefix. */ - if (F_ISSET(&cbt->iface, WT_CURSTD_PREFIX_SEARCH) && prefix != NULL && - __wt_prefix_match(prefix, &cbt->iface.key) < 0) { - /* It is not okay for the user to have a custom collator. */ - WT_ASSERT(session, CUR2BT(cbt)->collator == NULL); + if (prefix_search && __wt_prefix_match(prefix, &cbt->iface.key) < 0) { WT_STAT_CONN_DATA_INCR(session, cursor_search_near_prefix_fast_paths); return (WT_NOTFOUND); } @@ -681,13 +688,12 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) WT_DECL_RET; WT_PAGE *page; WT_SESSION_IMPL *session; - size_t pages_skipped_count, total_skipped, skipped; + size_t total_skipped, skipped; uint32_t flags; bool newpage, restart; cursor = &cbt->iface; session = CUR2S(cbt); - pages_skipped_count = 0; total_skipped = 0; WT_STAT_CONN_DATA_INCR(session, cursor_next); @@ -707,7 +713,7 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) __wt_btcur_iterate_setup(cbt); /* - * Walk any page we're holding until the underlying call returns not- found. Then, move to the + * Walk any page we're holding until the underlying call returns not-found. Then, move to the * next page, until we reach the end of the file. */ restart = F_ISSET(cbt, WT_CBT_ITERATE_RETRY_NEXT); @@ -715,16 +721,6 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) for (newpage = false;; newpage = true, restart = false) { page = cbt->ref == NULL ? NULL : cbt->ref->page; - /* - * Determine if all records on the page have been deleted and all the tombstones are visible - * to our transaction. If so, we can avoid reading the records on the page and move to the - * next page. - */ - if (__wt_btcur_skip_page(cbt)) { - pages_skipped_count++; - goto skip_page; - } - if (F_ISSET(cbt, WT_CBT_ITERATE_APPEND)) { /* The page cannot be NULL if the above flag is set. */ WT_ASSERT(session, page != NULL); @@ -796,16 +792,26 @@ __wt_btcur_next_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) WT_STAT_CONN_INCR(session, cache_eviction_force_delete); } cbt->page_deleted_count = 0; -skip_page: + if (F_ISSET(cbt, WT_CBT_READ_ONCE)) LF_SET(WT_READ_WONT_NEED); - WT_ERR(__wt_tree_walk(session, &cbt->ref, flags)); + + /* + * If we are running with snapshot isolation, and not interested in returning tombstones, we + * could potentially skip pages. The skip function looks at the aggregated timestamp + * information to determine if something is visible on the page. If nothing is, the page is + * skipped. + */ + if (session->txn->isolation == WT_ISO_SNAPSHOT && + !F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE)) + WT_ERR( + __wt_tree_walk_custom_skip(session, &cbt->ref, __wt_btcur_skip_page, NULL, flags)); + else + WT_ERR(__wt_tree_walk(session, &cbt->ref, flags)); WT_ERR_TEST(cbt->ref == NULL, WT_NOTFOUND, false); } err: - WT_STAT_CONN_DATA_INCRV(session, cursor_next_skip_page_count, pages_skipped_count); - if (total_skipped < 100) WT_STAT_CONN_DATA_INCR(session, cursor_next_skip_lt_100); else diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c index bcf9f7e6d5a..3941ada539c 100644 --- a/src/third_party/wiredtiger/src/btree/bt_curprev.c +++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c @@ -484,10 +484,12 @@ __cursor_row_prev( WT_PAGE *page; WT_ROW *rip; WT_SESSION_IMPL *session; + bool prefix_search; - session = CUR2S(cbt); - page = cbt->ref->page; key = &cbt->iface.key; + page = cbt->ref->page; + session = CUR2S(cbt); + prefix_search = prefix != NULL && F_ISSET(&cbt->iface, WT_CURSTD_PREFIX_SEARCH); *skippedp = 0; /* If restarting after a prepare conflict, jump to the right spot. */ @@ -541,6 +543,14 @@ restart_read_insert: if ((ins = cbt->ins) != NULL) { key->data = WT_INSERT_KEY(ins); key->size = WT_INSERT_KEY_SIZE(ins); + /* + * If the cursor has prefix search configured we can early exit here if the key we are + * visiting is before our prefix. + */ + if (prefix_search && __wt_prefix_match(prefix, key) > 0) { + WT_STAT_CONN_DATA_INCR(session, cursor_search_near_prefix_fast_paths); + return (WT_NOTFOUND); + } WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd)); if (cbt->upd_value->type == WT_UPDATE_INVALID) { ++*skippedp; @@ -584,10 +594,7 @@ restart_read_page: * If the cursor has prefix search configured we can early exit here if the key we are * visiting is before our prefix. */ - if (F_ISSET(&cbt->iface, WT_CURSTD_PREFIX_SEARCH) && prefix != NULL && - __wt_prefix_match(prefix, &cbt->iface.key) > 0) { - /* It is not okay for the user to have a custom collator. */ - WT_ASSERT(session, CUR2BT(cbt)->collator == NULL); + if (prefix_search && __wt_prefix_match(prefix, &cbt->iface.key) > 0) { WT_STAT_CONN_DATA_INCR(session, cursor_search_near_prefix_fast_paths); return (WT_NOTFOUND); } @@ -620,13 +627,12 @@ __wt_btcur_prev_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) WT_DECL_RET; WT_PAGE *page; WT_SESSION_IMPL *session; - size_t pages_skipped_count, total_skipped, skipped; + size_t total_skipped, skipped; uint32_t flags; bool newpage, restart; cursor = &cbt->iface; session = CUR2S(cbt); - pages_skipped_count = 0; total_skipped = 0; WT_STAT_CONN_DATA_INCR(session, cursor_prev); @@ -647,7 +653,7 @@ __wt_btcur_prev_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) __wt_btcur_iterate_setup(cbt); /* - * Walk any page we're holding until the underlying call returns not- found. Then, move to the + * Walk any page we're holding until the underlying call returns not-found. Then, move to the * previous page, until we reach the start of the file. */ restart = F_ISSET(cbt, WT_CBT_ITERATE_RETRY_PREV); @@ -656,16 +662,6 @@ __wt_btcur_prev_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) page = cbt->ref == NULL ? NULL : cbt->ref->page; /* - * Determine if all records on the page have been deleted and all the tombstones are visible - * to our transaction. If so, we can avoid reading the records on the page and move to the - * next page. - */ - if (__wt_btcur_skip_page(cbt)) { - pages_skipped_count++; - goto skip_page; - } - - /* * Column-store pages may have appended entries. Handle it separately from the usual cursor * code, it's in a simple format. */ @@ -737,16 +733,26 @@ __wt_btcur_prev_prefix(WT_CURSOR_BTREE *cbt, WT_ITEM *prefix, bool truncating) WT_STAT_CONN_INCR(session, cache_eviction_force_delete); } cbt->page_deleted_count = 0; -skip_page: + if (F_ISSET(cbt, WT_CBT_READ_ONCE)) LF_SET(WT_READ_WONT_NEED); - WT_ERR(__wt_tree_walk(session, &cbt->ref, flags)); + + /* + * If we are running with snapshot isolation, and not interested in returning tombstones, we + * could potentially skip pages. The skip function looks at the aggregated timestamp + * information to determine if something is visible on the page. If nothing is, the page is + * skipped. + */ + if (session->txn->isolation == WT_ISO_SNAPSHOT && + !F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE)) + WT_ERR( + __wt_tree_walk_custom_skip(session, &cbt->ref, __wt_btcur_skip_page, NULL, flags)); + else + WT_ERR(__wt_tree_walk(session, &cbt->ref, flags)); WT_ERR_TEST(cbt->ref == NULL, WT_NOTFOUND, false); } err: - WT_STAT_CONN_DATA_INCRV(session, cursor_prev_skip_page_count, pages_skipped_count); - if (total_skipped < 100) WT_STAT_CONN_DATA_INCR(session, cursor_prev_skip_lt_100); else diff --git a/src/third_party/wiredtiger/src/btree/bt_cursor.c b/src/third_party/wiredtiger/src/btree/bt_cursor.c index b3d879fae8f..6cd2b3c3fc7 100644 --- a/src/third_party/wiredtiger/src/btree/bt_cursor.c +++ b/src/third_party/wiredtiger/src/btree/bt_cursor.c @@ -684,15 +684,8 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp) } /* - * If a valid key has been found and we are doing a prefix search near, we want to return the - * key only if it is a prefix match. - */ - if (valid && F_ISSET(cursor, WT_CURSTD_PREFIX_SEARCH) && - __wt_prefix_match(&state.key, cbt->tmp) != 0) - valid = false; - - /* - * If we find a valid key, return it. + * If we find a valid key, check if we are performing a prefix search near. If we are, return + * the record only if it is a prefix match. If not, return the record. * * Else, creating a record past the end of the tree in a fixed-length column-store implicitly * fills the gap with empty records. In this case, we instantiate the empty record, it's an @@ -708,8 +701,22 @@ __wt_btcur_search_near(WT_CURSOR_BTREE *cbt, int *exactp) */ if (valid) { exact = cbt->compare; - ret = __cursor_kv_return(cbt, cbt->upd_value); - } else if (__cursor_fix_implicit(btree, cbt)) { + /* + * Set the cursor key before the prefix search near check. If the prefix doesn't match, + * restore the cursor state, and continue to search for a valid key. Otherwise set the + * cursor value and return the valid record. + */ + WT_ERR(__wt_key_return(cbt)); + if (F_ISSET(cursor, WT_CURSTD_PREFIX_SEARCH) && + __wt_prefix_match(&state.key, &cursor->key) != 0) + __cursor_state_restore(cursor, &state); + else { + WT_ERR(__wt_value_return(cbt, cbt->upd_value)); + goto done; + } + } + + if (__cursor_fix_implicit(btree, cbt)) { cbt->recno = cursor->recno; cbt->v = 0; cursor->value.data = &cbt->v; diff --git a/src/third_party/wiredtiger/src/btree/bt_read.c b/src/third_party/wiredtiger/src/btree/bt_read.c index 687c21ec086..3d6a8e82215 100644 --- a/src/third_party/wiredtiger/src/btree/bt_read.c +++ b/src/third_party/wiredtiger/src/btree/bt_read.c @@ -258,6 +258,7 @@ read: /* We just read a page, don't evict it before we have a chance to use it. */ evict_skip = true; + F_CLR(session->dhandle, WT_DHANDLE_EVICTED); /* * If configured to not trash the cache, leave the page generation unset, we'll set it diff --git a/src/third_party/wiredtiger/src/btree/bt_slvg.c b/src/third_party/wiredtiger/src/btree/bt_slvg.c index cc8c8d47803..699270b3ffa 100644 --- a/src/third_party/wiredtiger/src/btree/bt_slvg.c +++ b/src/third_party/wiredtiger/src/btree/bt_slvg.c @@ -2140,7 +2140,12 @@ __slvg_ovfl_reconcile(WT_SESSION_IMPL *session, WT_STUFF *ss) WT_ERR(__wt_calloc_def(session, trk->trk_ovfl_cnt, &slot)); for (j = 0; j < trk->trk_ovfl_cnt; ++j) { addr = &trk->trk_ovfl_addr[j]; - searchp = + /* + * It is possible that salvage found a leaf page that points to an overflow item, but + * there were no overflow items at all. + */ + searchp = ss->ovfl == NULL ? + NULL : bsearch(addr, ss->ovfl, ss->ovfl_next, sizeof(WT_TRACK *), __slvg_ovfl_compare); /* diff --git a/src/third_party/wiredtiger/src/btree/bt_walk.c b/src/third_party/wiredtiger/src/btree/bt_walk.c index 69ece30ac04..233cc2a2514 100644 --- a/src/third_party/wiredtiger/src/btree/bt_walk.c +++ b/src/third_party/wiredtiger/src/btree/bt_walk.c @@ -375,9 +375,6 @@ restart: empty_internal = false; } - /* Encourage races. */ - __wt_timing_stress(session, WT_TIMING_STRESS_SPLIT_8); - /* Optionally return internal pages. */ if (LF_ISSET(WT_READ_SKIP_INTL)) continue; diff --git a/src/third_party/wiredtiger/src/config/config_def.c b/src/third_party/wiredtiger/src/config/config_def.c index 9b95fe6762d..6ea091cd3f6 100644 --- a/src/third_party/wiredtiger/src/config/config_def.c +++ b/src/third_party/wiredtiger/src/config/config_def.c @@ -145,7 +145,7 @@ static const WT_CONFIG_CHECK confchk_WT_CONNECTION_reconfigure[] = { "\"history_store_checkpoint_delay\",\"history_store_search\"," "\"history_store_sweep_race\",\"prepare_checkpoint_delay\"," "\"split_1\",\"split_2\",\"split_3\",\"split_4\",\"split_5\"," - "\"split_6\",\"split_7\",\"split_8\"]", + "\"split_6\",\"split_7\"]", NULL, 0}, {"verbose", "list", NULL, "choices=[\"api\",\"backup\",\"block\",\"checkpoint\"," @@ -877,7 +877,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open[] = { "\"history_store_checkpoint_delay\",\"history_store_search\"," "\"history_store_sweep_race\",\"prepare_checkpoint_delay\"," "\"split_1\",\"split_2\",\"split_3\",\"split_4\",\"split_5\"," - "\"split_6\",\"split_7\",\"split_8\"]", + "\"split_6\",\"split_7\"]", NULL, 0}, {"transaction_sync", "category", NULL, NULL, confchk_wiredtiger_open_transaction_sync_subconfigs, 2}, @@ -959,7 +959,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_all[] = { "\"history_store_checkpoint_delay\",\"history_store_search\"," "\"history_store_sweep_race\",\"prepare_checkpoint_delay\"," "\"split_1\",\"split_2\",\"split_3\",\"split_4\",\"split_5\"," - "\"split_6\",\"split_7\",\"split_8\"]", + "\"split_6\",\"split_7\"]", NULL, 0}, {"transaction_sync", "category", NULL, NULL, confchk_wiredtiger_open_transaction_sync_subconfigs, 2}, @@ -1038,7 +1038,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_basecfg[] = { "\"history_store_checkpoint_delay\",\"history_store_search\"," "\"history_store_sweep_race\",\"prepare_checkpoint_delay\"," "\"split_1\",\"split_2\",\"split_3\",\"split_4\",\"split_5\"," - "\"split_6\",\"split_7\",\"split_8\"]", + "\"split_6\",\"split_7\"]", NULL, 0}, {"transaction_sync", "category", NULL, NULL, confchk_wiredtiger_open_transaction_sync_subconfigs, 2}, @@ -1115,7 +1115,7 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_usercfg[] = { "\"history_store_checkpoint_delay\",\"history_store_search\"," "\"history_store_sweep_race\",\"prepare_checkpoint_delay\"," "\"split_1\",\"split_2\",\"split_3\",\"split_4\",\"split_5\"," - "\"split_6\",\"split_7\",\"split_8\"]", + "\"split_6\",\"split_7\"]", NULL, 0}, {"transaction_sync", "category", NULL, NULL, confchk_wiredtiger_open_transaction_sync_subconfigs, 2}, diff --git a/src/third_party/wiredtiger/src/config/test_config.c b/src/third_party/wiredtiger/src/config/test_config.c index 30bf6d8a3c3..a9f954ace43 100644 --- a/src/third_party/wiredtiger/src/config/test_config.c +++ b/src/third_party/wiredtiger/src/config/test_config.c @@ -49,9 +49,10 @@ static const WT_CONFIG_CHECK confchk_populate_config_subconfigs[] = { {"value_size", "int", NULL, "min=0,max=1000000000", NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0}}; static const WT_CONFIG_CHECK confchk_read_config_subconfigs[] = { - {"op_rate", "string", NULL, NULL, NULL, 0}, + {"key_size", "int", NULL, "min=0,max=10000", NULL, 0}, {"op_rate", "string", NULL, NULL, NULL, 0}, {"ops_per_transaction", "category", NULL, NULL, confchk_ops_per_transaction_subconfigs, 2}, - {"thread_count", "int", NULL, "min=0", NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0}}; + {"thread_count", "int", NULL, "min=0", NULL, 0}, + {"value_size", "int", NULL, "min=0,max=1000000000", NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0}}; static const WT_CONFIG_CHECK confchk_update_config_subconfigs[] = { {"key_size", "int", NULL, "min=0,max=10000", NULL, 0}, {"op_rate", "string", NULL, NULL, NULL, 0}, @@ -64,7 +65,7 @@ static const WT_CONFIG_CHECK confchk_workload_generator_subconfigs[] = { {"insert_config", "category", NULL, NULL, confchk_insert_config_subconfigs, 5}, {"op_rate", "string", NULL, NULL, NULL, 0}, {"populate_config", "category", NULL, NULL, confchk_populate_config_subconfigs, 5}, - {"read_config", "category", NULL, NULL, confchk_read_config_subconfigs, 3}, + {"read_config", "category", NULL, NULL, confchk_read_config_subconfigs, 5}, {"update_config", "category", NULL, NULL, confchk_update_config_subconfigs, 5}, {NULL, NULL, NULL, NULL, NULL, 0}}; @@ -125,6 +126,32 @@ static const WT_CONFIG_CHECK confchk_hs_cleanup[] = { {"workload_tracking", "category", NULL, NULL, confchk_workload_tracking_subconfigs, 2}, {NULL, NULL, NULL, NULL, NULL, 0}}; +static const WT_CONFIG_CHECK confchk_search_near_01[] = { + {"cache_size_mb", "int", NULL, "min=0,max=100000000000", NULL, 0}, + {"checkpoint_manager", "category", NULL, NULL, confchk_checkpoint_manager_subconfigs, 2}, + {"compression_enabled", "boolean", NULL, NULL, NULL, 0}, + {"duration_seconds", "int", NULL, "min=0,max=1000000", NULL, 0}, + {"enable_logging", "boolean", NULL, NULL, NULL, 0}, + {"runtime_monitor", "category", NULL, NULL, confchk_runtime_monitor_subconfigs, 5}, + {"statistics_config", "category", NULL, NULL, confchk_statistics_config_subconfigs, 2}, + {"timestamp_manager", "category", NULL, NULL, confchk_timestamp_manager_subconfigs, 4}, + {"workload_generator", "category", NULL, NULL, confchk_workload_generator_subconfigs, 6}, + {"workload_tracking", "category", NULL, NULL, confchk_workload_tracking_subconfigs, 2}, + {NULL, NULL, NULL, NULL, NULL, 0}}; + +static const WT_CONFIG_CHECK confchk_search_near_02[] = { + {"cache_size_mb", "int", NULL, "min=0,max=100000000000", NULL, 0}, + {"checkpoint_manager", "category", NULL, NULL, confchk_checkpoint_manager_subconfigs, 2}, + {"compression_enabled", "boolean", NULL, NULL, NULL, 0}, + {"duration_seconds", "int", NULL, "min=0,max=1000000", NULL, 0}, + {"enable_logging", "boolean", NULL, NULL, NULL, 0}, + {"runtime_monitor", "category", NULL, NULL, confchk_runtime_monitor_subconfigs, 5}, + {"statistics_config", "category", NULL, NULL, confchk_statistics_config_subconfigs, 2}, + {"timestamp_manager", "category", NULL, NULL, confchk_timestamp_manager_subconfigs, 4}, + {"workload_generator", "category", NULL, NULL, confchk_workload_generator_subconfigs, 6}, + {"workload_tracking", "category", NULL, NULL, confchk_workload_tracking_subconfigs, 2}, + {NULL, NULL, NULL, NULL, NULL, 0}}; + static const WT_CONFIG_ENTRY config_entries[] = { {"base_test", "cache_size_mb=0,checkpoint_manager=(enabled=false,op_rate=1s)," @@ -138,10 +165,10 @@ static const WT_CONFIG_ENTRY config_entries[] = { "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," "min=0),thread_count=0,value_size=5),op_rate=1s," "populate_config=(collection_count=1,key_count_per_collection=0," - "key_size=5,thread_count=1,value_size=5),read_config=(op_rate=1s," - "ops_per_transaction=(max=1,min=0),thread_count=0)," - "update_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," - "min=0),thread_count=0,value_size=5))," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," "workload_tracking=(enabled=true,op_rate=1s)", confchk_base_test, 10}, {"burst_inserts", @@ -157,10 +184,10 @@ static const WT_CONFIG_ENTRY config_entries[] = { "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," "min=0),thread_count=0,value_size=5),op_rate=1s," "populate_config=(collection_count=1,key_count_per_collection=0," - "key_size=5,thread_count=1,value_size=5),read_config=(op_rate=1s," - "ops_per_transaction=(max=1,min=0),thread_count=0)," - "update_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," - "min=0),thread_count=0,value_size=5))," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," "workload_tracking=(enabled=true,op_rate=1s)", confchk_burst_inserts, 11}, {"example_test", @@ -175,10 +202,10 @@ static const WT_CONFIG_ENTRY config_entries[] = { "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," "min=0),thread_count=0,value_size=5),op_rate=1s," "populate_config=(collection_count=1,key_count_per_collection=0," - "key_size=5,thread_count=1,value_size=5),read_config=(op_rate=1s," - "ops_per_transaction=(max=1,min=0),thread_count=0)," - "update_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," - "min=0),thread_count=0,value_size=5))," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," "workload_tracking=(enabled=true,op_rate=1s)", confchk_example_test, 10}, {"hs_cleanup", @@ -193,12 +220,48 @@ static const WT_CONFIG_ENTRY config_entries[] = { "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," "min=0),thread_count=0,value_size=5),op_rate=1s," "populate_config=(collection_count=1,key_count_per_collection=0," - "key_size=5,thread_count=1,value_size=5),read_config=(op_rate=1s," - "ops_per_transaction=(max=1,min=0),thread_count=0)," - "update_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," - "min=0),thread_count=0,value_size=5))," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," "workload_tracking=(enabled=true,op_rate=1s)", confchk_hs_cleanup, 10}, + {"search_near_01", + "cache_size_mb=0,checkpoint_manager=(enabled=false,op_rate=1s)," + "compression_enabled=false,duration_seconds=0," + "enable_logging=false,runtime_monitor=(enabled=true,op_rate=1s," + "postrun_statistics=[],stat_cache_size=(enabled=false,limit=0)," + "stat_db_size=(enabled=false,limit=0))," + "statistics_config=(enable_logging=true,type=all)," + "timestamp_manager=(enabled=true,oldest_lag=1,op_rate=1s," + "stable_lag=1),workload_generator=(enabled=true," + "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," + "min=0),thread_count=0,value_size=5),op_rate=1s," + "populate_config=(collection_count=1,key_count_per_collection=0," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," + "workload_tracking=(enabled=true,op_rate=1s)", + confchk_search_near_01, 10}, + {"search_near_02", + "cache_size_mb=0,checkpoint_manager=(enabled=false,op_rate=1s)," + "compression_enabled=false,duration_seconds=0," + "enable_logging=false,runtime_monitor=(enabled=true,op_rate=1s," + "postrun_statistics=[],stat_cache_size=(enabled=false,limit=0)," + "stat_db_size=(enabled=false,limit=0))," + "statistics_config=(enable_logging=true,type=all)," + "timestamp_manager=(enabled=true,oldest_lag=1,op_rate=1s," + "stable_lag=1),workload_generator=(enabled=true," + "insert_config=(key_size=5,op_rate=1s,ops_per_transaction=(max=1," + "min=0),thread_count=0,value_size=5),op_rate=1s," + "populate_config=(collection_count=1,key_count_per_collection=0," + "key_size=5,thread_count=1,value_size=5),read_config=(key_size=5," + "op_rate=1s,ops_per_transaction=(max=1,min=0),thread_count=0," + "value_size=5),update_config=(key_size=5,op_rate=1s," + "ops_per_transaction=(max=1,min=0),thread_count=0,value_size=5))," + "workload_tracking=(enabled=true,op_rate=1s)", + confchk_search_near_02, 10}, {NULL, NULL, NULL, 0}}; /* diff --git a/src/third_party/wiredtiger/src/conn/conn_api.c b/src/third_party/wiredtiger/src/conn/conn_api.c index c06ab898882..2e55aedcd63 100644 --- a/src/third_party/wiredtiger/src/conn/conn_api.c +++ b/src/third_party/wiredtiger/src/conn/conn_api.c @@ -2148,7 +2148,7 @@ __wt_timing_stress_config(WT_SESSION_IMPL *session, const char *cfg[]) {"split_1", WT_TIMING_STRESS_SPLIT_1}, {"split_2", WT_TIMING_STRESS_SPLIT_2}, {"split_3", WT_TIMING_STRESS_SPLIT_3}, {"split_4", WT_TIMING_STRESS_SPLIT_4}, {"split_5", WT_TIMING_STRESS_SPLIT_5}, {"split_6", WT_TIMING_STRESS_SPLIT_6}, - {"split_7", WT_TIMING_STRESS_SPLIT_7}, {"split_8", WT_TIMING_STRESS_SPLIT_8}, {NULL, 0}}; + {"split_7", WT_TIMING_STRESS_SPLIT_7}, {NULL, 0}}; WT_CONFIG_ITEM cval, sval; WT_CONNECTION_IMPL *conn; WT_DECL_RET; diff --git a/src/third_party/wiredtiger/src/conn/conn_dhandle.c b/src/third_party/wiredtiger/src/conn/conn_dhandle.c index decf70dd7e4..215eb5a47f0 100644 --- a/src/third_party/wiredtiger/src/conn/conn_dhandle.c +++ b/src/third_party/wiredtiger/src/conn/conn_dhandle.c @@ -319,6 +319,9 @@ __wt_conn_dhandle_close(WT_SESSION_IMPL *session, bool final, bool mark_dead) /* Reset the tree's eviction priority (if any). */ __wt_evict_priority_clear(session); + + /* Mark the advisory bit that the tree has been evicted. */ + F_SET(dhandle, WT_DHANDLE_EVICTED); } /* diff --git a/src/third_party/wiredtiger/src/conn/conn_tiered.c b/src/third_party/wiredtiger/src/conn/conn_tiered.c index 58b2026c5b8..6f34064ca7e 100644 --- a/src/third_party/wiredtiger/src/conn/conn_tiered.c +++ b/src/third_party/wiredtiger/src/conn/conn_tiered.c @@ -20,6 +20,16 @@ #endif /* + * __tiered_server_run_chk -- + * Check to decide if the tiered storage server should continue running. + */ +static bool +__tiered_server_run_chk(WT_SESSION_IMPL *session) +{ + return (FLD_ISSET(S2C(session)->server_flags, WT_CONN_SERVER_TIERED)); +} + +/* * __flush_tier_wait -- * Wait for all previous work units queued to be processed. */ @@ -121,55 +131,63 @@ err: /* * __tier_storage_remove_local -- - * Perform one iteration of tiered storage local tier removal. + * Perform one iteration of tiered storage local object removal. */ static int -__tier_storage_remove_local(WT_SESSION_IMPL *session, const char *uri, bool force) +__tier_storage_remove_local(WT_SESSION_IMPL *session) { - WT_CONFIG_ITEM cval; WT_DECL_RET; - size_t len; + WT_TIERED_WORK_UNIT *entry; uint64_t now; - char *config, *newfile; - const char *cfg[2], *filename; - - config = newfile = NULL; - if (uri == NULL) - return (0); - __wt_verbose(session, WT_VERB_TIERED, "Removing tree %s", uri); - filename = uri; - WT_PREFIX_SKIP_REQUIRED(session, filename, "tiered:"); - len = strlen("file:") + strlen(filename) + 1; - WT_ERR(__wt_calloc_def(session, len, &newfile)); - WT_ERR(__wt_snprintf(newfile, len, "file:%s", filename)); + const char *object; - /* - * If the file:URI of the tiered object does not exist, there is nothing to do. - */ - ret = __wt_metadata_search(session, newfile, &config); - if (ret == WT_NOTFOUND) { - ret = 0; - goto err; - } - WT_ERR(ret); + entry = NULL; + for (;;) { + /* Check if we're quitting or being reconfigured. */ + if (!__tiered_server_run_chk(session)) + break; - /* - * We have a local version of this tiered data. Check its metadata for when it expires and - * remove if necessary. - */ - cfg[0] = config; - cfg[1] = NULL; - WT_ERR(__wt_config_gets(session, cfg, "local_retention", &cval)); - __wt_seconds(session, &now); - if (force || (uint64_t)cval.val + S2C(session)->bstorage->retain_secs >= now) + __wt_seconds(session, &now); + __wt_tiered_get_drop_local(session, now, &entry); + if (entry == NULL) + break; + WT_ERR(__wt_tiered_name( + session, &entry->tiered->iface, entry->id, WT_TIERED_NAME_OBJECT, &object)); + __wt_verbose(session, WT_VERB_TIERED, "REMOVE_LOCAL: %s at %" PRIu64, object, now); + WT_PREFIX_SKIP_REQUIRED(session, object, "object:"); /* - * We want to remove the entry and the file. Probably do a schema_drop on the file:uri. + * If the handle is still open, it could still be in use for reading. In that case put the + * work unit back on the work queue and keep trying. */ - __wt_verbose(session, WT_VERB_TIERED, "Would remove %s. Local retention expired", newfile); - + if (__wt_handle_is_open(session, object)) { + __wt_verbose(session, WT_VERB_TIERED, "REMOVE_LOCAL: %s in USE, queue again", object); + WT_STAT_CONN_INCR(session, local_objects_inuse); + /* + * FIXME-WT-7470: If the object we want to remove is in use this is the place to call + * object sweep to clean up block->ofh file handles. Another alternative would be to try + * to sweep and then try the remove call below rather than pushing it back on the work + * queue. NOTE: Remove 'ofh' from s_string.ok when removing this comment. + * + * Update the time on the entry before pushing it back on the queue so that we don't get + * into an infinite loop trying to drop an open file that may be in use a while. + */ + WT_ASSERT(session, entry->tiered != NULL && entry->tiered->bstorage != NULL); + entry->op_val = now + entry->tiered->bstorage->retain_secs; + __wt_tiered_push_work(session, entry); + } else { + __wt_verbose(session, WT_VERB_TIERED, "REMOVE_LOCAL: actually remove %s", object); + WT_STAT_CONN_INCR(session, local_objects_removed); + WT_ERR(__wt_fs_remove(session, object, false)); + /* + * We are responsible for freeing the work unit when we're done with it. + */ + __wt_tiered_work_free(session, entry); + } + entry = NULL; + } err: - __wt_free(session, config); - __wt_free(session, newfile); + if (entry != NULL) + __wt_tiered_work_free(session, entry); return (ret); } @@ -230,8 +248,8 @@ err: * Perform one iteration of copying newly flushed objects to the shared storage. */ int -__wt_tier_do_flush( - WT_SESSION_IMPL *session, WT_TIERED *tiered, const char *local_uri, const char *obj_uri) +__wt_tier_do_flush(WT_SESSION_IMPL *session, WT_TIERED *tiered, uint32_t id, const char *local_uri, + const char *obj_uri) { WT_DECL_RET; WT_FILE_SYSTEM *bucket_fs; @@ -260,6 +278,11 @@ __wt_tier_do_flush( */ WT_RET(storage_source->ss_flush_finish( storage_source, &session->iface, bucket_fs, local_name, obj_name, NULL)); + /* + * After successful flushing, push a work unit to drop the local object in the future. The + * object will be removed locally after the local retention period expires. + */ + WT_RET(__wt_tiered_put_drop_local(session, tiered, id)); return (0); } @@ -276,7 +299,7 @@ __wt_tier_flush(WT_SESSION_IMPL *session, WT_TIERED *tiered, uint32_t id) local_uri = obj_uri = NULL; WT_ERR(__wt_tiered_name(session, &tiered->iface, id, WT_TIERED_NAME_LOCAL, &local_uri)); WT_ERR(__wt_tiered_name(session, &tiered->iface, id, WT_TIERED_NAME_OBJECT, &obj_uri)); - WT_ERR(__wt_tier_do_flush(session, tiered, local_uri, obj_uri)); + WT_ERR(__wt_tier_do_flush(session, tiered, id, local_uri, obj_uri)); err: __wt_free(session, local_uri); @@ -296,6 +319,10 @@ __tier_storage_copy(WT_SESSION_IMPL *session) entry = NULL; for (;;) { + /* Check if we're quitting or being reconfigured. */ + if (!__tiered_server_run_chk(session)) + break; + /* * We probably need some kind of flush generation so that we don't process flush items for * tables that are added during an in-progress flush_tier. This thread could run due to a @@ -334,7 +361,7 @@ __tier_storage_remove(WT_SESSION_IMPL *session, bool force) * We want to walk the metadata perhaps and for each tiered URI, call remove on its file:URI * version. */ - WT_RET(__tier_storage_remove_local(session, NULL, force)); + WT_RET(__tier_storage_remove_local(session)); return (0); } @@ -448,16 +475,6 @@ __tiered_manager_config(WT_SESSION_IMPL *session, const char **cfg, bool *runp) } /* - * __tiered_server_run_chk -- - * Check to decide if the tiered storage server should continue running. - */ -static bool -__tiered_server_run_chk(WT_SESSION_IMPL *session) -{ - return (FLD_ISSET(S2C(session)->server_flags, WT_CONN_SERVER_TIERED)); -} - -/* * __tiered_server -- * The tiered storage server thread. */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_backup.c b/src/third_party/wiredtiger/src/cursor/cur_backup.c index fd416d3c452..820ea49aca0 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_backup.c +++ b/src/third_party/wiredtiger/src/cursor/cur_backup.c @@ -268,6 +268,7 @@ __wt_curbackup_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *other, __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curbackup_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_config.c b/src/third_party/wiredtiger/src/cursor/cur_config.c index ade673bba41..0fbf1066b27 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_config.c +++ b/src/third_party/wiredtiger/src/cursor/cur_config.c @@ -51,6 +51,7 @@ __wt_curconfig_open( __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curconfig_close); diff --git a/src/third_party/wiredtiger/src/cursor/cur_ds.c b/src/third_party/wiredtiger/src/cursor/cur_ds.c index 7139f1a8b08..c3e28dd5f59 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_ds.c +++ b/src/third_party/wiredtiger/src/cursor/cur_ds.c @@ -425,6 +425,7 @@ __wt_curds_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, con __curds_remove, /* remove */ __curds_reserve, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curds_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_dump.c b/src/third_party/wiredtiger/src/cursor/cur_dump.c index be4c1c7ef34..64e273f801b 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_dump.c +++ b/src/third_party/wiredtiger/src/cursor/cur_dump.c @@ -396,6 +396,7 @@ __wt_curdump_create(WT_CURSOR *child, WT_CURSOR *owner, WT_CURSOR **cursorp) __curdump_remove, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curdump_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_file.c b/src/third_party/wiredtiger/src/cursor/cur_file.c index ce54fd23abf..23c0a37776c 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_file.c +++ b/src/third_party/wiredtiger/src/cursor/cur_file.c @@ -671,6 +671,7 @@ __curfile_create(WT_SESSION_IMPL *session, WT_CURSOR *owner, const char *cfg[], __curfile_remove, /* remove */ __curfile_reserve, /* reserve */ __wt_cursor_reconfigure, /* reconfigure */ + __wt_cursor_largest_key, /* largest_key */ __curfile_cache, /* cache */ __curfile_reopen, /* reopen */ __curfile_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_hs.c b/src/third_party/wiredtiger/src/cursor/cur_hs.c index 2a2657b828b..00d419915ac 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_hs.c +++ b/src/third_party/wiredtiger/src/cursor/cur_hs.c @@ -1097,6 +1097,7 @@ __wt_curhs_open(WT_SESSION_IMPL *session, WT_CURSOR *owner, WT_CURSOR **cursorp) __curhs_remove, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curhs_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_index.c b/src/third_party/wiredtiger/src/cursor/cur_index.c index ea57c060196..c5c17e92453 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_index.c +++ b/src/third_party/wiredtiger/src/cursor/cur_index.c @@ -453,6 +453,7 @@ __wt_curindex_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curindex_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_join.c b/src/third_party/wiredtiger/src/cursor/cur_join.c index 7f00ea9bc3d..b721fe9d0ee 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_join.c +++ b/src/third_party/wiredtiger/src/cursor/cur_join.c @@ -576,6 +576,7 @@ __curjoin_entry_member( __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __wt_cursor_notsup); /* close */ @@ -1222,6 +1223,7 @@ __wt_curjoin_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, c __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curjoin_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_log.c b/src/third_party/wiredtiger/src/cursor/cur_log.c index f40ef6b7d1a..281050785d4 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_log.c +++ b/src/third_party/wiredtiger/src/cursor/cur_log.c @@ -340,6 +340,7 @@ __wt_curlog_open(WT_SESSION_IMPL *session, const char *uri, const char *cfg[], W __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curlog_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_metadata.c b/src/third_party/wiredtiger/src/cursor/cur_metadata.c index cfd0191a782..f0b04128704 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_metadata.c +++ b/src/third_party/wiredtiger/src/cursor/cur_metadata.c @@ -575,6 +575,7 @@ __wt_curmetadata_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owne __curmetadata_remove, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curmetadata_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_stat.c b/src/third_party/wiredtiger/src/cursor/cur_stat.c index cafa0c49b35..ca78b4bff52 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_stat.c +++ b/src/third_party/wiredtiger/src/cursor/cur_stat.c @@ -608,6 +608,7 @@ __wt_curstat_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *other, c __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curstat_close); /* close */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_std.c b/src/third_party/wiredtiger/src/cursor/cur_std.c index 776ad980d3f..de5115845c7 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_std.c +++ b/src/third_party/wiredtiger/src/cursor/cur_std.c @@ -856,7 +856,7 @@ __wt_cursor_cache_get(WT_SESSION_IMPL *session, const char *uri, uint64_t hash_v * than flag values, so fix them up according to the given configuration. */ F_CLR(cursor, - WT_CURSTD_APPEND | WT_CURSTD_PREFIX_SEARCH | WT_CURSTD_RAW | WT_CURSTD_OVERWRITE); + WT_CURSTD_APPEND | WT_CURSTD_OVERWRITE | WT_CURSTD_PREFIX_SEARCH | WT_CURSTD_RAW); F_SET(cursor, overwrite_flag); /* * If this is a btree cursor, clear its read_once flag. @@ -1084,7 +1084,7 @@ __wt_cursor_reconfigure(WT_CURSOR *cursor, const char *config) WT_ERR_NOTFOUND_OK(ret, false); /* Set the prefix search near flag. */ - if ((ret = __wt_config_getones(session, config, "prefix_key", &cval)) == 0) { + if ((ret = __wt_config_getones(session, config, "prefix_search", &cval)) == 0) { if (cval.val) { /* Prefix search near configuration can only be used for row-store. */ if (WT_CURSOR_RECNO(cursor)) @@ -1114,6 +1114,52 @@ err: } /* + * __wt_cursor_largest_key -- + * WT_CURSOR->largest_key default implementation.. + */ +int +__wt_cursor_largest_key(WT_CURSOR *cursor) +{ + WT_DECL_ITEM(key); + WT_DECL_RET; + WT_SESSION_IMPL *session; + bool ignore_tombstone; + + ignore_tombstone = F_ISSET(cursor, WT_CURSTD_IGNORE_TOMBSTONE); + 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 */ + F_SET(cursor, WT_CURSTD_IGNORE_TOMBSTONE); + + /* Call cursor prev with read uncommitted isolation level. */ + WT_WITH_TXN_ISOLATION(session, WT_ISO_READ_UNCOMMITTED, ret = cursor->prev(cursor)); + WT_ERR(ret); + + /* Copy the key as we will reset the cursor after that. */ + WT_ERR(__wt_buf_set(session, key, cursor->key.data, cursor->key.size)); + WT_ERR(cursor->reset(cursor)); + WT_ERR(__wt_buf_set(session, &cursor->key, key->data, key->size)); + /* Set the key as external. */ + F_SET(cursor, WT_CURSTD_KEY_EXT); + +err: + if (!ignore_tombstone) + F_CLR(cursor, WT_CURSTD_IGNORE_TOMBSTONE); + __wt_scr_free(session, &key); + if (ret != 0) + WT_TRET(cursor->reset(cursor)); + API_END_RET(session, ret); +} + +/* * __wt_cursor_dup_position -- * Set a cursor to another cursor's position. */ diff --git a/src/third_party/wiredtiger/src/cursor/cur_table.c b/src/third_party/wiredtiger/src/cursor/cur_table.c index e4505544544..68776b18ba3 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_table.c +++ b/src/third_party/wiredtiger/src/cursor/cur_table.c @@ -102,6 +102,7 @@ __wt_apply_single_idx(WT_SESSION_IMPL *session, WT_INDEX *idx, WT_CURSOR *cur, __wt_cursor_notsup, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __wt_cursor_notsup); /* close */ @@ -789,6 +790,31 @@ err: } /* + * __curtable_largest_key -- + * WT_CURSOR->largest_key method for the table cursor type. + */ +static int +__curtable_largest_key(WT_CURSOR *cursor) +{ + WT_CURSOR *primary; + WT_CURSOR_TABLE *ctable; + WT_DECL_RET; + WT_SESSION_IMPL *session; + + ctable = (WT_CURSOR_TABLE *)cursor; + JOINABLE_CURSOR_API_CALL(cursor, session, largest_key, NULL); + + WT_ERR(cursor->reset(cursor)); + primary = *ctable->cg_cursors; + WT_ERR(primary->largest_key(primary)); + +err: + if (ret != 0) + WT_TRET(cursor->reset(cursor)); + API_END_RET(session, ret); +} + +/* * __curtable_close -- * WT_CURSOR->close method for the table cursor type. */ @@ -968,6 +994,7 @@ __wt_curtable_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, __curtable_remove, /* remove */ __curtable_reserve, /* reserve */ __wt_cursor_reconfigure, /* reconfigure */ + __curtable_largest_key, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __curtable_close); /* close */ diff --git a/src/third_party/wiredtiger/src/docs/cursor-ops.dox b/src/third_party/wiredtiger/src/docs/cursor-ops.dox index c9d75295ddc..82b763b563f 100644 --- a/src/third_party/wiredtiger/src/docs/cursor-ops.dox +++ b/src/third_party/wiredtiger/src/docs/cursor-ops.dox @@ -103,6 +103,16 @@ fail with ::WT_DUPLICATE_KEY if the record previously exists, and WT_CURSOR::update and WT_CURSOR::remove will fail with ::WT_NOTFOUND if the record does not previously exist. +@snippet ex_cursor.c cursor largest key + +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. + @section cursor_error Cursor position after error After any cursor handle method failure, the cursor's position is diff --git a/src/third_party/wiredtiger/src/docs/spell.ok b/src/third_party/wiredtiger/src/docs/spell.ok index f34eace96d9..6a5b7f8dd5d 100644 --- a/src/third_party/wiredtiger/src/docs/spell.ok +++ b/src/third_party/wiredtiger/src/docs/spell.ok @@ -658,6 +658,7 @@ unescaped unicode uninstall unittest +unpositioned untyped uri useconds diff --git a/src/third_party/wiredtiger/src/evict/evict_lru.c b/src/third_party/wiredtiger/src/evict/evict_lru.c index 0488f2346f6..0bfaf1c9f33 100644 --- a/src/third_party/wiredtiger/src/evict/evict_lru.c +++ b/src/third_party/wiredtiger/src/evict/evict_lru.c @@ -285,7 +285,7 @@ __wt_evict_thread_run(WT_SESSION_IMPL *session, WT_THREAD *thread) * busy and then opens a different file (in this case, the HS file), it can deadlock with a * thread waiting for the first file to drain from the eviction queue. See WT-5946 for details. */ - WT_RET(__wt_curhs_cache(session)); + WT_ERR(__wt_curhs_cache(session)); if (conn->evict_server_running && __wt_spin_trylock(session, &cache->evict_pass_lock) == 0) { /* * Cannot use WT_WITH_PASS_LOCK because this is a try lock. Fix when that is supported. We @@ -349,10 +349,11 @@ __wt_evict_thread_stop(WT_SESSION_IMPL *session, WT_THREAD *thread) WT_WITH_PASS_LOCK(session, ret = __evict_clear_all_walks(session)); WT_ERR(ret); /* - * The only two cases when the eviction server is expected to stop are when recovery is finished - * or when the connection is closing. + * The only cases when the eviction server is expected to stop are when recovery is finished, + * when the connection is closing or when an error has occurred and connection panic flag is + * set. */ - WT_ASSERT(session, F_ISSET(conn, WT_CONN_CLOSING | WT_CONN_RECOVERING)); + WT_ASSERT(session, F_ISSET(conn, WT_CONN_CLOSING | WT_CONN_PANIC | WT_CONN_RECOVERING)); /* Clear the eviction thread session flag. */ F_CLR(session, WT_SESSION_EVICTION); @@ -2046,9 +2047,14 @@ fast: */ if (pages_queued < target_pages / 2 && !urgent_queued) btree->evict_walk_period = WT_MIN(WT_MAX(1, 2 * btree->evict_walk_period), 100); - else if (pages_queued == target_pages) + else if (pages_queued == target_pages) { btree->evict_walk_period = 0; - else if (btree->evict_walk_period > 0) + /* + * If there's a chance the Btree was fully evicted, update the evicted flag in the handle. + */ + if (__wt_btree_bytes_evictable(session) == 0) + F_SET(session->dhandle, WT_DHANDLE_EVICTED); + } else if (btree->evict_walk_period > 0) btree->evict_walk_period /= 2; /* diff --git a/src/third_party/wiredtiger/src/include/btree_inline.h b/src/third_party/wiredtiger/src/include/btree_inline.h index adcf81b83bb..7b9a2b74a5f 100644 --- a/src/third_party/wiredtiger/src/include/btree_inline.h +++ b/src/third_party/wiredtiger/src/include/btree_inline.h @@ -2003,50 +2003,44 @@ __wt_page_swap_func(WT_SESSION_IMPL *session, WT_REF *held, WT_REF *want, uint32 * Return if the cursor is pointing to a page with deleted records and can be skipped for cursor * traversal. */ -static inline bool -__wt_btcur_skip_page(WT_CURSOR_BTREE *cbt) +static inline int +__wt_btcur_skip_page(WT_SESSION_IMPL *session, WT_REF *ref, void *context, bool *skipp) { WT_ADDR_COPY addr; - WT_PAGE *page; - WT_REF *ref; - WT_SESSION_IMPL *session; uint8_t previous_state; - bool can_skip; - session = CUR2S(cbt); - ref = cbt->ref; - page = cbt->ref == NULL ? NULL : cbt->ref->page; + WT_UNUSED(context); - if (page == NULL) - return false; - - previous_state = ref->state; - can_skip = false; + *skipp = false; /* Default to reading */ /* * Determine if all records on the page have been deleted and all the tombstones are visible to * our transaction. If so, we can avoid reading the records on the page and move to the next * page. We base this decision on the aggregate stop point added to the page during the last - * reconciliation. We can skip this test if the page has been modified since it was reconciled - * or the underlying cursor is configured to ignore tombstones. + * reconciliation. We can skip this test if the page has been modified since it was reconciled. + * We also skip this test on an internal page, as we rely on reconciliation to mark the internal + * page dirty. There could be a period of time when the internal page is marked clean but the + * leaf page is dirty and has newer data than let on by the internal page's aggregated + * information. * * We are making these decisions while holding a lock for the page as checkpoint or eviction can - * make changes to the data structures (i.e., aggregate timestamps) we are reading. + * make changes to the data structures (i.e., aggregate timestamps) we are reading. It is okay + * if the page is not in memory, or gets evicted before we lock it. In such a case, we can forgo + * checking if the page has been modified. So, only do a page modified check if the page was in + * memory before locking. */ - if (session->txn->isolation == WT_ISO_SNAPSHOT && !__wt_page_is_modified(page) && - !F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE) && previous_state == WT_REF_MEM) { - - /* We only try to lock the page once. */ - if (!WT_REF_CAS_STATE(session, ref, previous_state, WT_REF_LOCKED)) - return false; + if (F_ISSET(ref, WT_REF_FLAG_INTERNAL)) + return (0); - if (__wt_ref_addr_copy(session, ref, &addr) && - __wt_txn_visible(session, addr.ta.newest_stop_txn, addr.ta.newest_stop_ts) && - __wt_txn_visible(session, addr.ta.newest_stop_txn, addr.ta.newest_stop_durable_ts)) - can_skip = true; + WT_REF_LOCK(session, ref, &previous_state); + if ((previous_state == WT_REF_DISK || previous_state == WT_REF_DELETED || + (previous_state == WT_REF_MEM && !__wt_page_is_modified(ref->page))) && + __wt_ref_addr_copy(session, ref, &addr) && addr.ta.newest_stop_txn != WT_TXN_MAX && + addr.ta.newest_stop_ts != WT_TS_MAX && + __wt_txn_visible(session, addr.ta.newest_stop_txn, addr.ta.newest_stop_ts)) + *skipp = true; - WT_REF_SET_STATE(ref, previous_state); - } + WT_REF_UNLOCK(ref, previous_state); - return (can_skip); + return (0); } diff --git a/src/third_party/wiredtiger/src/include/connection.h b/src/third_party/wiredtiger/src/include/connection.h index c94dd274fbc..5b8f7e9f8e4 100644 --- a/src/third_party/wiredtiger/src/include/connection.h +++ b/src/third_party/wiredtiger/src/include/connection.h @@ -614,7 +614,6 @@ struct __wt_connection_impl { #define WT_TIMING_STRESS_SPLIT_5 0x08000u #define WT_TIMING_STRESS_SPLIT_6 0x10000u #define WT_TIMING_STRESS_SPLIT_7 0x20000u -#define WT_TIMING_STRESS_SPLIT_8 0x40000u /* AUTOMATIC FLAG VALUE GENERATION STOP 64 */ uint64_t timing_stress_flags; diff --git a/src/third_party/wiredtiger/src/include/cursor.h b/src/third_party/wiredtiger/src/include/cursor.h index 569da6aabaa..85797573e23 100644 --- a/src/third_party/wiredtiger/src/include/cursor.h +++ b/src/third_party/wiredtiger/src/include/cursor.h @@ -12,27 +12,27 @@ /* * Initialize a static WT_CURSOR structure. */ -#define WT_CURSOR_STATIC_INIT(n, get_key, get_value, set_key, set_value, compare, equals, next, \ - prev, reset, search, search_near, insert, modify, update, remove, reserve, reconfigure, cache, \ - reopen, close) \ - static const WT_CURSOR n = { \ - NULL, /* session */ \ - NULL, /* uri */ \ - NULL, /* key_format */ \ - NULL, /* value_format */ \ - get_key, get_value, set_key, set_value, compare, equals, next, prev, reset, search, \ - search_near, insert, modify, update, remove, reserve, close, reconfigure, cache, reopen, \ - 0, /* uri_hash */ \ - {NULL, NULL}, /* TAILQ_ENTRY q */ \ - 0, /* recno key */ \ - {0}, /* recno raw buffer */ \ - NULL, /* json_private */ \ - NULL, /* lang_private */ \ - {NULL, 0, NULL, 0, 0}, /* WT_ITEM key */ \ - {NULL, 0, NULL, 0, 0}, /* WT_ITEM value */ \ - 0, /* int saved_err */ \ - NULL, /* internal_uri */ \ - 0 /* uint32_t flags */ \ +#define WT_CURSOR_STATIC_INIT(n, get_key, get_value, set_key, set_value, compare, equals, next, \ + prev, reset, search, search_near, insert, modify, update, remove, reserve, reconfigure, \ + largest_key, cache, reopen, close) \ + static const WT_CURSOR n = { \ + NULL, /* session */ \ + NULL, /* uri */ \ + NULL, /* key_format */ \ + NULL, /* value_format */ \ + get_key, get_value, set_key, set_value, compare, equals, next, prev, reset, search, \ + search_near, insert, modify, update, remove, reserve, close, reconfigure, largest_key, \ + cache, reopen, 0, /* uri_hash */ \ + {NULL, NULL}, /* TAILQ_ENTRY q */ \ + 0, /* recno key */ \ + {0}, /* recno raw buffer */ \ + NULL, /* json_private */ \ + NULL, /* lang_private */ \ + {NULL, 0, NULL, 0, 0}, /* WT_ITEM key */ \ + {NULL, 0, NULL, 0, 0}, /* WT_ITEM value */ \ + 0, /* int saved_err */ \ + NULL, /* internal_uri */ \ + 0 /* uint32_t flags */ \ } struct __wt_cursor_backup { diff --git a/src/third_party/wiredtiger/src/include/dhandle.h b/src/third_party/wiredtiger/src/include/dhandle.h index 133ab688544..d4e23e52c8f 100644 --- a/src/third_party/wiredtiger/src/include/dhandle.h +++ b/src/third_party/wiredtiger/src/include/dhandle.h @@ -119,11 +119,12 @@ struct __wt_data_handle { #define WT_DHANDLE_DISCARD 0x002u /* Close on release */ #define WT_DHANDLE_DISCARD_KILL 0x004u /* Mark dead on release */ #define WT_DHANDLE_DROPPED 0x008u /* Handle is dropped */ -#define WT_DHANDLE_EXCLUSIVE 0x010u /* Exclusive access */ -#define WT_DHANDLE_HS 0x020u /* History store table */ -#define WT_DHANDLE_IS_METADATA 0x040u /* Metadata handle */ -#define WT_DHANDLE_LOCK_ONLY 0x080u /* Handle only used as a lock */ -#define WT_DHANDLE_OPEN 0x100u /* Handle is open */ +#define WT_DHANDLE_EVICTED 0x010u /* Btree is evicted (advisory) */ +#define WT_DHANDLE_EXCLUSIVE 0x020u /* Exclusive access */ +#define WT_DHANDLE_HS 0x040u /* History store table */ +#define WT_DHANDLE_IS_METADATA 0x080u /* Metadata handle */ +#define WT_DHANDLE_LOCK_ONLY 0x100u /* Handle only used as a lock */ +#define WT_DHANDLE_OPEN 0x200u /* Handle is open */ /* AUTOMATIC FLAG VALUE GENERATION STOP 12 */ uint32_t flags; diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h index 3468dbfa24b..0f4f3d84a67 100644 --- a/src/third_party/wiredtiger/src/include/extern.h +++ b/src/third_party/wiredtiger/src/include/extern.h @@ -577,6 +577,8 @@ extern int __wt_cursor_key_order_init(WT_CURSOR_BTREE *cbt) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_cursor_kv_not_set(WT_CURSOR *cursor, bool key) WT_GCC_FUNC_DECL_ATTRIBUTE((cold)) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); +extern int __wt_cursor_largest_key(WT_CURSOR *cursor) + WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_cursor_modify_notsup(WT_CURSOR *cursor, WT_MODIFY *entries, int nentries) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_cursor_modify_value_format_notsup(WT_CURSOR *cursor, WT_MODIFY *entries, @@ -1363,8 +1365,6 @@ extern int __wt_scr_alloc_func(WT_SESSION_IMPL *session, size_t size, WT_ITEM ** WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_search_insert(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_INSERT_HEAD *ins_head, WT_ITEM *srch_key) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); -extern int __wt_session_blocking_checkpoint(WT_SESSION_IMPL *session, bool force, uint64_t seconds) - WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_session_breakpoint(WT_SESSION *wt_session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_session_close_internal(WT_SESSION_IMPL *session) @@ -1474,8 +1474,8 @@ extern int __wt_thread_group_destroy(WT_SESSION_IMPL *session, WT_THREAD_GROUP * extern int __wt_thread_group_resize(WT_SESSION_IMPL *session, WT_THREAD_GROUP *group, uint32_t new_min, uint32_t new_max, uint32_t flags) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); -extern int __wt_tier_do_flush(WT_SESSION_IMPL *session, WT_TIERED *tiered, const char *local_uri, - const char *obj_uri) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); +extern int __wt_tier_do_flush(WT_SESSION_IMPL *session, WT_TIERED *tiered, uint32_t id, + const char *local_uri, const char *obj_uri) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_tier_flush(WT_SESSION_IMPL *session, WT_TIERED *tiered, uint32_t id) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); extern int __wt_tiered_bucket_config(WT_SESSION_IMPL *session, const char *cfg[], @@ -1895,8 +1895,6 @@ static inline WT_IKEY *__wt_ref_key_instantiated(WT_REF *ref) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline WT_VISIBLE_TYPE __wt_txn_upd_visible_type(WT_SESSION_IMPL *session, WT_UPDATE *upd) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); -static inline bool __wt_btcur_skip_page(WT_CURSOR_BTREE *cbt) - WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline bool __wt_btree_can_evict_dirty(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline bool __wt_btree_dominating_cache(WT_SESSION_IMPL *session, WT_BTREE *btree) @@ -1982,6 +1980,8 @@ static inline bool __wt_txn_visible_id_snapshot(uint64_t id, uint64_t snap_min, uint64_t *snapshot, uint32_t snapshot_count) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline double __wt_eviction_dirty_target(WT_CACHE *cache) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); +static inline int __wt_btcur_skip_page(WT_SESSION_IMPL *session, WT_REF *ref, void *context, + bool *skipp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline int __wt_btree_block_free(WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline int __wt_buf_extend(WT_SESSION_IMPL *session, WT_ITEM *buf, size_t size) diff --git a/src/third_party/wiredtiger/src/include/os_fs_inline.h b/src/third_party/wiredtiger/src/include/os_fs_inline.h index 2276f096312..2010032a5c2 100644 --- a/src/third_party/wiredtiger/src/include/os_fs_inline.h +++ b/src/third_party/wiredtiger/src/include/os_fs_inline.h @@ -141,7 +141,7 @@ __wt_fs_remove(WT_SESSION_IMPL *session, const char *name, bool durable) * It is a layering violation to retrieve a WT_FH here, but it is a useful diagnostic to ensure * WiredTiger doesn't have the handle open. */ - if (__wt_handle_is_open(session, name)) + if (__wt_handle_is_open(session, name) && !F_ISSET(session, WT_SESSION_QUIET_TIERED)) WT_RET_MSG(session, EINVAL, "%s: file-remove: file has open handles", name); #endif diff --git a/src/third_party/wiredtiger/src/include/session.h b/src/third_party/wiredtiger/src/include/session.h index 465f641954b..5206910f139 100644 --- a/src/third_party/wiredtiger/src/include/session.h +++ b/src/third_party/wiredtiger/src/include/session.h @@ -203,10 +203,11 @@ struct __wt_session_impl { #define WT_SESSION_NO_LOGGING 0x00800u #define WT_SESSION_NO_RECONCILE 0x01000u #define WT_SESSION_QUIET_CORRUPT_FILE 0x02000u -#define WT_SESSION_READ_WONT_NEED 0x04000u -#define WT_SESSION_RESOLVING_TXN 0x08000u -#define WT_SESSION_ROLLBACK_TO_STABLE 0x10000u -#define WT_SESSION_SCHEMA_TXN 0x20000u +#define WT_SESSION_QUIET_TIERED 0x04000u +#define WT_SESSION_READ_WONT_NEED 0x08000u +#define WT_SESSION_RESOLVING_TXN 0x10000u +#define WT_SESSION_ROLLBACK_TO_STABLE 0x20000u +#define WT_SESSION_SCHEMA_TXN 0x40000u /* AUTOMATIC FLAG VALUE GENERATION STOP 32 */ uint32_t flags; diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h index 2eb26c749dc..df1cd95de67 100644 --- a/src/third_party/wiredtiger/src/include/stat.h +++ b/src/third_party/wiredtiger/src/include/stat.h @@ -508,8 +508,6 @@ struct __wt_connection_stats { int64_t cursor_next_skip_total; int64_t cursor_prev_skip_total; int64_t cursor_skip_hs_cur_position; - int64_t cursor_next_skip_page_count; - int64_t cursor_prev_skip_page_count; int64_t cursor_search_near_prefix_fast_paths; int64_t cursor_cached_count; int64_t cursor_insert_bulk; @@ -688,8 +686,9 @@ struct __wt_connection_stats { int64_t rec_time_window_stop_txn; int64_t rec_split_stashed_bytes; int64_t rec_split_stashed_objects; - int64_t flush_state_races; + int64_t local_objects_inuse; int64_t flush_tier; + int64_t local_objects_removed; int64_t session_open; int64_t session_query_ts; int64_t session_table_alter_fail; @@ -946,8 +945,6 @@ struct __wt_dsrc_stats { int64_t cursor_next_skip_total; int64_t cursor_prev_skip_total; int64_t cursor_skip_hs_cur_position; - int64_t cursor_next_skip_page_count; - int64_t cursor_prev_skip_page_count; int64_t cursor_search_near_prefix_fast_paths; int64_t cursor_insert_bulk; int64_t cursor_reopen; diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in index daba823f589..fc8e542c33a 100644 --- a/src/third_party/wiredtiger/src/include/wiredtiger.in +++ b/src/third_party/wiredtiger/src/include/wiredtiger.in @@ -661,6 +661,19 @@ struct __wt_cursor { */ int __F(reconfigure)(WT_CURSOR *cursor, const char *config); + /*! + * Get the largest key of the cursor regardless of visibility. + * The cursor is not positioned after calling this api. Only supported by data cursors. + * + * @snippet ex_all.c Reset the cursor + * + * @param cursor the cursor handle + * @errors + * If \c read_timestamp is set, EINVAL is returned. + * Also, calling \c WT_CURSOR::get_key after this api call returns EINVAL. + */ + int __F(largest_key)(WT_CURSOR *cursor); + /* * Protected fields, only to be used by cursor implementations. */ @@ -5468,728 +5481,720 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection); */ #define WT_STAT_CONN_CURSOR_SKIP_HS_CUR_POSITION 1194 /*! - * cursor: Total number of pages skipped without reading by cursor next - * calls - */ -#define WT_STAT_CONN_CURSOR_NEXT_SKIP_PAGE_COUNT 1195 -/*! - * cursor: Total number of pages skipped without reading by cursor prev - * calls - */ -#define WT_STAT_CONN_CURSOR_PREV_SKIP_PAGE_COUNT 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 1197 +#define WT_STAT_CONN_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 1195 /*! cursor: cached cursor count */ -#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1198 +#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1196 /*! cursor: cursor bulk loaded cursor insert calls */ -#define WT_STAT_CONN_CURSOR_INSERT_BULK 1199 +#define WT_STAT_CONN_CURSOR_INSERT_BULK 1197 /*! cursor: cursor close calls that result in cache */ -#define WT_STAT_CONN_CURSOR_CACHE 1200 +#define WT_STAT_CONN_CURSOR_CACHE 1198 /*! cursor: cursor create calls */ -#define WT_STAT_CONN_CURSOR_CREATE 1201 +#define WT_STAT_CONN_CURSOR_CREATE 1199 /*! cursor: cursor insert calls */ -#define WT_STAT_CONN_CURSOR_INSERT 1202 +#define WT_STAT_CONN_CURSOR_INSERT 1200 /*! cursor: cursor insert key and value bytes */ -#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1203 +#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1201 /*! cursor: cursor modify calls */ -#define WT_STAT_CONN_CURSOR_MODIFY 1204 +#define WT_STAT_CONN_CURSOR_MODIFY 1202 /*! cursor: cursor modify key and value bytes affected */ -#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1205 +#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1203 /*! cursor: cursor modify value bytes modified */ -#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1206 +#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1204 /*! cursor: cursor next calls */ -#define WT_STAT_CONN_CURSOR_NEXT 1207 +#define WT_STAT_CONN_CURSOR_NEXT 1205 /*! * cursor: cursor next calls that skip due to a globally visible history * store tombstone */ -#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1208 +#define WT_STAT_CONN_CURSOR_NEXT_HS_TOMBSTONE 1206 /*! * cursor: cursor next calls that skip greater than or equal to 100 * entries */ -#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1209 +#define WT_STAT_CONN_CURSOR_NEXT_SKIP_GE_100 1207 /*! cursor: cursor next calls that skip less than 100 entries */ -#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1210 +#define WT_STAT_CONN_CURSOR_NEXT_SKIP_LT_100 1208 /*! cursor: cursor operation restarted */ -#define WT_STAT_CONN_CURSOR_RESTART 1211 +#define WT_STAT_CONN_CURSOR_RESTART 1209 /*! cursor: cursor prev calls */ -#define WT_STAT_CONN_CURSOR_PREV 1212 +#define WT_STAT_CONN_CURSOR_PREV 1210 /*! * cursor: cursor prev calls that skip due to a globally visible history * store tombstone */ -#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1213 +#define WT_STAT_CONN_CURSOR_PREV_HS_TOMBSTONE 1211 /*! * cursor: cursor prev calls that skip greater than or equal to 100 * entries */ -#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1214 +#define WT_STAT_CONN_CURSOR_PREV_SKIP_GE_100 1212 /*! cursor: cursor prev calls that skip less than 100 entries */ -#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1215 +#define WT_STAT_CONN_CURSOR_PREV_SKIP_LT_100 1213 /*! cursor: cursor remove calls */ -#define WT_STAT_CONN_CURSOR_REMOVE 1216 +#define WT_STAT_CONN_CURSOR_REMOVE 1214 /*! cursor: cursor remove key bytes removed */ -#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1217 +#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1215 /*! cursor: cursor reserve calls */ -#define WT_STAT_CONN_CURSOR_RESERVE 1218 +#define WT_STAT_CONN_CURSOR_RESERVE 1216 /*! cursor: cursor reset calls */ -#define WT_STAT_CONN_CURSOR_RESET 1219 +#define WT_STAT_CONN_CURSOR_RESET 1217 /*! cursor: cursor search calls */ -#define WT_STAT_CONN_CURSOR_SEARCH 1220 +#define WT_STAT_CONN_CURSOR_SEARCH 1218 /*! cursor: cursor search history store calls */ -#define WT_STAT_CONN_CURSOR_SEARCH_HS 1221 +#define WT_STAT_CONN_CURSOR_SEARCH_HS 1219 /*! cursor: cursor search near calls */ -#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1222 +#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1220 /*! cursor: cursor sweep buckets */ -#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1223 +#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1221 /*! cursor: cursor sweep cursors closed */ -#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1224 +#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1222 /*! cursor: cursor sweep cursors examined */ -#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1225 +#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1223 /*! cursor: cursor sweeps */ -#define WT_STAT_CONN_CURSOR_SWEEP 1226 +#define WT_STAT_CONN_CURSOR_SWEEP 1224 /*! cursor: cursor truncate calls */ -#define WT_STAT_CONN_CURSOR_TRUNCATE 1227 +#define WT_STAT_CONN_CURSOR_TRUNCATE 1225 /*! cursor: cursor update calls */ -#define WT_STAT_CONN_CURSOR_UPDATE 1228 +#define WT_STAT_CONN_CURSOR_UPDATE 1226 /*! cursor: cursor update key and value bytes */ -#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1229 +#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1227 /*! cursor: cursor update value size change */ -#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1230 +#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1228 /*! cursor: cursors reused from cache */ -#define WT_STAT_CONN_CURSOR_REOPEN 1231 +#define WT_STAT_CONN_CURSOR_REOPEN 1229 /*! cursor: open cursor count */ -#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1232 +#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1230 /*! data-handle: connection data handle size */ -#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1233 +#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1231 /*! data-handle: connection data handles currently active */ -#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1234 +#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1232 /*! data-handle: connection sweep candidate became referenced */ -#define WT_STAT_CONN_DH_SWEEP_REF 1235 +#define WT_STAT_CONN_DH_SWEEP_REF 1233 /*! data-handle: connection sweep dhandles closed */ -#define WT_STAT_CONN_DH_SWEEP_CLOSE 1236 +#define WT_STAT_CONN_DH_SWEEP_CLOSE 1234 /*! data-handle: connection sweep dhandles removed from hash list */ -#define WT_STAT_CONN_DH_SWEEP_REMOVE 1237 +#define WT_STAT_CONN_DH_SWEEP_REMOVE 1235 /*! data-handle: connection sweep time-of-death sets */ -#define WT_STAT_CONN_DH_SWEEP_TOD 1238 +#define WT_STAT_CONN_DH_SWEEP_TOD 1236 /*! data-handle: connection sweeps */ -#define WT_STAT_CONN_DH_SWEEPS 1239 +#define WT_STAT_CONN_DH_SWEEPS 1237 /*! * data-handle: connection sweeps skipped due to checkpoint gathering * handles */ -#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1240 +#define WT_STAT_CONN_DH_SWEEP_SKIP_CKPT 1238 /*! data-handle: session dhandles swept */ -#define WT_STAT_CONN_DH_SESSION_HANDLES 1241 +#define WT_STAT_CONN_DH_SESSION_HANDLES 1239 /*! data-handle: session sweep attempts */ -#define WT_STAT_CONN_DH_SESSION_SWEEPS 1242 +#define WT_STAT_CONN_DH_SESSION_SWEEPS 1240 /*! lock: checkpoint lock acquisitions */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1243 +#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1241 /*! lock: checkpoint lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1244 +#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1242 /*! lock: checkpoint lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1245 +#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1243 /*! lock: dhandle lock application thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1246 +#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1244 /*! lock: dhandle lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1247 +#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1245 /*! lock: dhandle read lock acquisitions */ -#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1248 +#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1246 /*! lock: dhandle write lock acquisitions */ -#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1249 +#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1247 /*! * lock: durable timestamp queue lock application thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1250 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1248 /*! * lock: durable timestamp queue lock internal thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1251 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1249 /*! lock: durable timestamp queue read lock acquisitions */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1252 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1250 /*! lock: durable timestamp queue write lock acquisitions */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1253 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1251 /*! lock: metadata lock acquisitions */ -#define WT_STAT_CONN_LOCK_METADATA_COUNT 1254 +#define WT_STAT_CONN_LOCK_METADATA_COUNT 1252 /*! lock: metadata lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1255 +#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1253 /*! lock: metadata lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1256 +#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1254 /*! * lock: read timestamp queue lock application thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1257 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1255 /*! lock: read timestamp queue lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1258 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1256 /*! lock: read timestamp queue read lock acquisitions */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1259 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1257 /*! lock: read timestamp queue write lock acquisitions */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1260 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1258 /*! lock: schema lock acquisitions */ -#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1261 +#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1259 /*! lock: schema lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1262 +#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1260 /*! lock: schema lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1263 +#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1261 /*! * lock: table lock application thread time waiting for the table lock * (usecs) */ -#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1264 +#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1262 /*! * lock: table lock internal thread time waiting for the table lock * (usecs) */ -#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1265 +#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1263 /*! lock: table read lock acquisitions */ -#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1266 +#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1264 /*! lock: table write lock acquisitions */ -#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1267 +#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1265 /*! lock: txn global lock application thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1268 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1266 /*! lock: txn global lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1269 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1267 /*! lock: txn global read lock acquisitions */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1270 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1268 /*! lock: txn global write lock acquisitions */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1271 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1269 /*! log: busy returns attempting to switch slots */ -#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1272 +#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1270 /*! log: force archive time sleeping (usecs) */ -#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1273 +#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1271 /*! log: log bytes of payload data */ -#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1274 +#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1272 /*! log: log bytes written */ -#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1275 +#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1273 /*! log: log files manually zero-filled */ -#define WT_STAT_CONN_LOG_ZERO_FILLS 1276 +#define WT_STAT_CONN_LOG_ZERO_FILLS 1274 /*! log: log flush operations */ -#define WT_STAT_CONN_LOG_FLUSH 1277 +#define WT_STAT_CONN_LOG_FLUSH 1275 /*! log: log force write operations */ -#define WT_STAT_CONN_LOG_FORCE_WRITE 1278 +#define WT_STAT_CONN_LOG_FORCE_WRITE 1276 /*! log: log force write operations skipped */ -#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1279 +#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1277 /*! log: log records compressed */ -#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1280 +#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1278 /*! log: log records not compressed */ -#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1281 +#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1279 /*! log: log records too small to compress */ -#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1282 +#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1280 /*! log: log release advances write LSN */ -#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1283 +#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1281 /*! log: log scan operations */ -#define WT_STAT_CONN_LOG_SCANS 1284 +#define WT_STAT_CONN_LOG_SCANS 1282 /*! log: log scan records requiring two reads */ -#define WT_STAT_CONN_LOG_SCAN_REREADS 1285 +#define WT_STAT_CONN_LOG_SCAN_REREADS 1283 /*! log: log server thread advances write LSN */ -#define WT_STAT_CONN_LOG_WRITE_LSN 1286 +#define WT_STAT_CONN_LOG_WRITE_LSN 1284 /*! log: log server thread write LSN walk skipped */ -#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1287 +#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1285 /*! log: log sync operations */ -#define WT_STAT_CONN_LOG_SYNC 1288 +#define WT_STAT_CONN_LOG_SYNC 1286 /*! log: log sync time duration (usecs) */ -#define WT_STAT_CONN_LOG_SYNC_DURATION 1289 +#define WT_STAT_CONN_LOG_SYNC_DURATION 1287 /*! log: log sync_dir operations */ -#define WT_STAT_CONN_LOG_SYNC_DIR 1290 +#define WT_STAT_CONN_LOG_SYNC_DIR 1288 /*! log: log sync_dir time duration (usecs) */ -#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1291 +#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1289 /*! log: log write operations */ -#define WT_STAT_CONN_LOG_WRITES 1292 +#define WT_STAT_CONN_LOG_WRITES 1290 /*! log: logging bytes consolidated */ -#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1293 +#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1291 /*! log: maximum log file size */ -#define WT_STAT_CONN_LOG_MAX_FILESIZE 1294 +#define WT_STAT_CONN_LOG_MAX_FILESIZE 1292 /*! log: number of pre-allocated log files to create */ -#define WT_STAT_CONN_LOG_PREALLOC_MAX 1295 +#define WT_STAT_CONN_LOG_PREALLOC_MAX 1293 /*! log: pre-allocated log files not ready and missed */ -#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1296 +#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1294 /*! log: pre-allocated log files prepared */ -#define WT_STAT_CONN_LOG_PREALLOC_FILES 1297 +#define WT_STAT_CONN_LOG_PREALLOC_FILES 1295 /*! log: pre-allocated log files used */ -#define WT_STAT_CONN_LOG_PREALLOC_USED 1298 +#define WT_STAT_CONN_LOG_PREALLOC_USED 1296 /*! log: records processed by log scan */ -#define WT_STAT_CONN_LOG_SCAN_RECORDS 1299 +#define WT_STAT_CONN_LOG_SCAN_RECORDS 1297 /*! log: slot close lost race */ -#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1300 +#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1298 /*! log: slot close unbuffered waits */ -#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1301 +#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1299 /*! log: slot closures */ -#define WT_STAT_CONN_LOG_SLOT_CLOSES 1302 +#define WT_STAT_CONN_LOG_SLOT_CLOSES 1300 /*! log: slot join atomic update races */ -#define WT_STAT_CONN_LOG_SLOT_RACES 1303 +#define WT_STAT_CONN_LOG_SLOT_RACES 1301 /*! log: slot join calls atomic updates raced */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1304 +#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1302 /*! log: slot join calls did not yield */ -#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1305 +#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1303 /*! log: slot join calls found active slot closed */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1306 +#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1304 /*! log: slot join calls slept */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1307 +#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1305 /*! log: slot join calls yielded */ -#define WT_STAT_CONN_LOG_SLOT_YIELD 1308 +#define WT_STAT_CONN_LOG_SLOT_YIELD 1306 /*! log: slot join found active slot closed */ -#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1309 +#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1307 /*! log: slot joins yield time (usecs) */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1310 +#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1308 /*! log: slot transitions unable to find free slot */ -#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1311 +#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1309 /*! log: slot unbuffered writes */ -#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1312 +#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1310 /*! log: total in-memory size of compressed records */ -#define WT_STAT_CONN_LOG_COMPRESS_MEM 1313 +#define WT_STAT_CONN_LOG_COMPRESS_MEM 1311 /*! log: total log buffer size */ -#define WT_STAT_CONN_LOG_BUFFER_SIZE 1314 +#define WT_STAT_CONN_LOG_BUFFER_SIZE 1312 /*! log: total size of compressed records */ -#define WT_STAT_CONN_LOG_COMPRESS_LEN 1315 +#define WT_STAT_CONN_LOG_COMPRESS_LEN 1313 /*! log: written slots coalesced */ -#define WT_STAT_CONN_LOG_SLOT_COALESCED 1316 +#define WT_STAT_CONN_LOG_SLOT_COALESCED 1314 /*! log: yields waiting for previous log file close */ -#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1317 +#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1315 /*! perf: file system read latency histogram (bucket 1) - 10-49ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1318 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1316 /*! perf: file system read latency histogram (bucket 2) - 50-99ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1319 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1317 /*! perf: file system read latency histogram (bucket 3) - 100-249ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1320 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1318 /*! perf: file system read latency histogram (bucket 4) - 250-499ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1321 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1319 /*! perf: file system read latency histogram (bucket 5) - 500-999ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1322 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1320 /*! perf: file system read latency histogram (bucket 6) - 1000ms+ */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1323 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1321 /*! perf: file system write latency histogram (bucket 1) - 10-49ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1324 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1322 /*! perf: file system write latency histogram (bucket 2) - 50-99ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1325 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1323 /*! perf: file system write latency histogram (bucket 3) - 100-249ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1326 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1324 /*! perf: file system write latency histogram (bucket 4) - 250-499ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1327 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1325 /*! perf: file system write latency histogram (bucket 5) - 500-999ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1328 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1326 /*! perf: file system write latency histogram (bucket 6) - 1000ms+ */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1329 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1327 /*! perf: operation read latency histogram (bucket 1) - 100-249us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1330 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1328 /*! perf: operation read latency histogram (bucket 2) - 250-499us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1331 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1329 /*! perf: operation read latency histogram (bucket 3) - 500-999us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1332 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1330 /*! perf: operation read latency histogram (bucket 4) - 1000-9999us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1333 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1331 /*! perf: operation read latency histogram (bucket 5) - 10000us+ */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1334 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1332 /*! perf: operation write latency histogram (bucket 1) - 100-249us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1335 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1333 /*! perf: operation write latency histogram (bucket 2) - 250-499us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1336 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1334 /*! perf: operation write latency histogram (bucket 3) - 500-999us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1337 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1335 /*! perf: operation write latency histogram (bucket 4) - 1000-9999us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1338 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1336 /*! perf: operation write latency histogram (bucket 5) - 10000us+ */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1339 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1337 /*! reconciliation: approximate byte size of timestamps in pages written */ -#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1340 +#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TS 1338 /*! * reconciliation: approximate byte size of transaction IDs in pages * written */ -#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1341 +#define WT_STAT_CONN_REC_TIME_WINDOW_BYTES_TXN 1339 /*! reconciliation: fast-path pages deleted */ -#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1342 +#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1340 /*! reconciliation: internal-page overflow keys */ -#define WT_STAT_CONN_REC_OVERFLOW_KEY_INTERNAL 1343 +#define WT_STAT_CONN_REC_OVERFLOW_KEY_INTERNAL 1341 /*! reconciliation: leaf-page overflow keys */ -#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1344 +#define WT_STAT_CONN_REC_OVERFLOW_KEY_LEAF 1342 /*! reconciliation: maximum seconds spent in a reconciliation call */ -#define WT_STAT_CONN_REC_MAXIMUM_SECONDS 1345 +#define WT_STAT_CONN_REC_MAXIMUM_SECONDS 1343 /*! reconciliation: page reconciliation calls */ -#define WT_STAT_CONN_REC_PAGES 1346 +#define WT_STAT_CONN_REC_PAGES 1344 /*! reconciliation: page reconciliation calls for eviction */ -#define WT_STAT_CONN_REC_PAGES_EVICTION 1347 +#define WT_STAT_CONN_REC_PAGES_EVICTION 1345 /*! * reconciliation: page reconciliation calls that resulted in values with * prepared transaction metadata */ -#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1348 +#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1346 /*! * reconciliation: page reconciliation calls that resulted in values with * timestamps */ -#define WT_STAT_CONN_REC_PAGES_WITH_TS 1349 +#define WT_STAT_CONN_REC_PAGES_WITH_TS 1347 /*! * reconciliation: page reconciliation calls that resulted in values with * transaction ids */ -#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1350 +#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1348 /*! reconciliation: pages deleted */ -#define WT_STAT_CONN_REC_PAGE_DELETE 1351 +#define WT_STAT_CONN_REC_PAGE_DELETE 1349 /*! * reconciliation: pages written including an aggregated newest start * durable timestamp */ -#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1352 +#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 1350 /*! * reconciliation: pages written including an aggregated newest stop * durable timestamp */ -#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1353 +#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 1351 /*! * reconciliation: pages written including an aggregated newest stop * timestamp */ -#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1354 +#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TS 1352 /*! * reconciliation: pages written including an aggregated newest stop * transaction ID */ -#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1355 +#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_STOP_TXN 1353 /*! * reconciliation: pages written including an aggregated newest * transaction ID */ -#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1356 +#define WT_STAT_CONN_REC_TIME_AGGR_NEWEST_TXN 1354 /*! * reconciliation: pages written including an aggregated oldest start * timestamp */ -#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1357 +#define WT_STAT_CONN_REC_TIME_AGGR_OLDEST_START_TS 1355 /*! reconciliation: pages written including an aggregated prepare */ -#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1358 +#define WT_STAT_CONN_REC_TIME_AGGR_PREPARED 1356 /*! reconciliation: pages written including at least one prepare state */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1359 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_PREPARED 1357 /*! * reconciliation: pages written including at least one start durable * timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1360 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 1358 /*! reconciliation: pages written including at least one start timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1361 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TS 1359 /*! * reconciliation: pages written including at least one start transaction * ID */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1362 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_START_TXN 1360 /*! * reconciliation: pages written including at least one stop durable * timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1363 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 1361 /*! reconciliation: pages written including at least one stop timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1364 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TS 1362 /*! * reconciliation: pages written including at least one stop transaction * ID */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1365 +#define WT_STAT_CONN_REC_TIME_WINDOW_PAGES_STOP_TXN 1363 /*! reconciliation: records written including a prepare state */ -#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1366 +#define WT_STAT_CONN_REC_TIME_WINDOW_PREPARED 1364 /*! reconciliation: records written including a start durable timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1367 +#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_START_TS 1365 /*! reconciliation: records written including a start timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1368 +#define WT_STAT_CONN_REC_TIME_WINDOW_START_TS 1366 /*! reconciliation: records written including a start transaction ID */ -#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1369 +#define WT_STAT_CONN_REC_TIME_WINDOW_START_TXN 1367 /*! reconciliation: records written including a stop durable timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1370 +#define WT_STAT_CONN_REC_TIME_WINDOW_DURABLE_STOP_TS 1368 /*! reconciliation: records written including a stop timestamp */ -#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1371 +#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TS 1369 /*! reconciliation: records written including a stop transaction ID */ -#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1372 +#define WT_STAT_CONN_REC_TIME_WINDOW_STOP_TXN 1370 /*! reconciliation: split bytes currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1373 +#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1371 /*! reconciliation: split objects currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1374 -/*! session: flush state races */ -#define WT_STAT_CONN_FLUSH_STATE_RACES 1375 +#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1372 +/*! session: attempts to remove a local object and the object is in use */ +#define WT_STAT_CONN_LOCAL_OBJECTS_INUSE 1373 /*! session: flush_tier operation calls */ -#define WT_STAT_CONN_FLUSH_TIER 1376 +#define WT_STAT_CONN_FLUSH_TIER 1374 +/*! session: local objects removed */ +#define WT_STAT_CONN_LOCAL_OBJECTS_REMOVED 1375 /*! session: open session count */ -#define WT_STAT_CONN_SESSION_OPEN 1377 +#define WT_STAT_CONN_SESSION_OPEN 1376 /*! session: session query timestamp calls */ -#define WT_STAT_CONN_SESSION_QUERY_TS 1378 +#define WT_STAT_CONN_SESSION_QUERY_TS 1377 /*! session: table alter failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1379 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1378 /*! session: table alter successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1380 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1379 /*! session: table alter triggering checkpoint calls */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1381 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_TRIGGER_CHECKPOINT 1380 /*! session: table alter unchanged and skipped */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1382 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1381 /*! session: table compact failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1383 +#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1382 /*! session: table compact successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1384 +#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1383 /*! session: table create failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1385 +#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1384 /*! session: table create successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1386 +#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1385 /*! session: table drop failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1387 +#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1386 /*! session: table drop successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1388 +#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1387 /*! session: table rename failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1389 +#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1388 /*! session: table rename successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1390 +#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1389 /*! session: table salvage failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1391 +#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1390 /*! session: table salvage successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1392 +#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1391 /*! session: table truncate failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1393 +#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1392 /*! session: table truncate successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1394 +#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1393 /*! session: table verify failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1395 +#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1394 /*! session: table verify successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1396 +#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1395 /*! session: tiered operations dequeued and processed */ -#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1397 +#define WT_STAT_CONN_TIERED_WORK_UNITS_DEQUEUED 1396 /*! session: tiered operations scheduled */ -#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1398 +#define WT_STAT_CONN_TIERED_WORK_UNITS_CREATED 1397 /*! session: tiered storage local retention time (secs) */ -#define WT_STAT_CONN_TIERED_RETENTION 1399 +#define WT_STAT_CONN_TIERED_RETENTION 1398 /*! session: tiered storage object size */ -#define WT_STAT_CONN_TIERED_OBJECT_SIZE 1400 +#define WT_STAT_CONN_TIERED_OBJECT_SIZE 1399 /*! thread-state: active filesystem fsync calls */ -#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1401 +#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1400 /*! thread-state: active filesystem read calls */ -#define WT_STAT_CONN_THREAD_READ_ACTIVE 1402 +#define WT_STAT_CONN_THREAD_READ_ACTIVE 1401 /*! thread-state: active filesystem write calls */ -#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1403 +#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1402 /*! thread-yield: application thread time evicting (usecs) */ -#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1404 +#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1403 /*! thread-yield: application thread time waiting for cache (usecs) */ -#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1405 +#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1404 /*! * thread-yield: connection close blocked waiting for transaction state * stabilization */ -#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1406 +#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1405 /*! thread-yield: connection close yielded for lsm manager shutdown */ -#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1407 +#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1406 /*! thread-yield: data handle lock yielded */ -#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1408 +#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1407 /*! * thread-yield: get reference for page index and slot time sleeping * (usecs) */ -#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1409 +#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1408 /*! thread-yield: page access yielded due to prepare state change */ -#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1410 +#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1409 /*! thread-yield: page acquire busy blocked */ -#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1411 +#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1410 /*! thread-yield: page acquire eviction blocked */ -#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1412 +#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1411 /*! thread-yield: page acquire locked blocked */ -#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1413 +#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1412 /*! thread-yield: page acquire read blocked */ -#define WT_STAT_CONN_PAGE_READ_BLOCKED 1414 +#define WT_STAT_CONN_PAGE_READ_BLOCKED 1413 /*! thread-yield: page acquire time sleeping (usecs) */ -#define WT_STAT_CONN_PAGE_SLEEP 1415 +#define WT_STAT_CONN_PAGE_SLEEP 1414 /*! * thread-yield: page delete rollback time sleeping for state change * (usecs) */ -#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1416 +#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1415 /*! thread-yield: page reconciliation yielded due to child modification */ -#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1417 +#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1416 /*! transaction: Number of prepared updates */ -#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1418 +#define WT_STAT_CONN_TXN_PREPARED_UPDATES 1417 /*! transaction: Number of prepared updates committed */ -#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1419 +#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COMMITTED 1418 /*! transaction: Number of prepared updates repeated on the same key */ -#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1420 +#define WT_STAT_CONN_TXN_PREPARED_UPDATES_KEY_REPEATED 1419 /*! transaction: Number of prepared updates rolled back */ -#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1421 +#define WT_STAT_CONN_TXN_PREPARED_UPDATES_ROLLEDBACK 1420 /*! transaction: prepared transactions */ -#define WT_STAT_CONN_TXN_PREPARE 1422 +#define WT_STAT_CONN_TXN_PREPARE 1421 /*! transaction: prepared transactions committed */ -#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1423 +#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1422 /*! transaction: prepared transactions currently active */ -#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1424 +#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1423 /*! transaction: prepared transactions rolled back */ -#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1425 +#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1424 /*! * 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 1426 +#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_DO_NOT_REMOVE_HS_UPDATE 1425 /*! * 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 1427 +#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK_FIX_HS_UPDATE_WITH_CKPT_RESERVED_TXNID 1426 /*! transaction: query timestamp calls */ -#define WT_STAT_CONN_TXN_QUERY_TS 1428 +#define WT_STAT_CONN_TXN_QUERY_TS 1427 /*! transaction: race to read prepared update retry */ -#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1429 +#define WT_STAT_CONN_TXN_READ_RACE_PREPARE_UPDATE 1428 /*! transaction: rollback to stable calls */ -#define WT_STAT_CONN_TXN_RTS 1430 +#define WT_STAT_CONN_TXN_RTS 1429 /*! * 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 1431 +#define WT_STAT_CONN_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 1430 /*! transaction: rollback to stable inconsistent checkpoint */ -#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1432 +#define WT_STAT_CONN_TXN_RTS_INCONSISTENT_CKPT 1431 /*! transaction: rollback to stable keys removed */ -#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1433 +#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1432 /*! transaction: rollback to stable keys restored */ -#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1434 +#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1433 /*! transaction: rollback to stable pages visited */ -#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1435 +#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1434 /*! transaction: rollback to stable restored tombstones from history store */ -#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1436 +#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_TOMBSTONES 1435 /*! transaction: rollback to stable restored updates from history store */ -#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1437 +#define WT_STAT_CONN_TXN_RTS_HS_RESTORE_UPDATES 1436 /*! transaction: rollback to stable skipping delete rle */ -#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1438 +#define WT_STAT_CONN_TXN_RTS_DELETE_RLE_SKIPPED 1437 /*! transaction: rollback to stable skipping stable rle */ -#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1439 +#define WT_STAT_CONN_TXN_RTS_STABLE_RLE_SKIPPED 1438 /*! transaction: rollback to stable sweeping history store keys */ -#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1440 +#define WT_STAT_CONN_TXN_RTS_SWEEP_HS_KEYS 1439 /*! transaction: rollback to stable tree walk skipping pages */ -#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1441 +#define WT_STAT_CONN_TXN_RTS_TREE_WALK_SKIP_PAGES 1440 /*! transaction: rollback to stable updates aborted */ -#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1442 +#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1441 /*! transaction: rollback to stable updates removed from history store */ -#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1443 +#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1442 /*! transaction: sessions scanned in each walk of concurrent sessions */ -#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1444 +#define WT_STAT_CONN_TXN_SESSIONS_WALKED 1443 /*! transaction: set timestamp calls */ -#define WT_STAT_CONN_TXN_SET_TS 1445 +#define WT_STAT_CONN_TXN_SET_TS 1444 /*! transaction: set timestamp durable calls */ -#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1446 +#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1445 /*! transaction: set timestamp durable updates */ -#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1447 +#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1446 /*! transaction: set timestamp oldest calls */ -#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1448 +#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1447 /*! transaction: set timestamp oldest updates */ -#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1449 +#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1448 /*! transaction: set timestamp stable calls */ -#define WT_STAT_CONN_TXN_SET_TS_STABLE 1450 +#define WT_STAT_CONN_TXN_SET_TS_STABLE 1449 /*! transaction: set timestamp stable updates */ -#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1451 +#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1450 /*! transaction: transaction begins */ -#define WT_STAT_CONN_TXN_BEGIN 1452 +#define WT_STAT_CONN_TXN_BEGIN 1451 /*! transaction: transaction checkpoint currently running */ -#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1453 +#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1452 /*! * transaction: transaction checkpoint currently running for history * store file */ -#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1454 +#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING_HS 1453 /*! transaction: transaction checkpoint generation */ -#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1455 +#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1454 /*! * transaction: transaction checkpoint history store file duration * (usecs) */ -#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1456 +#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1455 /*! transaction: transaction checkpoint max time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1457 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1456 /*! transaction: transaction checkpoint min time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1458 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1457 /*! * transaction: transaction checkpoint most recent duration for gathering * all handles (usecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1459 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION 1458 /*! * transaction: transaction checkpoint most recent duration for gathering * applied handles (usecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1460 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_APPLY 1459 /*! * transaction: transaction checkpoint most recent duration for gathering * skipped handles (usecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1461 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_DURATION_SKIP 1460 /*! transaction: transaction checkpoint most recent handles applied */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1462 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_APPLIED 1461 /*! transaction: transaction checkpoint most recent handles skipped */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1463 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_SKIPPED 1462 /*! transaction: transaction checkpoint most recent handles walked */ -#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1464 +#define WT_STAT_CONN_TXN_CHECKPOINT_HANDLE_WALKED 1463 /*! transaction: transaction checkpoint most recent time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1465 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1464 /*! transaction: transaction checkpoint prepare currently running */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1466 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1465 /*! transaction: transaction checkpoint prepare max time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1467 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1466 /*! transaction: transaction checkpoint prepare min time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1468 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1467 /*! transaction: transaction checkpoint prepare most recent time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1469 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1468 /*! transaction: transaction checkpoint prepare total time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1470 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1469 /*! transaction: transaction checkpoint scrub dirty target */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1471 +#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1470 /*! transaction: transaction checkpoint scrub time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1472 +#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1471 /*! transaction: transaction checkpoint total time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1473 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1472 /*! transaction: transaction checkpoints */ -#define WT_STAT_CONN_TXN_CHECKPOINT 1474 +#define WT_STAT_CONN_TXN_CHECKPOINT 1473 /*! transaction: transaction checkpoints due to obsolete pages */ -#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1475 +#define WT_STAT_CONN_TXN_CHECKPOINT_OBSOLETE_APPLIED 1474 /*! * transaction: transaction checkpoints skipped because database was * clean */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1476 +#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1475 /*! transaction: transaction failures due to history store */ -#define WT_STAT_CONN_TXN_FAIL_CACHE 1477 +#define WT_STAT_CONN_TXN_FAIL_CACHE 1476 /*! * transaction: transaction fsync calls for checkpoint after allocating * the transaction ID */ -#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1478 +#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1477 /*! * transaction: transaction fsync duration for checkpoint after * allocating the transaction ID (usecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1479 +#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1478 /*! transaction: transaction range of IDs currently pinned */ -#define WT_STAT_CONN_TXN_PINNED_RANGE 1480 +#define WT_STAT_CONN_TXN_PINNED_RANGE 1479 /*! transaction: transaction range of IDs currently pinned by a checkpoint */ -#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1481 +#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1480 /*! transaction: transaction range of timestamps currently pinned */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1482 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1481 /*! transaction: transaction range of timestamps pinned by a checkpoint */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1483 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1482 /*! * transaction: transaction range of timestamps pinned by the oldest * active read timestamp */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1484 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1483 /*! * transaction: transaction range of timestamps pinned by the oldest * timestamp */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1485 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1484 /*! transaction: transaction read timestamp of the oldest active reader */ -#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1486 +#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1485 /*! transaction: transaction rollback to stable currently running */ -#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1487 +#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE_RUNNING 1486 /*! transaction: transaction walk of concurrent sessions */ -#define WT_STAT_CONN_TXN_WALK_SESSIONS 1488 +#define WT_STAT_CONN_TXN_WALK_SESSIONS 1487 /*! transaction: transactions committed */ -#define WT_STAT_CONN_TXN_COMMIT 1489 +#define WT_STAT_CONN_TXN_COMMIT 1488 /*! transaction: transactions rolled back */ -#define WT_STAT_CONN_TXN_ROLLBACK 1490 +#define WT_STAT_CONN_TXN_ROLLBACK 1489 /*! transaction: update conflicts */ -#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1491 +#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1490 /*! * @} @@ -6617,241 +6622,231 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection); */ #define WT_STAT_DSRC_CURSOR_SKIP_HS_CUR_POSITION 2133 /*! - * cursor: Total number of pages skipped without reading by cursor next - * calls - */ -#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_PAGE_COUNT 2134 -/*! - * cursor: Total number of pages skipped without reading by cursor prev - * calls - */ -#define WT_STAT_DSRC_CURSOR_PREV_SKIP_PAGE_COUNT 2135 -/*! * cursor: Total number of times a search near has exited due to prefix * config */ -#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2136 +#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR_PREFIX_FAST_PATHS 2134 /*! cursor: bulk loaded cursor insert calls */ -#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2137 +#define WT_STAT_DSRC_CURSOR_INSERT_BULK 2135 /*! cursor: cache cursors reuse count */ -#define WT_STAT_DSRC_CURSOR_REOPEN 2138 +#define WT_STAT_DSRC_CURSOR_REOPEN 2136 /*! cursor: close calls that result in cache */ -#define WT_STAT_DSRC_CURSOR_CACHE 2139 +#define WT_STAT_DSRC_CURSOR_CACHE 2137 /*! cursor: create calls */ -#define WT_STAT_DSRC_CURSOR_CREATE 2140 +#define WT_STAT_DSRC_CURSOR_CREATE 2138 /*! * cursor: cursor next calls that skip due to a globally visible history * store tombstone */ -#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2141 +#define WT_STAT_DSRC_CURSOR_NEXT_HS_TOMBSTONE 2139 /*! * cursor: cursor next calls that skip greater than or equal to 100 * entries */ -#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2142 +#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_GE_100 2140 /*! cursor: cursor next calls that skip less than 100 entries */ -#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2143 +#define WT_STAT_DSRC_CURSOR_NEXT_SKIP_LT_100 2141 /*! * cursor: cursor prev calls that skip due to a globally visible history * store tombstone */ -#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2144 +#define WT_STAT_DSRC_CURSOR_PREV_HS_TOMBSTONE 2142 /*! * cursor: cursor prev calls that skip greater than or equal to 100 * entries */ -#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2145 +#define WT_STAT_DSRC_CURSOR_PREV_SKIP_GE_100 2143 /*! cursor: cursor prev calls that skip less than 100 entries */ -#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2146 +#define WT_STAT_DSRC_CURSOR_PREV_SKIP_LT_100 2144 /*! cursor: insert calls */ -#define WT_STAT_DSRC_CURSOR_INSERT 2147 +#define WT_STAT_DSRC_CURSOR_INSERT 2145 /*! cursor: insert key and value bytes */ -#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2148 +#define WT_STAT_DSRC_CURSOR_INSERT_BYTES 2146 /*! cursor: modify */ -#define WT_STAT_DSRC_CURSOR_MODIFY 2149 +#define WT_STAT_DSRC_CURSOR_MODIFY 2147 /*! cursor: modify key and value bytes affected */ -#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2150 +#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES 2148 /*! cursor: modify value bytes modified */ -#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2151 +#define WT_STAT_DSRC_CURSOR_MODIFY_BYTES_TOUCH 2149 /*! cursor: next calls */ -#define WT_STAT_DSRC_CURSOR_NEXT 2152 +#define WT_STAT_DSRC_CURSOR_NEXT 2150 /*! cursor: open cursor count */ -#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2153 +#define WT_STAT_DSRC_CURSOR_OPEN_COUNT 2151 /*! cursor: operation restarted */ -#define WT_STAT_DSRC_CURSOR_RESTART 2154 +#define WT_STAT_DSRC_CURSOR_RESTART 2152 /*! cursor: prev calls */ -#define WT_STAT_DSRC_CURSOR_PREV 2155 +#define WT_STAT_DSRC_CURSOR_PREV 2153 /*! cursor: remove calls */ -#define WT_STAT_DSRC_CURSOR_REMOVE 2156 +#define WT_STAT_DSRC_CURSOR_REMOVE 2154 /*! cursor: remove key bytes removed */ -#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2157 +#define WT_STAT_DSRC_CURSOR_REMOVE_BYTES 2155 /*! cursor: reserve calls */ -#define WT_STAT_DSRC_CURSOR_RESERVE 2158 +#define WT_STAT_DSRC_CURSOR_RESERVE 2156 /*! cursor: reset calls */ -#define WT_STAT_DSRC_CURSOR_RESET 2159 +#define WT_STAT_DSRC_CURSOR_RESET 2157 /*! cursor: search calls */ -#define WT_STAT_DSRC_CURSOR_SEARCH 2160 +#define WT_STAT_DSRC_CURSOR_SEARCH 2158 /*! cursor: search history store calls */ -#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2161 +#define WT_STAT_DSRC_CURSOR_SEARCH_HS 2159 /*! cursor: search near calls */ -#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2162 +#define WT_STAT_DSRC_CURSOR_SEARCH_NEAR 2160 /*! cursor: truncate calls */ -#define WT_STAT_DSRC_CURSOR_TRUNCATE 2163 +#define WT_STAT_DSRC_CURSOR_TRUNCATE 2161 /*! cursor: update calls */ -#define WT_STAT_DSRC_CURSOR_UPDATE 2164 +#define WT_STAT_DSRC_CURSOR_UPDATE 2162 /*! cursor: update key and value bytes */ -#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2165 +#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES 2163 /*! cursor: update value size change */ -#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2166 +#define WT_STAT_DSRC_CURSOR_UPDATE_BYTES_CHANGED 2164 /*! reconciliation: approximate byte size of timestamps in pages written */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2167 +#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TS 2165 /*! * reconciliation: approximate byte size of transaction IDs in pages * written */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2168 +#define WT_STAT_DSRC_REC_TIME_WINDOW_BYTES_TXN 2166 /*! reconciliation: dictionary matches */ -#define WT_STAT_DSRC_REC_DICTIONARY 2169 +#define WT_STAT_DSRC_REC_DICTIONARY 2167 /*! reconciliation: fast-path pages deleted */ -#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2170 +#define WT_STAT_DSRC_REC_PAGE_DELETE_FAST 2168 /*! * reconciliation: internal page key bytes discarded using suffix * compression */ -#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2171 +#define WT_STAT_DSRC_REC_SUFFIX_COMPRESSION 2169 /*! reconciliation: internal page multi-block writes */ -#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2172 +#define WT_STAT_DSRC_REC_MULTIBLOCK_INTERNAL 2170 /*! reconciliation: internal-page overflow keys */ -#define WT_STAT_DSRC_REC_OVERFLOW_KEY_INTERNAL 2173 +#define WT_STAT_DSRC_REC_OVERFLOW_KEY_INTERNAL 2171 /*! reconciliation: leaf page key bytes discarded using prefix compression */ -#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2174 +#define WT_STAT_DSRC_REC_PREFIX_COMPRESSION 2172 /*! reconciliation: leaf page multi-block writes */ -#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2175 +#define WT_STAT_DSRC_REC_MULTIBLOCK_LEAF 2173 /*! reconciliation: leaf-page overflow keys */ -#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2176 +#define WT_STAT_DSRC_REC_OVERFLOW_KEY_LEAF 2174 /*! reconciliation: maximum blocks required for a page */ -#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2177 +#define WT_STAT_DSRC_REC_MULTIBLOCK_MAX 2175 /*! reconciliation: overflow values written */ -#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2178 +#define WT_STAT_DSRC_REC_OVERFLOW_VALUE 2176 /*! reconciliation: page checksum matches */ -#define WT_STAT_DSRC_REC_PAGE_MATCH 2179 +#define WT_STAT_DSRC_REC_PAGE_MATCH 2177 /*! reconciliation: page reconciliation calls */ -#define WT_STAT_DSRC_REC_PAGES 2180 +#define WT_STAT_DSRC_REC_PAGES 2178 /*! reconciliation: page reconciliation calls for eviction */ -#define WT_STAT_DSRC_REC_PAGES_EVICTION 2181 +#define WT_STAT_DSRC_REC_PAGES_EVICTION 2179 /*! reconciliation: pages deleted */ -#define WT_STAT_DSRC_REC_PAGE_DELETE 2182 +#define WT_STAT_DSRC_REC_PAGE_DELETE 2180 /*! * reconciliation: pages written including an aggregated newest start * durable timestamp */ -#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2183 +#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_START_DURABLE_TS 2181 /*! * reconciliation: pages written including an aggregated newest stop * durable timestamp */ -#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2184 +#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_DURABLE_TS 2182 /*! * reconciliation: pages written including an aggregated newest stop * timestamp */ -#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2185 +#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TS 2183 /*! * reconciliation: pages written including an aggregated newest stop * transaction ID */ -#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2186 +#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_STOP_TXN 2184 /*! * reconciliation: pages written including an aggregated newest * transaction ID */ -#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2187 +#define WT_STAT_DSRC_REC_TIME_AGGR_NEWEST_TXN 2185 /*! * reconciliation: pages written including an aggregated oldest start * timestamp */ -#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2188 +#define WT_STAT_DSRC_REC_TIME_AGGR_OLDEST_START_TS 2186 /*! reconciliation: pages written including an aggregated prepare */ -#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2189 +#define WT_STAT_DSRC_REC_TIME_AGGR_PREPARED 2187 /*! reconciliation: pages written including at least one prepare */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2190 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_PREPARED 2188 /*! * reconciliation: pages written including at least one start durable * timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2191 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_START_TS 2189 /*! reconciliation: pages written including at least one start timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2192 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TS 2190 /*! * reconciliation: pages written including at least one start transaction * ID */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2193 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_START_TXN 2191 /*! * reconciliation: pages written including at least one stop durable * timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2194 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_DURABLE_STOP_TS 2192 /*! reconciliation: pages written including at least one stop timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2195 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TS 2193 /*! * reconciliation: pages written including at least one stop transaction * ID */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2196 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PAGES_STOP_TXN 2194 /*! reconciliation: records written including a prepare */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2197 +#define WT_STAT_DSRC_REC_TIME_WINDOW_PREPARED 2195 /*! reconciliation: records written including a start durable timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2198 +#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_START_TS 2196 /*! reconciliation: records written including a start timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2199 +#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TS 2197 /*! reconciliation: records written including a start transaction ID */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2200 +#define WT_STAT_DSRC_REC_TIME_WINDOW_START_TXN 2198 /*! reconciliation: records written including a stop durable timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2201 +#define WT_STAT_DSRC_REC_TIME_WINDOW_DURABLE_STOP_TS 2199 /*! reconciliation: records written including a stop timestamp */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2202 +#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TS 2200 /*! reconciliation: records written including a stop transaction ID */ -#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2203 +#define WT_STAT_DSRC_REC_TIME_WINDOW_STOP_TXN 2201 /*! session: object compaction */ -#define WT_STAT_DSRC_SESSION_COMPACT 2204 +#define WT_STAT_DSRC_SESSION_COMPACT 2202 /*! session: tiered operations dequeued and processed */ -#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2205 +#define WT_STAT_DSRC_TIERED_WORK_UNITS_DEQUEUED 2203 /*! session: tiered operations scheduled */ -#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2206 +#define WT_STAT_DSRC_TIERED_WORK_UNITS_CREATED 2204 /*! session: tiered storage local retention time (secs) */ -#define WT_STAT_DSRC_TIERED_RETENTION 2207 +#define WT_STAT_DSRC_TIERED_RETENTION 2205 /*! session: tiered storage object size */ -#define WT_STAT_DSRC_TIERED_OBJECT_SIZE 2208 +#define WT_STAT_DSRC_TIERED_OBJECT_SIZE 2206 /*! transaction: race to read prepared update retry */ -#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2209 +#define WT_STAT_DSRC_TXN_READ_RACE_PREPARE_UPDATE 2207 /*! * 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 2210 +#define WT_STAT_DSRC_TXN_RTS_HS_STOP_OLDER_THAN_NEWER_START 2208 /*! transaction: rollback to stable inconsistent checkpoint */ -#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2211 +#define WT_STAT_DSRC_TXN_RTS_INCONSISTENT_CKPT 2209 /*! transaction: rollback to stable keys removed */ -#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2212 +#define WT_STAT_DSRC_TXN_RTS_KEYS_REMOVED 2210 /*! transaction: rollback to stable keys restored */ -#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2213 +#define WT_STAT_DSRC_TXN_RTS_KEYS_RESTORED 2211 /*! transaction: rollback to stable restored tombstones from history store */ -#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2214 +#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_TOMBSTONES 2212 /*! transaction: rollback to stable restored updates from history store */ -#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2215 +#define WT_STAT_DSRC_TXN_RTS_HS_RESTORE_UPDATES 2213 /*! transaction: rollback to stable skipping delete rle */ -#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2216 +#define WT_STAT_DSRC_TXN_RTS_DELETE_RLE_SKIPPED 2214 /*! transaction: rollback to stable skipping stable rle */ -#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2217 +#define WT_STAT_DSRC_TXN_RTS_STABLE_RLE_SKIPPED 2215 /*! transaction: rollback to stable sweeping history store keys */ -#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2218 +#define WT_STAT_DSRC_TXN_RTS_SWEEP_HS_KEYS 2216 /*! transaction: rollback to stable updates removed from history store */ -#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2219 +#define WT_STAT_DSRC_TXN_RTS_HS_REMOVED 2217 /*! transaction: transaction checkpoints due to obsolete pages */ -#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2220 +#define WT_STAT_DSRC_TXN_CHECKPOINT_OBSOLETE_APPLIED 2218 /*! transaction: update conflicts */ -#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2221 +#define WT_STAT_DSRC_TXN_UPDATE_CONFLICT 2219 /*! * @} diff --git a/src/third_party/wiredtiger/src/log/log.c b/src/third_party/wiredtiger/src/log/log.c index 6b136c6cc84..0222230a473 100644 --- a/src/third_party/wiredtiger/src/log/log.c +++ b/src/third_party/wiredtiger/src/log/log.c @@ -462,14 +462,13 @@ __wt_log_get_backup_files( * log file will be removed from the list of files returned. New writes will not be included in * the backup. */ - if (active_only) - F_SET(log, WT_LOG_FORCE_NEWFILE); + F_SET(log, WT_LOG_FORCE_NEWFILE); WT_RET(__wt_log_force_write(session, 1, NULL)); WT_RET(__log_get_files(session, WT_LOG_FILENAME, &files, &count)); for (max = 0, i = 0; i < count;) { WT_ERR(__wt_log_extract_lognum(session, files[i], &id)); - if (active_only && (id < min_file || id > max_file)) { + if ((active_only && id < min_file) || id > max_file) { /* * Any files not being returned are individually freed and the array adjusted. */ diff --git a/src/third_party/wiredtiger/src/lsm/lsm_cursor.c b/src/third_party/wiredtiger/src/lsm/lsm_cursor.c index 4c3aa2a3204..f1503d9bbf3 100644 --- a/src/third_party/wiredtiger/src/lsm/lsm_cursor.c +++ b/src/third_party/wiredtiger/src/lsm/lsm_cursor.c @@ -1685,6 +1685,7 @@ __wt_clsm_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, cons __clsm_remove, /* remove */ __clsm_reserve, /* reserve */ __wt_cursor_reconfigure, /* reconfigure */ + __wt_cursor_notsup, /* largest_key */ __wt_cursor_notsup, /* cache */ __wt_cursor_reopen_notsup, /* reopen */ __wt_clsm_close); /* close */ diff --git a/src/third_party/wiredtiger/src/os_common/os_fhandle.c b/src/third_party/wiredtiger/src/os_common/os_fhandle.c index f39fbd599e7..18bdb756176 100644 --- a/src/third_party/wiredtiger/src/os_common/os_fhandle.c +++ b/src/third_party/wiredtiger/src/os_common/os_fhandle.c @@ -41,7 +41,6 @@ __fhandle_method_finalize(WT_SESSION_IMPL *session, WT_FILE_HANDLE *handle, bool return (0); } -#ifdef HAVE_DIAGNOSTIC /* * __wt_handle_is_open -- * Return if there's an open handle matching a name. @@ -72,7 +71,6 @@ __wt_handle_is_open(WT_SESSION_IMPL *session, const char *name) return (found); } -#endif /* * __handle_search -- @@ -288,9 +286,8 @@ __handle_close(WT_SESSION_IMPL *session, WT_FH *fh, bool locked) conn = S2C(session); - if (fh->ref != 0) { + if (fh->ref != 0) __wt_errx(session, "Closing a file handle with open references: %s", fh->name); - } /* Remove from the list. */ bucket = fh->name_hash & (conn->hash_size - 1); diff --git a/src/third_party/wiredtiger/src/os_posix/os_fs.c b/src/third_party/wiredtiger/src/os_posix/os_fs.c index 1ae6259e5d8..3898eb74343 100644 --- a/src/third_party/wiredtiger/src/os_posix/os_fs.c +++ b/src/third_party/wiredtiger/src/os_posix/os_fs.c @@ -797,12 +797,16 @@ __posix_open_file(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const cha /* Create/Open the file. */ WT_SYSCALL_RETRY(((pfh->fd = open(name, f, mode)) == -1 ? -1 : 0), ret); - if (ret != 0) + if (ret != 0) { + /* If we don't want error messages, just return the error value. */ + if (F_ISSET(session, WT_SESSION_QUIET_TIERED) && ret == ENOENT) + goto err; WT_ERR_MSG(session, ret, pfh->direct_io ? "%s: handle-open: open: failed with direct I/O configured, some " "filesystem types do not support direct I/O" : "%s: handle-open: open", name); + } #ifdef __linux__ /* diff --git a/src/third_party/wiredtiger/src/session/session_api.c b/src/third_party/wiredtiger/src/session/session_api.c index 5a4320b493e..8353a6e9d5a 100644 --- a/src/third_party/wiredtiger/src/session/session_api.c +++ b/src/third_party/wiredtiger/src/session/session_api.c @@ -672,22 +672,18 @@ err: } /* - * __wt_session_blocking_checkpoint -- + * __session_blocking_checkpoint -- * Perform a checkpoint or wait if it is already running to resolve an EBUSY error. */ -int -__wt_session_blocking_checkpoint(WT_SESSION_IMPL *session, bool force, uint64_t seconds) +static int +__session_blocking_checkpoint(WT_SESSION_IMPL *session) { WT_DECL_RET; WT_TXN_GLOBAL *txn_global; uint64_t txn_gen; - const char *cfg[3] = {NULL, NULL, NULL}; + const char *checkpoint_cfg[] = {WT_CONFIG_BASE(session, WT_SESSION_checkpoint), NULL}; - cfg[0] = WT_CONFIG_BASE(session, WT_SESSION_checkpoint); - if (force) - cfg[1] = "force=1"; - - if ((ret = __wt_txn_checkpoint(session, cfg, false)) == 0) + if ((ret = __wt_txn_checkpoint(session, checkpoint_cfg, false)) == 0) return (0); WT_RET_BUSY_OK(ret); @@ -704,13 +700,6 @@ __wt_session_blocking_checkpoint(WT_SESSION_IMPL *session, bool force, uint64_t */ if (!txn_global->checkpoint_running || txn_gen != __wt_gen(session, WT_GEN_CHECKPOINT)) break; - - /* If there's a timeout, give up. */ - if (seconds == 0) - continue; - if (seconds <= WT_CKPT_WAIT) - return (EBUSY); - seconds -= WT_CKPT_WAIT; } return (0); @@ -735,7 +724,7 @@ __session_alter(WT_SESSION *wt_session, const char *uri, const char *config) */ ret = __session_alter_internal(session, uri, config); if (ret == EBUSY) { - WT_RET(__wt_session_blocking_checkpoint(session, false, 0)); + WT_RET(__session_blocking_checkpoint(session)); WT_STAT_CONN_INCR(session, session_table_alter_trigger_checkpoint); ret = __session_alter_internal(session, uri, config); } diff --git a/src/third_party/wiredtiger/src/session/session_compact.c b/src/third_party/wiredtiger/src/session/session_compact.c index 1f83d6e4c83..9e0ac6ce549 100644 --- a/src/third_party/wiredtiger/src/session/session_compact.c +++ b/src/third_party/wiredtiger/src/session/session_compact.c @@ -193,6 +193,26 @@ __wt_session_compact_check_timeout(WT_SESSION_IMPL *session) } /* + * __compact_checkpoint -- + * This function does wait and force checkpoint. + */ +static int +__compact_checkpoint(WT_SESSION_IMPL *session) +{ + /* + * Force compaction checkpoints: we don't want to skip it because the work we need to have done + * is done in the underlying block manager. + */ + const char *checkpoint_cfg[] = { + WT_CONFIG_BASE(session, WT_SESSION_checkpoint), "force=1", NULL}; + + /* 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)); +} + +/* * __compact_worker -- * Function to alternate between checkpoints and compaction calls. */ @@ -213,7 +233,7 @@ __compact_worker(WT_SESSION_IMPL *session) /* * Perform an initial checkpoint (see this file's leading comment for details). */ - WT_ERR(__wt_session_blocking_checkpoint(session, true, session->compact->max_time)); + WT_ERR(__compact_checkpoint(session)); /* * We compact 10% of a file on each pass (but the overall size of the file is decreasing each @@ -263,8 +283,8 @@ __compact_worker(WT_SESSION_IMPL *session) /* * Perform two checkpoints (see this file's leading comment for details). */ - WT_ERR(__wt_session_blocking_checkpoint(session, true, session->compact->max_time)); - WT_ERR(__wt_session_blocking_checkpoint(session, true, session->compact->max_time)); + WT_ERR(__compact_checkpoint(session)); + WT_ERR(__compact_checkpoint(session)); } err: diff --git a/src/third_party/wiredtiger/src/session/session_dhandle.c b/src/third_party/wiredtiger/src/session/session_dhandle.c index 8172fc8841d..685bc6e0c46 100644 --- a/src/third_party/wiredtiger/src/session/session_dhandle.c +++ b/src/third_party/wiredtiger/src/session/session_dhandle.c @@ -362,7 +362,6 @@ __session_dhandle_sweep(WT_SESSION_IMPL *session) WT_DATA_HANDLE *dhandle; WT_DATA_HANDLE_CACHE *dhandle_cache, *dhandle_cache_tmp; uint64_t now; - bool empty_btree; conn = S2C(session); @@ -379,15 +378,16 @@ __session_dhandle_sweep(WT_SESSION_IMPL *session) TAILQ_FOREACH_SAFE(dhandle_cache, &session->dhandles, q, dhandle_cache_tmp) { dhandle = dhandle_cache->dhandle; - empty_btree = false; - if (WT_DHANDLE_BTREE(dhandle)) - WT_WITH_DHANDLE( - session, dhandle, empty_btree = (__wt_btree_bytes_evictable(session) == 0)); + /* + * Only discard handles that are dead or dying and, in the case of btrees, have been + * evicted. These checks are not done with any locks in place, other than the data handle + * reference, so we cannot peer past what is in the dhandle directly. + */ if (dhandle != session->dhandle && dhandle->session_inuse == 0 && (WT_DHANDLE_INACTIVE(dhandle) || - (dhandle->timeofdeath != 0 && now - dhandle->timeofdeath > conn->sweep_idle_time) || - empty_btree)) { + (dhandle->timeofdeath != 0 && now - dhandle->timeofdeath > conn->sweep_idle_time)) && + (!WT_DHANDLE_BTREE(dhandle) || F_ISSET(dhandle, WT_DHANDLE_EVICTED))) { WT_STAT_CONN_INCR(session, dh_session_handles); WT_ASSERT(session, !WT_IS_METADATA(dhandle)); __session_discard_dhandle(session, dhandle_cache); diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c index 0376a34f998..f5ae97c8cea 100644 --- a/src/third_party/wiredtiger/src/support/stat.c +++ b/src/third_party/wiredtiger/src/support/stat.c @@ -146,8 +146,6 @@ static const char *const __stats_dsrc_desc[] = { "cursor: Total number of entries skipped by cursor next calls", "cursor: Total number of entries skipped by cursor prev calls", "cursor: Total number of entries skipped to position the history store cursor", - "cursor: Total number of pages skipped without reading by cursor next calls", - "cursor: Total number of pages skipped without reading by cursor prev calls", "cursor: Total number of times a search near has exited due to prefix config", "cursor: bulk loaded cursor insert calls", "cursor: cache cursors reuse count", @@ -409,8 +407,6 @@ __wt_stat_dsrc_clear_single(WT_DSRC_STATS *stats) stats->cursor_next_skip_total = 0; stats->cursor_prev_skip_total = 0; stats->cursor_skip_hs_cur_position = 0; - stats->cursor_next_skip_page_count = 0; - stats->cursor_prev_skip_page_count = 0; stats->cursor_search_near_prefix_fast_paths = 0; stats->cursor_insert_bulk = 0; stats->cursor_reopen = 0; @@ -661,8 +657,6 @@ __wt_stat_dsrc_aggregate_single(WT_DSRC_STATS *from, WT_DSRC_STATS *to) to->cursor_next_skip_total += from->cursor_next_skip_total; to->cursor_prev_skip_total += from->cursor_prev_skip_total; to->cursor_skip_hs_cur_position += from->cursor_skip_hs_cur_position; - to->cursor_next_skip_page_count += from->cursor_next_skip_page_count; - to->cursor_prev_skip_page_count += from->cursor_prev_skip_page_count; to->cursor_search_near_prefix_fast_paths += from->cursor_search_near_prefix_fast_paths; to->cursor_insert_bulk += from->cursor_insert_bulk; to->cursor_reopen += from->cursor_reopen; @@ -916,8 +910,6 @@ __wt_stat_dsrc_aggregate(WT_DSRC_STATS **from, WT_DSRC_STATS *to) to->cursor_next_skip_total += WT_STAT_READ(from, cursor_next_skip_total); to->cursor_prev_skip_total += WT_STAT_READ(from, cursor_prev_skip_total); to->cursor_skip_hs_cur_position += WT_STAT_READ(from, cursor_skip_hs_cur_position); - to->cursor_next_skip_page_count += WT_STAT_READ(from, cursor_next_skip_page_count); - to->cursor_prev_skip_page_count += WT_STAT_READ(from, cursor_prev_skip_page_count); to->cursor_search_near_prefix_fast_paths += WT_STAT_READ(from, cursor_search_near_prefix_fast_paths); to->cursor_insert_bulk += WT_STAT_READ(from, cursor_insert_bulk); @@ -1222,8 +1214,6 @@ static const char *const __stats_connection_desc[] = { "cursor: Total number of entries skipped by cursor next calls", "cursor: Total number of entries skipped by cursor prev calls", "cursor: Total number of entries skipped to position the history store cursor", - "cursor: Total number of pages skipped without reading by cursor next calls", - "cursor: Total number of pages skipped without reading by cursor prev calls", "cursor: Total number of times a search near has exited due to prefix config", "cursor: cached cursor count", "cursor: cursor bulk loaded cursor insert calls", @@ -1403,8 +1393,9 @@ static const char *const __stats_connection_desc[] = { "reconciliation: records written including a stop transaction ID", "reconciliation: split bytes currently awaiting free", "reconciliation: split objects currently awaiting free", - "session: flush state races", + "session: attempts to remove a local object and the object is in use", "session: flush_tier operation calls", + "session: local objects removed", "session: open session count", "session: session query timestamp calls", "session: table alter failed calls", @@ -1758,8 +1749,6 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats) stats->cursor_next_skip_total = 0; stats->cursor_prev_skip_total = 0; stats->cursor_skip_hs_cur_position = 0; - stats->cursor_next_skip_page_count = 0; - stats->cursor_prev_skip_page_count = 0; stats->cursor_search_near_prefix_fast_paths = 0; /* not clearing cursor_cached_count */ stats->cursor_insert_bulk = 0; @@ -1938,8 +1927,9 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats) stats->rec_time_window_stop_txn = 0; /* not clearing rec_split_stashed_bytes */ /* not clearing rec_split_stashed_objects */ - stats->flush_state_races = 0; + stats->local_objects_inuse = 0; stats->flush_tier = 0; + stats->local_objects_removed = 0; /* not clearing session_open */ stats->session_query_ts = 0; /* not clearing session_table_alter_fail */ @@ -2296,8 +2286,6 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS * to->cursor_next_skip_total += WT_STAT_READ(from, cursor_next_skip_total); to->cursor_prev_skip_total += WT_STAT_READ(from, cursor_prev_skip_total); to->cursor_skip_hs_cur_position += WT_STAT_READ(from, cursor_skip_hs_cur_position); - to->cursor_next_skip_page_count += WT_STAT_READ(from, cursor_next_skip_page_count); - to->cursor_prev_skip_page_count += WT_STAT_READ(from, cursor_prev_skip_page_count); to->cursor_search_near_prefix_fast_paths += WT_STAT_READ(from, cursor_search_near_prefix_fast_paths); to->cursor_cached_count += WT_STAT_READ(from, cursor_cached_count); @@ -2485,8 +2473,9 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS * to->rec_time_window_stop_txn += WT_STAT_READ(from, rec_time_window_stop_txn); to->rec_split_stashed_bytes += WT_STAT_READ(from, rec_split_stashed_bytes); to->rec_split_stashed_objects += WT_STAT_READ(from, rec_split_stashed_objects); - to->flush_state_races += WT_STAT_READ(from, flush_state_races); + to->local_objects_inuse += WT_STAT_READ(from, local_objects_inuse); to->flush_tier += WT_STAT_READ(from, flush_tier); + to->local_objects_removed += WT_STAT_READ(from, local_objects_removed); to->session_open += WT_STAT_READ(from, session_open); to->session_query_ts += WT_STAT_READ(from, session_query_ts); to->session_table_alter_fail += WT_STAT_READ(from, session_table_alter_fail); diff --git a/src/third_party/wiredtiger/src/support/thread_group.c b/src/third_party/wiredtiger/src/support/thread_group.c index 6bac6d5450d..0f3e3084b54 100644 --- a/src/third_party/wiredtiger/src/support/thread_group.c +++ b/src/third_party/wiredtiger/src/support/thread_group.c @@ -42,14 +42,15 @@ err: WT_IGNORE_RET(__wt_panic(session, ret, "Unrecoverable utility thread error")); /* - * The three cases when threads are expected to stop are: + * The cases when threads are expected to stop are: * 1. When recovery is done. * 2. When the connection is closing. * 3. When a shutdown has been requested via clearing the run flag. + * 4. When an error has occurred and the connection panic flag is set. */ WT_ASSERT(session, !F_ISSET(thread, WT_THREAD_RUN) || - F_ISSET(S2C(session), WT_CONN_CLOSING | WT_CONN_RECOVERING)); + F_ISSET(S2C(session), WT_CONN_CLOSING | WT_CONN_PANIC | WT_CONN_RECOVERING)); return (WT_THREAD_RET_VALUE); } diff --git a/src/third_party/wiredtiger/src/tiered/tiered_handle.c b/src/third_party/wiredtiger/src/tiered/tiered_handle.c index 5cfd583b1c9..5be43f315c6 100644 --- a/src/third_party/wiredtiger/src/tiered/tiered_handle.c +++ b/src/third_party/wiredtiger/src/tiered/tiered_handle.c @@ -441,9 +441,7 @@ __wt_tiered_switch(WT_SESSION_IMPL *session, const char *config) /* * __wt_tiered_name -- - * Given a dhandle structure and object number generate the URI name of the given type. XXX - * Currently this is only used in this file but I anticipate it may be of use outside. If not, - * make this static and tiered_name instead. + * Given a dhandle structure and object number generate the URI name of the given type. */ int __wt_tiered_name( @@ -567,9 +565,7 @@ __tiered_open(WT_SESSION_IMPL *session, const char *cfg[]) /* Temp code to keep s_all happy. */ FLD_SET(unused, WT_TIERED_OBJ_LOCAL | WT_TIERED_TREE_UNUSED); FLD_SET(unused, WT_TIERED_WORK_FORCE | WT_TIERED_WORK_FREE); - WT_ERR(__wt_tiered_put_drop_local(session, tiered, tiered->current_id)); WT_ERR(__wt_tiered_put_drop_shared(session, tiered, tiered->current_id)); - __wt_tiered_get_drop_local(session, 0, &entry); __wt_tiered_get_drop_shared(session, &entry); } #endif diff --git a/src/third_party/wiredtiger/src/tiered/tiered_opener.c b/src/third_party/wiredtiger/src/tiered/tiered_opener.c index 5ca027510fc..b6f3df90fa7 100644 --- a/src/third_party/wiredtiger/src/tiered/tiered_opener.c +++ b/src/third_party/wiredtiger/src/tiered/tiered_opener.c @@ -20,44 +20,44 @@ __tiered_opener_open(WT_BLOCK_FILE_OPENER *opener, WT_SESSION_IMPL *session, uin WT_DECL_RET; WT_TIERED *tiered; const char *object_name, *object_uri; + bool local_only; tiered = opener->cookie; object_uri = NULL; + local_only = false; WT_ASSERT(session, (object_id > 0 && object_id <= tiered->current_id) || object_id == WT_TIERED_CURRENT_ID); /* - * FIXME-WT-7590 we will need some kind of locking while we're looking at the tiered structure. - * This can be called at any time, because we are opening the objects lazily. + * First look for the local file. This will be the fastest access and we retain recent objects + * in the local database for a while. */ if (object_id == tiered->current_id || object_id == WT_TIERED_CURRENT_ID) { bstorage = NULL; object_name = tiered->tiers[WT_TIERED_INDEX_LOCAL].name; - if (!WT_PREFIX_SKIP(object_name, "file:")) - WT_RET_MSG(session, EINVAL, "expected a 'file:' URI"); - WT_ERR(__wt_open(session, object_name, type, flags, fhp)); + WT_PREFIX_SKIP_REQUIRED(session, object_name, "file:"); + local_only = true; } else { WT_ERR( __wt_tiered_name(session, &tiered->iface, object_id, WT_TIERED_NAME_OBJECT, &object_uri)); object_name = object_uri; WT_PREFIX_SKIP_REQUIRED(session, object_name, "object:"); + LF_SET(WT_FS_OPEN_READONLY); + WT_ASSERT(session, !FLD_ISSET(flags, WT_FS_OPEN_CREATE)); + F_SET(session, WT_SESSION_QUIET_TIERED); + } + ret = __wt_open(session, object_name, type, flags, fhp); + F_CLR(session, WT_SESSION_QUIET_TIERED); + + /* + * FIXME-WT-7590 we will need some kind of locking while we're looking at the tiered structure. + * This can be called at any time, because we are opening the objects lazily. + */ + if (!local_only && ret != 0) { bstorage = tiered->bstorage; - flags |= WT_FS_OPEN_READONLY; + LF_SET(WT_FS_OPEN_READONLY); WT_WITH_BUCKET_STORAGE( bstorage, session, { ret = __wt_open(session, object_name, type, flags, fhp); }); - if (ret == ENOENT) { - /* - * There is a window where the object may not be copied yet to the bucket. If it isn't - * found try the local system. If it isn't found there then try the bucket one more - * time. - */ - ret = __wt_open(session, object_name, type, flags, fhp); - __wt_errx(session, "OPENER: local %s ret %d", object_name, ret); - if (ret == ENOENT) - WT_WITH_BUCKET_STORAGE( - bstorage, session, { ret = __wt_open(session, object_name, type, flags, fhp); }); - WT_ERR(ret); - } } err: __wt_free(session, object_uri); diff --git a/src/third_party/wiredtiger/src/tiered/tiered_work.c b/src/third_party/wiredtiger/src/tiered/tiered_work.c index b3fd1b7f9b5..efc80ea86bd 100644 --- a/src/third_party/wiredtiger/src/tiered/tiered_work.c +++ b/src/third_party/wiredtiger/src/tiered/tiered_work.c @@ -9,6 +9,24 @@ #include "wt_internal.h" /* + * __tiered_flush_state -- + * Account for flush work units so threads can know when shared storage flushing is complete. + */ +static void +__tiered_flush_state(WT_SESSION_IMPL *session, uint32_t type, bool incr) +{ + WT_CONNECTION_IMPL *conn; + + if (type != WT_TIERED_WORK_FLUSH) + return; + conn = S2C(session); + if (incr) + (void)__wt_atomic_addv32(&conn->flush_state, 1); + else + (void)__wt_atomic_subv32(&conn->flush_state, 1); +} + +/* * __wt_tiered_work_free -- * Free a work unit and account for it in the flush state. */ @@ -16,18 +34,9 @@ void __wt_tiered_work_free(WT_SESSION_IMPL *session, WT_TIERED_WORK_UNIT *entry) { WT_CONNECTION_IMPL *conn; - uint32_t new_state, old_state; conn = S2C(session); - for (;;) { - WT_BARRIER(); - old_state = conn->flush_state; - new_state = old_state - 1; - if (__wt_atomic_casv32(&conn->flush_state, old_state, new_state)) - break; - WT_STAT_CONN_INCR(session, flush_state_races); - __wt_yield(); - } + __tiered_flush_state(session, entry->type, false); /* If all work is done signal any waiting thread waiting for sync. */ if (WT_FLUSH_STATE_DONE(conn->flush_state)) __wt_cond_signal(session, conn->flush_cond); @@ -42,23 +51,13 @@ void __wt_tiered_push_work(WT_SESSION_IMPL *session, WT_TIERED_WORK_UNIT *entry) { WT_CONNECTION_IMPL *conn; - uint32_t new_state, old_state; conn = S2C(session); - __wt_spin_lock(session, &conn->tiered_lock); TAILQ_INSERT_TAIL(&conn->tieredqh, entry, q); WT_STAT_CONN_INCR(session, tiered_work_units_created); __wt_spin_unlock(session, &conn->tiered_lock); - for (;;) { - WT_BARRIER(); - old_state = conn->flush_state; - new_state = old_state + 1; - if (__wt_atomic_casv32(&conn->flush_state, old_state, new_state)) - break; - WT_STAT_CONN_INCR(session, flush_state_races); - __wt_yield(); - } + __tiered_flush_state(session, entry->type, true); __wt_cond_signal(session, conn->tiered_cond); return; } @@ -87,10 +86,10 @@ __wt_tiered_pop_work( if (FLD_ISSET(type, entry->type) && (maxval == 0 || entry->op_val < maxval)) { TAILQ_REMOVE(&conn->tieredqh, entry, q); WT_STAT_CONN_INCR(session, tiered_work_units_dequeued); + *entryp = entry; break; } } - *entryp = entry; __wt_spin_unlock(session, &conn->tiered_lock); return; } diff --git a/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c b/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c index 04df57cf66f..6aee858e94b 100644 --- a/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c +++ b/src/third_party/wiredtiger/src/txn/txn_rollback_to_stable.c @@ -155,17 +155,19 @@ __rollback_abort_update(WT_SESSION_IMPL *session, WT_ITEM *key, WT_UPDATE *first /* * __rollback_abort_insert_list -- - * Apply the update abort check to each entry in an insert skip list. + * Apply the update abort check to each entry in an insert skip list. Return how many entries + * had stable updates. */ static int __rollback_abort_insert_list(WT_SESSION_IMPL *session, WT_PAGE *page, WT_INSERT_HEAD *head, - wt_timestamp_t rollback_timestamp, bool *stable_update_found) + wt_timestamp_t rollback_timestamp, uint32_t *stable_updates_count) { WT_DECL_ITEM(key); WT_DECL_RET; WT_INSERT *ins; uint64_t recno; uint8_t *memp; + bool stable_update_found; WT_ERR( __wt_scr_alloc(session, page->type == WT_PAGE_ROW_LEAF ? 0 : WT_INTPACK64_MAXSIZE, &key)); @@ -182,7 +184,9 @@ __rollback_abort_insert_list(WT_SESSION_IMPL *session, WT_PAGE *page, WT_INSERT_ key->size = WT_PTRDIFF(memp, key->data); } WT_ERR(__rollback_abort_update( - session, key, ins->upd, rollback_timestamp, stable_update_found)); + session, key, ins->upd, rollback_timestamp, &stable_update_found)); + if (stable_update_found && stable_updates_count != NULL) + (*stable_updates_count)++; } err: @@ -191,6 +195,19 @@ err: } /* + * __rollback_has_stable_update -- + * Check if an update chain has a stable update on it. Assume the update chain has already been + * processed so all we need to do is look for a valid, non-aborted entry. + */ +static bool +__rollback_has_stable_update(WT_UPDATE *upd) +{ + while (upd != NULL && (upd->type == WT_UPDATE_INVALID || upd->txnid == WT_TXN_ABORTED)) + upd = upd->next; + return upd != NULL; +} + +/* * __rollback_col_modify -- * Add the provided update to the head of the update list. */ @@ -225,57 +242,27 @@ err: * Add the provided update to the head of the update list. */ static inline int -__rollback_row_modify(WT_SESSION_IMPL *session, WT_PAGE *page, WT_ROW *rip, WT_UPDATE *upd) +__rollback_row_modify(WT_SESSION_IMPL *session, WT_REF *ref, WT_UPDATE *upd, WT_ITEM *key) { + WT_CURSOR_BTREE cbt; WT_DECL_RET; - WT_PAGE_MODIFY *mod; - WT_UPDATE *last_upd, *old_upd, **upd_entry; - size_t upd_size; - - last_upd = NULL; - /* If we don't yet have a modify structure, we'll need one. */ - WT_RET(__wt_page_modify_init(session, page)); - mod = page->modify; - - /* Allocate an update array as necessary. */ - WT_PAGE_ALLOC_AND_SWAP(session, page, mod->mod_row_update, upd_entry, page->entries); - - /* Set the WT_UPDATE array reference. */ - upd_entry = &mod->mod_row_update[WT_ROW_SLOT(page, rip)]; - upd_size = __wt_update_list_memsize(upd); - /* If there are existing updates, append them after the new updates. */ - for (last_upd = upd; last_upd->next != NULL; last_upd = last_upd->next) - ; - last_upd->next = *upd_entry; - - /* - * We can either put a tombstone plus an update or a single update on the update chain. - * - * Set the "old" entry to the second update in the list so that the serialization function - * succeeds in swapping the first update into place. - */ - if (upd->next != NULL) - *upd_entry = upd->next; - old_upd = *upd_entry; + __wt_btcur_init(session, &cbt); + __wt_btcur_open(&cbt); - /* - * Point the new WT_UPDATE item to the next element in the list. The serialization function acts - * as our memory barrier to flush this write. - */ - upd->next = old_upd; + /* Search the page. */ + WT_ERR(__wt_row_search(&cbt, key, true, ref, true, NULL)); - /* - * Serialize the update. Rollback to stable doesn't need to check the visibility of the on page - * value to detect conflict. - */ - WT_ERR(__wt_update_serial(session, NULL, page, upd_entry, &upd, upd_size, true)); + /* Apply the modification. */ +#ifdef HAVE_DIAGNOSTIC + WT_ERR(__wt_row_modify(&cbt, key, NULL, upd, WT_UPDATE_INVALID, true, false)); +#else + WT_ERR(__wt_row_modify(&cbt, key, NULL, upd, WT_UPDATE_INVALID, true)); +#endif - if (0) { err: - if (last_upd != NULL) - last_upd->next = NULL; - } + /* Free any resources that may have been cached in the cursor. */ + WT_TRET(__wt_btcur_close(&cbt, true)); return (ret); } @@ -606,7 +593,7 @@ __rollback_ondisk_fixup_key(WT_SESSION_IMPL *session, WT_REF *ref, WT_ROW *rip, } if (rip != NULL) - WT_ERR(__rollback_row_modify(session, page, rip, upd)); + WT_ERR(__rollback_row_modify(session, ref, upd, key)); else WT_ERR(__rollback_col_modify(session, ref, upd, recno)); @@ -644,6 +631,7 @@ __rollback_abort_ondisk_kv(WT_SESSION_IMPL *session, WT_REF *ref, WT_ROW *rip, u WT_ITEM *row_key, WT_CELL_UNPACK_KV *vpack, wt_timestamp_t rollback_timestamp, bool *is_ondisk_stable) { + WT_DECL_ITEM(key); WT_DECL_ITEM(tmp); WT_DECL_RET; WT_PAGE *page; @@ -766,14 +754,24 @@ __rollback_abort_ondisk_kv(WT_SESSION_IMPL *session, WT_REF *ref, WT_ROW *rip, u return (0); } - if (rip != NULL) - WT_ERR(__rollback_row_modify(session, page, rip, upd)); - else + if (rip != NULL) { + if (row_key != NULL) + key = row_key; + else { + /* Unpack a row key. */ + WT_ERR(__wt_scr_alloc(session, 0, &key)); + WT_ERR(__wt_row_leaf_key(session, page, rip, key, false)); + } + WT_ERR(__rollback_row_modify(session, ref, upd, key)); + } else WT_ERR(__rollback_col_modify(session, ref, upd, recno)); - return (0); + if (0) { err: - __wt_free(session, upd); + __wt_free(session, upd); + } + if (rip != NULL && row_key == NULL) + __wt_scr_free(session, &key); return (ret); } @@ -788,11 +786,12 @@ __rollback_abort_col_var(WT_SESSION_IMPL *session, WT_REF *ref, wt_timestamp_t r WT_CELL *kcell; WT_CELL_UNPACK_KV unpack; WT_COL *cip; - WT_INSERT_HEAD *ins; + WT_INSERT *ins; + WT_INSERT_HEAD *inshead; WT_PAGE *page; - uint64_t recno, rle; - uint32_t i, j; - bool is_ondisk_stable, stable_update_found; + uint64_t ins_recno, recno, rle; + uint32_t i, j, stable_updates_count; + bool is_ondisk_stable; page = ref->page; /* @@ -805,11 +804,11 @@ __rollback_abort_col_var(WT_SESSION_IMPL *session, WT_REF *ref, wt_timestamp_t r /* Review the changes to the original on-page data items. */ WT_COL_FOREACH (page, cip, i) { - stable_update_found = false; + stable_updates_count = 0; - if ((ins = WT_COL_UPDATE(page, cip)) != NULL) + if ((inshead = WT_COL_UPDATE(page, cip)) != NULL) WT_RET(__rollback_abort_insert_list( - session, page, ins, rollback_timestamp, &stable_update_found)); + session, page, inshead, rollback_timestamp, &stable_updates_count)); if (page->dsk != NULL) { /* Unpack the cell. We need its RLE count whether or not we're going to iterate it. */ @@ -818,44 +817,76 @@ __rollback_abort_col_var(WT_SESSION_IMPL *session, WT_REF *ref, wt_timestamp_t r rle = __wt_cell_rle(&unpack); /* - * If we found a stable update on the insert list, this key needs no further attention. - * Any other keys in this cell with stable updates also do not require attention. But - * beyond that, the on-disk value must be older than the update we found. That means it - * too is stable(*), so any keys in the cell that _don't_ have stable updates on the - * update list don't need further attention either. (And any unstable updates were just - * handled above.) Thus we can skip iterating over the cell. + * Each key whose on-disk value is not stable and has no stable update on the update + * list must be processed downstream. + * + * If we can determine that the cell's on-disk value is stable, we can skip iterating + * over the cell; likewise, if we can determine that every key in the cell has a stable + * update on the update list, we can skip the iteration. Otherwise we have to try each + * key. + * + * If the on-disk cell is deleted, it is stable, because cells only appear as deleted + * when there is no older value that might need to be restored. * - * Furthermore, if the cell is deleted it must be - * itself stable, because cells only appear as deleted if there is no older value that - * might need to be restored. We can skip iterating over the cell. + * Note that in a purely timestamped world, the presence of any stable update for any + * key in the cell means the on-disk value must be stable, because the update must be + * newer than the on-disk value. However, this is no longer true if the stable update + * has no timestamp. It may also not be true if the on-disk value is prepared, or other + * corner cases. Therefore, we must iterate the cell unless _every_ key has a stable + * update. * - * (*) Either that, or the update is not timestamped, in which case the on-disk value - * might not be stable but the non-timestamp update will hide it until the next - * reconciliation and then overwrite it. + * We can, however, stop iterating as soon as the downstream code reports back that the + * on-disk value is actually stable. */ - if (stable_update_found) - WT_STAT_CONN_DATA_INCR(session, txn_rts_stable_rle_skipped); - else if (unpack.type == WT_CELL_DEL) + if (unpack.type == WT_CELL_DEL) WT_STAT_CONN_DATA_INCR(session, txn_rts_delete_rle_skipped); + else if (stable_updates_count == rle) + WT_STAT_CONN_DATA_INCR(session, txn_rts_stable_rle_skipped); else { - for (j = 0; j < rle; j++) { + j = 0; + if (inshead != NULL) { + WT_SKIP_FOREACH (ins, inshead) { + /* If the update list goes past the end of the cell, something's wrong. */ + WT_ASSERT(session, j < rle); + ins_recno = WT_INSERT_RECNO(ins); + /* Process all the keys before this update. */ + while (recno + j < ins_recno) { + WT_RET(__rollback_abort_ondisk_kv(session, ref, NULL, recno + j, NULL, + &unpack, rollback_timestamp, &is_ondisk_stable)); + /* We can stop right away if the on-disk version is stable. */ + if (is_ondisk_stable) { + if (rle > 1) + WT_STAT_CONN_DATA_INCR(session, txn_rts_stable_rle_skipped); + goto stop; + } + j++; + } + /* If this key has a stable update, skip over it. */ + if (recno + j == ins_recno && __rollback_has_stable_update(ins->upd)) + j++; + } + } + /* Process the rest of the keys. */ + while (j < rle) { WT_RET(__rollback_abort_ondisk_kv(session, ref, NULL, recno + j, NULL, &unpack, rollback_timestamp, &is_ondisk_stable)); /* We can stop right away if the on-disk version is stable. */ if (is_ondisk_stable) { if (rle > 1) WT_STAT_CONN_DATA_INCR(session, txn_rts_stable_rle_skipped); - break; + goto stop; } + j++; } } +stop: recno += rle; } } /* Review the append list */ - if ((ins = WT_COL_APPEND(page)) != NULL) - WT_RET(__rollback_abort_insert_list(session, page, ins, rollback_timestamp, NULL)); + if ((inshead = WT_COL_APPEND(page)) != NULL) + WT_RET(__rollback_abort_insert_list(session, page, inshead, rollback_timestamp, NULL)); /* Mark the page as dirty to reconcile the page. */ if (page->modify) |