diff options
22 files changed, 742 insertions, 414 deletions
diff --git a/src/third_party/wiredtiger/dist/stat_data.py b/src/third_party/wiredtiger/dist/stat_data.py index 471ee528981..31b26f521d4 100644 --- a/src/third_party/wiredtiger/dist/stat_data.py +++ b/src/third_party/wiredtiger/dist/stat_data.py @@ -242,6 +242,9 @@ connection_stats = [ CacheStat('cache_eviction_force_dirty_time', 'forced eviction - pages evicted that were dirty time (usecs)'), CacheStat('cache_eviction_force_fail', 'forced eviction - pages selected unable to be evicted count'), CacheStat('cache_eviction_force_fail_time', 'forced eviction - pages selected unable to be evicted time'), + CacheStat('cache_eviction_force_hs', 'forced eviction - history store pages selected while session has history store cursor open'), + CacheStat('cache_eviction_force_hs_fail', 'forced eviction - history store pages failed to evict while session has history store cursor open'), + CacheStat('cache_eviction_force_hs_success', 'forced eviction - history store pages successfully evicted while session has history store cursor open'), CacheStat('cache_eviction_force_retune', 'force re-tuning of eviction workers once in a while'), CacheStat('cache_eviction_get_ref', 'eviction calls to get a page'), CacheStat('cache_eviction_get_ref_empty', 'eviction calls to get a page found queue empty'), diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data index e13898f8192..34221ab1fa5 100644 --- a/src/third_party/wiredtiger/import.data +++ b/src/third_party/wiredtiger/import.data @@ -2,5 +2,5 @@ "vendor": "wiredtiger", "github": "wiredtiger/wiredtiger.git", "branch": "mongodb-4.4", - "commit": "32b5f903dbc021b570feea50eb48453c17cd0e89" + "commit": "55d47c210ccb07a115c2e6f71ee90367c7c3ab77" } diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c index 47d0907a0d7..e3ad5538358 100644 --- a/src/third_party/wiredtiger/src/btree/bt_curnext.c +++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c @@ -57,7 +57,7 @@ __cursor_fix_append_next(WT_CURSOR_BTREE *cbt, bool newpage, bool restart) cbt->iface.value.data = &cbt->v; } else { restart_read: - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) { cbt->v = 0; cbt->iface.value.data = &cbt->v; @@ -156,12 +156,12 @@ new_page: __cursor_set_recno(cbt, WT_INSERT_RECNO(cbt->ins)); restart_read: - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -227,10 +227,10 @@ restart_read: cbt->ins = __col_insert_search_match(cbt->ins_head, cbt->recno); __wt_upd_value_clear(cbt->upd_value); if (cbt->ins != NULL) - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type != WT_UPDATE_INVALID) { if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -352,11 +352,11 @@ restart_read_insert: if ((ins = cbt->ins) != NULL) { key->data = WT_INSERT_KEY(ins); key->size = WT_INSERT_KEY_SIZE(ins); - WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -391,7 +391,7 @@ restart_read_page: if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c index 3b13e4b7b9c..fa3718a6e87 100644 --- a/src/third_party/wiredtiger/src/btree/bt_curprev.c +++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c @@ -197,7 +197,7 @@ __cursor_fix_append_prev(WT_CURSOR_BTREE *cbt, bool newpage, bool restart) cbt->iface.value.data = &cbt->v; } else { restart_read: - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) { cbt->v = 0; cbt->iface.value.data = &cbt->v; @@ -296,11 +296,11 @@ new_page: __cursor_set_recno(cbt, WT_INSERT_RECNO(cbt->ins)); restart_read: - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -367,10 +367,10 @@ restart_read: cbt->ins = __col_insert_search_match(cbt->ins_head, cbt->recno); __wt_upd_value_clear(cbt->upd_value); if (cbt->ins != NULL) - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type != WT_UPDATE_INVALID) { if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -502,11 +502,11 @@ restart_read_insert: if ((ins = cbt->ins) != NULL) { key->data = WT_INSERT_KEY(ins); key->size = WT_INSERT_KEY_SIZE(ins); - WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, ins->upd, NULL)); if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; @@ -543,7 +543,7 @@ restart_read_page: if (cbt->upd_value->type == WT_UPDATE_INVALID) continue; if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) { - if (cbt->upd_value->txnid != WT_TXN_NONE && + if (cbt->upd_value->tw.stop_txn != WT_TXN_NONE && __wt_txn_upd_value_visible_all(session, cbt->upd_value)) ++cbt->page_deleted_count; continue; diff --git a/src/third_party/wiredtiger/src/btree/bt_cursor.c b/src/third_party/wiredtiger/src/btree/bt_cursor.c index 29768838120..69fd38f3b4b 100644 --- a/src/third_party/wiredtiger/src/btree/bt_cursor.c +++ b/src/third_party/wiredtiger/src/btree/bt_cursor.c @@ -230,7 +230,7 @@ __wt_cursor_valid(WT_CURSOR_BTREE *cbt, WT_ITEM *key, uint64_t recno, bool *vali * update that's been deleted is not a valid key/value pair). */ if (cbt->ins != NULL) { - WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd)); + WT_RET(__wt_txn_read_upd_list(session, cbt, cbt->ins->upd, NULL)); if (cbt->upd_value->type != WT_UPDATE_INVALID) { if (cbt->upd_value->type == WT_UPDATE_TOMBSTONE) return (0); diff --git a/src/third_party/wiredtiger/src/evict/evict_page.c b/src/third_party/wiredtiger/src/evict/evict_page.c index 6d0d3be7fc8..ec38401950a 100644 --- a/src/third_party/wiredtiger/src/evict/evict_page.c +++ b/src/third_party/wiredtiger/src/evict/evict_page.c @@ -96,11 +96,12 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32 WT_PAGE *page; uint64_t time_start, time_stop; uint32_t session_flags; - bool clean_page, closing, inmem_split, is_owner, local_gen, tree_dead; + bool clean_page, closing, force_evict_hs, inmem_split, is_owner, local_gen, tree_dead; conn = S2C(session); page = ref->page; closing = LF_ISSET(WT_EVICT_CALL_CLOSING); + force_evict_hs = false; local_gen = false; time_start = time_stop = 0; /* [-Werror=maybe-uninitialized] */ @@ -153,6 +154,14 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32 if (LF_ISSET(WT_EVICT_CALL_URGENT)) { time_start = __wt_clock(session); WT_STAT_CONN_INCR(session, cache_eviction_force); + + /* + * Track history store pages being force evicted while holding a history store cursor open. + */ + if (session->hs_cursor != NULL && WT_IS_HS(S2BT(session))) { + force_evict_hs = true; + WT_STAT_CONN_INCR(session, cache_eviction_force_hs); + } } /* @@ -221,6 +230,8 @@ __wt_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint8_t previous_state, uint32 if (LF_ISSET(WT_EVICT_CALL_URGENT)) { time_stop = __wt_clock(session); + if (force_evict_hs) + WT_STAT_CONN_INCR(session, cache_eviction_force_hs_success); if (clean_page) { WT_STAT_CONN_INCR(session, cache_eviction_force_clean); WT_STAT_CONN_INCRV( @@ -246,6 +257,8 @@ err: if (LF_ISSET(WT_EVICT_CALL_URGENT)) { time_stop = __wt_clock(session); + if (force_evict_hs) + WT_STAT_CONN_INCR(session, cache_eviction_force_hs_fail); WT_STAT_CONN_INCR(session, cache_eviction_force_fail); WT_STAT_CONN_INCRV( session, cache_eviction_force_fail_time, WT_CLOCKDIFF_US(time_stop, time_start)); diff --git a/src/third_party/wiredtiger/src/history/hs.c b/src/third_party/wiredtiger/src/history/hs.c index 5c6d2a1f30d..15f86d5c69e 100644 --- a/src/third_party/wiredtiger/src/history/hs.c +++ b/src/third_party/wiredtiger/src/history/hs.c @@ -574,14 +574,15 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_PAGE *page, WT_MULTI *multi) WT_MODIFY entries[MAX_REVERSE_MODIFY_NUM]; WT_MODIFY_VECTOR modifies; WT_SAVE_UPD *list; - WT_UPDATE *prev_upd, *upd; + WT_UPDATE *prev_upd, *second_older_than_prepare, *upd; WT_HS_TIME_POINT stop_time_point; wt_off_t hs_size; uint64_t insert_cnt, max_hs_size; uint32_t i; uint8_t *p; int nentries; - bool squashed; + bool squashed, track_prepare; + uint8_t upd_count; btree = S2BT(session); cursor = session->hs_cursor; @@ -634,6 +635,9 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_PAGE *page, WT_MULTI *multi) session, btree, upd = __wt_update_obsolete_check(session, page, list->onpage_upd, true)); __wt_free_update_list(session, &upd); upd = list->onpage_upd; + second_older_than_prepare = NULL; + track_prepare = false; + upd_count = 0; /* * The algorithm assumes the oldest update on the update chain in memory is either a full @@ -666,6 +670,32 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_PAGE *page, WT_MULTI *multi) if (upd->txnid == WT_TXN_ABORTED) continue; WT_ERR(__wt_modify_vector_push(&modifies, upd)); + + /* + * If the update is the second update older than the prepared update and we haven't seen + * a tombstone. Mark the update. + */ + if (upd->prepare_state == WT_PREPARE_INPROGRESS) { + /* + * No normal update between prepared updates and the first prepared update cannot be + * a tombstone. + */ + WT_ASSERT(session, (track_prepare && upd_count == 0) || + (!track_prepare && upd->type != WT_UPDATE_TOMBSTONE)); + track_prepare = true; + } else if (track_prepare) { + if (upd->type == WT_UPDATE_TOMBSTONE) { + upd_count = 0; + track_prepare = false; + } else if (upd_count == 0) + ++upd_count; + else { + second_older_than_prepare = upd; + upd_count = 0; + track_prepare = false; + } + } + /* * If we've reached a full update and its in the history store we don't need to continue * as anything beyond this point won't help with calculating deltas. @@ -763,13 +793,16 @@ __wt_hs_insert_updates(WT_SESSION_IMPL *session, WT_PAGE *page, WT_MULTI *multi) * It is not correct to check prev_upd == list->onpage_upd as we may have aborted * updates in the middle. * - * We can't calculate reverse modify based on an uncommitted prepared update because - * it may be aborted. + * We must insert the first and second updates after a prepared update as full + * values because if the prepared update is aborted, we will remove the first update + * after it from the history store to the update chain. Readers reading the older + * values need a full update as the base value for constructing reverse modifies. */ nentries = MAX_REVERSE_MODIFY_NUM; if (!F_ISSET(upd, WT_UPDATE_HS)) { if (upd->type == WT_UPDATE_MODIFY && prev_upd->prepare_state != WT_PREPARE_INPROGRESS && + (second_older_than_prepare == NULL || upd != second_older_than_prepare) && __wt_calc_modify(session, prev_full_value, full_value, prev_full_value->size / 10, entries, &nentries) == 0) { WT_ERR(__wt_modify_pack(cursor, entries, nentries, &modify_value)); @@ -1049,11 +1082,9 @@ __wt_find_hs_upd(WT_SESSION_IMPL *session, WT_ITEM *key, const char *value_forma */ WT_ERR(__wt_buf_set(session, &upd_value->buf, hs_value->data, hs_value->size)); skip_buf: - upd_value->durable_ts = durable_timestamp; - upd_value->txnid = WT_TXN_NONE; + upd_value->tw.durable_start_ts = durable_timestamp; + upd_value->tw.start_txn = WT_TXN_NONE; upd_value->type = upd_type; - upd_value->prepare_state = - (hs_start_ts == durable_timestamp) ? WT_PREPARE_INIT : WT_PREPARE_RESOLVED; done: err: diff --git a/src/third_party/wiredtiger/src/include/btmem.h b/src/third_party/wiredtiger/src/include/btmem.h index 5cbcf173733..b5cf1a86ec2 100644 --- a/src/third_party/wiredtiger/src/include/btmem.h +++ b/src/third_party/wiredtiger/src/include/btmem.h @@ -1111,10 +1111,8 @@ struct __wt_update { */ struct __wt_update_value { WT_ITEM buf; - wt_timestamp_t durable_ts; - uint64_t txnid; + WT_TIME_WINDOW tw; uint8_t type; - uint8_t prepare_state; bool skip_buf; }; diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h index a5223c97a27..a7ee16e9b74 100644 --- a/src/third_party/wiredtiger/src/include/extern.h +++ b/src/third_party/wiredtiger/src/include/extern.h @@ -2023,7 +2023,7 @@ static inline int __wt_txn_read(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, uint64_t recno, WT_UPDATE *upd, WT_CELL_UNPACK_KV *vpack) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline int __wt_txn_read_upd_list(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, - WT_UPDATE *upd) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); + WT_UPDATE *upd, WT_UPDATE **prepare_updp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline int __wt_txn_search_check(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result)); static inline int __wt_txn_update_check(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h index 2b646a640e7..452e1459789 100644 --- a/src/third_party/wiredtiger/src/include/stat.h +++ b/src/third_party/wiredtiger/src/include/stat.h @@ -381,6 +381,9 @@ struct __wt_connection_stats { int64_t cache_eviction_walks_active; int64_t cache_eviction_walks_started; int64_t cache_eviction_force_retune; + int64_t cache_eviction_force_hs_fail; + int64_t cache_eviction_force_hs; + int64_t cache_eviction_force_hs_success; int64_t cache_eviction_force_clean; int64_t cache_eviction_force_clean_time; int64_t cache_eviction_force_dirty; diff --git a/src/third_party/wiredtiger/src/include/txn.i b/src/third_party/wiredtiger/src/include/txn.i index 975375e98c5..575e58b3cae 100644 --- a/src/third_party/wiredtiger/src/include/txn.i +++ b/src/third_party/wiredtiger/src/include/txn.i @@ -594,11 +594,10 @@ __wt_txn_upd_visible_all(WT_SESSION_IMPL *session, WT_UPDATE *upd) static inline bool __wt_txn_upd_value_visible_all(WT_SESSION_IMPL *session, WT_UPDATE_VALUE *upd_value) { - if (upd_value->prepare_state == WT_PREPARE_LOCKED || - upd_value->prepare_state == WT_PREPARE_INPROGRESS) - return (false); - - return (__wt_txn_visible_all(session, upd_value->txnid, upd_value->durable_ts)); + WT_ASSERT(session, upd_value->tw.prepare == 0); + return (upd_value->type == WT_UPDATE_TOMBSTONE ? + __wt_txn_visible_all(session, upd_value->tw.stop_txn, upd_value->tw.durable_stop_ts) : + __wt_txn_visible_all(session, upd_value->tw.start_txn, upd_value->tw.durable_start_ts)); } /* @@ -762,10 +761,8 @@ __wt_txn_upd_visible_type(WT_SESSION_IMPL *session, WT_UPDATE *upd) if (!upd_visible) return (WT_VISIBLE_FALSE); - /* Ignore the prepared update, if transaction configuration says so. */ if (prepare_state == WT_PREPARE_INPROGRESS) - return ( - F_ISSET(session->txn, WT_TXN_IGNORE_PREPARE) ? WT_VISIBLE_FALSE : WT_VISIBLE_PREPARE); + return (WT_VISIBLE_PREPARE); return (WT_VISIBLE_TRUE); } @@ -840,11 +837,14 @@ __wt_upd_alloc_tombstone(WT_SESSION_IMPL *session, WT_UPDATE **updp, size_t *siz * Get the first visible update in a list (or NULL if none are visible). */ static inline int -__wt_txn_read_upd_list(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd) +__wt_txn_read_upd_list( + WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd, WT_UPDATE **prepare_updp) { WT_VISIBLE_TYPE upd_visible; uint8_t type; + if (prepare_updp != NULL) + *prepare_updp = NULL; __wt_upd_value_clear(cbt->upd_value); for (; upd != NULL; upd = upd->next) { @@ -852,7 +852,9 @@ __wt_txn_read_upd_list(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE /* Skip reserved place-holders, they're never visible. */ if (type == WT_UPDATE_RESERVE) continue; + upd_visible = __wt_txn_upd_visible_type(session, upd); + if (upd_visible == WT_VISIBLE_TRUE) { /* * Ignore non-globally visible tombstones when we are doing history store scans in @@ -861,15 +863,35 @@ __wt_txn_read_upd_list(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE if (type == WT_UPDATE_TOMBSTONE && (F_ISSET(&cbt->iface, WT_CURSTD_IGNORE_TOMBSTONE) || (WT_IS_HS(S2BT(session)) && F_ISSET(session, WT_SESSION_ROLLBACK_TO_STABLE))) && - !__wt_txn_upd_visible_all(session, upd)) + !__wt_txn_upd_visible_all(session, upd)) { + cbt->upd_value->tw.durable_stop_ts = upd->durable_ts; + cbt->upd_value->tw.stop_ts = upd->start_ts; + cbt->upd_value->tw.stop_txn = upd->txnid; + cbt->upd_value->tw.prepare = upd->prepare_state == WT_PREPARE_INPROGRESS || + upd->prepare_state == WT_PREPARE_LOCKED; continue; + } break; } - if (upd_visible == WT_VISIBLE_PREPARE) + + if (upd_visible == WT_VISIBLE_PREPARE) { + /* Ignore the prepared update, if transaction configuration says so. */ + if (F_ISSET(session->txn, WT_TXN_IGNORE_PREPARE)) { + /* + * Save the prepared update to help us detect if we race with prepared commit or + * rollback. + */ + if (prepare_updp != NULL && *prepare_updp == NULL) + *prepare_updp = upd; + continue; + } return (WT_PREPARE_CONFLICT); + } } + if (upd == NULL) return (0); + /* * Now assign to the update value. If it's not a modify, we're free to simply point the value at * the update's memory without owning it. If it is a modify, we need to reconstruct the full @@ -897,8 +919,12 @@ __wt_txn_read(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *key, uint WT_UPDATE *upd, WT_CELL_UNPACK_KV *vpack) { WT_TIME_WINDOW tw; + WT_UPDATE *prepare_upd; + uint8_t prepare_state; - WT_RET(__wt_txn_read_upd_list(session, cbt, upd)); + prepare_upd = NULL; + + WT_RET(__wt_txn_read_upd_list(session, cbt, upd, &prepare_upd)); if (WT_UPDATE_DATA_VALUE(cbt->upd_value) || (cbt->upd_value->type == WT_UPDATE_MODIFY && cbt->upd_value->skip_buf)) return (0); @@ -932,13 +958,22 @@ __wt_txn_read(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *key, uint __wt_txn_tw_stop_visible_all(session, &tw))) { cbt->upd_value->buf.data = NULL; cbt->upd_value->buf.size = 0; - cbt->upd_value->durable_ts = tw.durable_stop_ts; - cbt->upd_value->txnid = tw.stop_txn; + cbt->upd_value->tw.durable_stop_ts = tw.durable_stop_ts; + cbt->upd_value->tw.stop_ts = tw.stop_ts; + cbt->upd_value->tw.stop_txn = tw.stop_txn; + cbt->upd_value->tw.prepare = tw.prepare; cbt->upd_value->type = WT_UPDATE_TOMBSTONE; - cbt->upd_value->prepare_state = WT_PREPARE_INIT; return (0); } + /* Store the stop time pair of the history store record that is returning. */ + if (WT_TIME_WINDOW_HAS_STOP(&tw) && WT_IS_HS(S2BT(session))) { + cbt->upd_value->tw.durable_stop_ts = tw.durable_stop_ts; + cbt->upd_value->tw.stop_ts = tw.stop_ts; + cbt->upd_value->tw.stop_txn = tw.stop_txn; + cbt->upd_value->tw.prepare = tw.prepare; + } + /* If the start time point is visible then we need to return the ondisk value. */ if (F_ISSET(session, WT_SESSION_RESOLVING_MODIFY) || __wt_txn_tw_start_visible(session, &tw)) { /* If we are resolving a modify then the btree must be the history store. */ @@ -950,10 +985,11 @@ __wt_txn_read(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *key, uint cbt->upd_value->buf.data = NULL; cbt->upd_value->buf.size = 0; } - cbt->upd_value->durable_ts = tw.durable_start_ts; - cbt->upd_value->txnid = tw.start_txn; + cbt->upd_value->tw.durable_start_ts = tw.durable_start_ts; + cbt->upd_value->tw.start_ts = tw.start_ts; + cbt->upd_value->tw.start_txn = tw.start_txn; + cbt->upd_value->tw.prepare = tw.prepare; cbt->upd_value->type = WT_UPDATE_STANDARD; - cbt->upd_value->prepare_state = WT_PREPARE_INIT; return (0); } @@ -962,6 +998,16 @@ __wt_txn_read(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_ITEM *key, uint WT_RET_NOTFOUND_OK(__wt_find_hs_upd(session, key, cbt->iface.value_format, recno, cbt->upd_value, false, &cbt->upd_value->buf)); + /* + * Retry if we race with prepared commit or rollback as the reader may have read changed history + * store content. + */ + if (prepare_upd != NULL) { + WT_ORDERED_READ(prepare_state, prepare_upd->prepare_state); + if (prepare_upd->txnid == WT_TXN_ABORTED || prepare_state == WT_PREPARE_RESOLVED) + return (WT_RESTART); + } + /* Return invalid not tombstone if nothing is found in history store. */ WT_ASSERT(session, cbt->upd_value->type != WT_UPDATE_TOMBSTONE); return (0); @@ -1326,10 +1372,20 @@ __wt_upd_value_assign(WT_UPDATE_VALUE *upd_value, WT_UPDATE *upd) upd_value->buf.data = upd->data; upd_value->buf.size = upd->size; } - upd_value->durable_ts = upd->durable_ts; - upd_value->txnid = upd->txnid; + if (upd->type == WT_UPDATE_TOMBSTONE) { + upd_value->tw.durable_stop_ts = upd->durable_ts; + upd_value->tw.stop_ts = upd->start_ts; + upd_value->tw.stop_txn = upd->txnid; + upd_value->tw.prepare = + upd->prepare_state == WT_PREPARE_INPROGRESS || upd->prepare_state == WT_PREPARE_LOCKED; + } else { + upd_value->tw.durable_start_ts = upd->durable_ts; + upd_value->tw.start_ts = upd->start_ts; + upd_value->tw.start_txn = upd->txnid; + upd_value->tw.prepare = + upd->prepare_state == WT_PREPARE_INPROGRESS || upd->prepare_state == WT_PREPARE_LOCKED; + } upd_value->type = upd->type; - upd_value->prepare_state = upd->prepare_state; } /* @@ -1345,8 +1401,6 @@ __wt_upd_value_clear(WT_UPDATE_VALUE *upd_value) */ upd_value->buf.data = NULL; upd_value->buf.size = 0; - upd_value->durable_ts = WT_TS_NONE; - upd_value->txnid = WT_TXN_NONE; + WT_TIME_WINDOW_INIT(&upd_value->tw); upd_value->type = WT_UPDATE_INVALID; - upd_value->prepare_state = WT_PREPARE_INIT; } diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in index 36a2e23774b..0d48a9dc525 100644 --- a/src/third_party/wiredtiger/src/include/wiredtiger.in +++ b/src/third_party/wiredtiger/src/include/wiredtiger.in @@ -5110,753 +5110,768 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection); #define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1084 /*! cache: force re-tuning of eviction workers once in a while */ #define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1085 +/*! + * cache: forced eviction - history store pages failed to evict while + * session has history store cursor open + */ +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_FAIL 1086 +/*! + * cache: forced eviction - history store pages selected while session + * has history store cursor open + */ +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS 1087 +/*! + * cache: forced eviction - history store pages successfully evicted + * while session has history store cursor open + */ +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_HS_SUCCESS 1088 /*! cache: forced eviction - pages evicted that were clean count */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN 1086 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN 1089 /*! cache: forced eviction - pages evicted that were clean time (usecs) */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN_TIME 1087 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN_TIME 1090 /*! cache: forced eviction - pages evicted that were dirty count */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY 1088 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY 1091 /*! cache: forced eviction - pages evicted that were dirty time (usecs) */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY_TIME 1089 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY_TIME 1092 /*! * cache: forced eviction - pages selected because of too many deleted * items count */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1090 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1093 /*! cache: forced eviction - pages selected count */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1091 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1094 /*! cache: forced eviction - pages selected unable to be evicted count */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1092 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1095 /*! cache: forced eviction - pages selected unable to be evicted time */ -#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1093 +#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1096 /*! cache: hazard pointer blocked page eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1094 +#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1097 /*! cache: hazard pointer check calls */ -#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1095 +#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1098 /*! cache: hazard pointer check entries walked */ -#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1096 +#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1099 /*! cache: hazard pointer maximum array length */ -#define WT_STAT_CONN_CACHE_HAZARD_MAX 1097 +#define WT_STAT_CONN_CACHE_HAZARD_MAX 1100 /*! cache: history store key truncation due to mixed timestamps */ -#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_MIX_TS 1098 +#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_MIX_TS 1101 /*! * cache: history store key truncation due to the key being removed from * the data page */ -#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 1099 +#define WT_STAT_CONN_CACHE_HS_KEY_TRUNCATE_ONPAGE_REMOVAL 1102 /*! cache: history store score */ -#define WT_STAT_CONN_CACHE_HS_SCORE 1100 +#define WT_STAT_CONN_CACHE_HS_SCORE 1103 /*! cache: history store table insert calls */ -#define WT_STAT_CONN_CACHE_HS_INSERT 1101 +#define WT_STAT_CONN_CACHE_HS_INSERT 1104 /*! cache: history store table max on-disk size */ -#define WT_STAT_CONN_CACHE_HS_ONDISK_MAX 1102 +#define WT_STAT_CONN_CACHE_HS_ONDISK_MAX 1105 /*! cache: history store table on-disk size */ -#define WT_STAT_CONN_CACHE_HS_ONDISK 1103 +#define WT_STAT_CONN_CACHE_HS_ONDISK 1106 /*! cache: history store table reads */ -#define WT_STAT_CONN_CACHE_HS_READ 1104 +#define WT_STAT_CONN_CACHE_HS_READ 1107 /*! cache: history store table reads missed */ -#define WT_STAT_CONN_CACHE_HS_READ_MISS 1105 +#define WT_STAT_CONN_CACHE_HS_READ_MISS 1108 /*! cache: history store table reads requiring squashed modifies */ -#define WT_STAT_CONN_CACHE_HS_READ_SQUASH 1106 +#define WT_STAT_CONN_CACHE_HS_READ_SQUASH 1109 /*! cache: history store table remove calls due to key truncation */ -#define WT_STAT_CONN_CACHE_HS_REMOVE_KEY_TRUNCATE 1107 +#define WT_STAT_CONN_CACHE_HS_REMOVE_KEY_TRUNCATE 1110 /*! cache: history store table writes requiring squashed modifies */ -#define WT_STAT_CONN_CACHE_HS_WRITE_SQUASH 1108 +#define WT_STAT_CONN_CACHE_HS_WRITE_SQUASH 1111 /*! cache: in-memory page passed criteria to be split */ -#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1109 +#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1112 /*! cache: in-memory page splits */ -#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1110 +#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1113 /*! cache: internal pages evicted */ -#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1111 +#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1114 /*! cache: internal pages queued for eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_QUEUED 1112 +#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_QUEUED 1115 /*! cache: internal pages seen by eviction walk */ -#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_SEEN 1113 +#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_SEEN 1116 /*! cache: internal pages seen by eviction walk that are already queued */ -#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_ALREADY_QUEUED 1114 +#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL_PAGES_ALREADY_QUEUED 1117 /*! cache: internal pages split during eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1115 +#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1118 /*! cache: leaf pages split during eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1116 +#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1119 /*! cache: maximum bytes configured */ -#define WT_STAT_CONN_CACHE_BYTES_MAX 1117 +#define WT_STAT_CONN_CACHE_BYTES_MAX 1120 /*! cache: maximum page size at eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1118 +#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1121 /*! cache: modified pages evicted */ -#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1119 +#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1122 /*! cache: modified pages evicted by application threads */ -#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1120 +#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1123 /*! cache: operations timed out waiting for space in cache */ -#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1121 +#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1124 /*! cache: overflow pages read into cache */ -#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1122 +#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1125 /*! cache: page split during eviction deepened the tree */ -#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1123 +#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1126 /*! cache: page written requiring history store records */ -#define WT_STAT_CONN_CACHE_WRITE_HS 1124 +#define WT_STAT_CONN_CACHE_WRITE_HS 1127 /*! cache: pages currently held in the cache */ -#define WT_STAT_CONN_CACHE_PAGES_INUSE 1125 +#define WT_STAT_CONN_CACHE_PAGES_INUSE 1128 /*! cache: pages evicted by application threads */ -#define WT_STAT_CONN_CACHE_EVICTION_APP 1126 +#define WT_STAT_CONN_CACHE_EVICTION_APP 1129 /*! cache: pages queued for eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1127 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1130 /*! cache: pages queued for eviction post lru sorting */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_POST_LRU 1128 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_POST_LRU 1131 /*! cache: pages queued for urgent eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1129 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1132 /*! cache: pages queued for urgent eviction during walk */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1130 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1133 /*! cache: pages read into cache */ -#define WT_STAT_CONN_CACHE_READ 1131 +#define WT_STAT_CONN_CACHE_READ 1134 /*! cache: pages read into cache after truncate */ -#define WT_STAT_CONN_CACHE_READ_DELETED 1132 +#define WT_STAT_CONN_CACHE_READ_DELETED 1135 /*! cache: pages read into cache after truncate in prepare state */ -#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1133 +#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1136 /*! cache: pages requested from the cache */ -#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1134 +#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1137 /*! cache: pages seen by eviction walk */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1135 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1138 /*! cache: pages seen by eviction walk that are already queued */ -#define WT_STAT_CONN_CACHE_EVICTION_PAGES_ALREADY_QUEUED 1136 +#define WT_STAT_CONN_CACHE_EVICTION_PAGES_ALREADY_QUEUED 1139 /*! cache: pages selected for eviction unable to be evicted */ -#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1137 +#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1140 /*! * cache: pages selected for eviction unable to be evicted as the parent * page has overflow items */ -#define WT_STAT_CONN_CACHE_EVICTION_FAIL_PARENT_HAS_OVERFLOW_ITEMS 1138 +#define WT_STAT_CONN_CACHE_EVICTION_FAIL_PARENT_HAS_OVERFLOW_ITEMS 1141 /*! * cache: pages selected for eviction unable to be evicted because of * active children on an internal page */ -#define WT_STAT_CONN_CACHE_EVICTION_FAIL_ACTIVE_CHILDREN_ON_AN_INTERNAL_PAGE 1139 +#define WT_STAT_CONN_CACHE_EVICTION_FAIL_ACTIVE_CHILDREN_ON_AN_INTERNAL_PAGE 1142 /*! * cache: pages selected for eviction unable to be evicted because of * failure in reconciliation */ -#define WT_STAT_CONN_CACHE_EVICTION_FAIL_IN_RECONCILIATION 1140 +#define WT_STAT_CONN_CACHE_EVICTION_FAIL_IN_RECONCILIATION 1143 /*! * cache: pages selected for eviction unable to be evicted due to newer * modifications on a clean page */ -#define WT_STAT_CONN_CACHE_EVICTION_FAIL_WITH_NEWER_MODIFICATIONS_ON_A_CLEAN_PAGE 1141 +#define WT_STAT_CONN_CACHE_EVICTION_FAIL_WITH_NEWER_MODIFICATIONS_ON_A_CLEAN_PAGE 1144 /*! cache: pages walked for eviction */ -#define WT_STAT_CONN_CACHE_EVICTION_WALK 1142 +#define WT_STAT_CONN_CACHE_EVICTION_WALK 1145 /*! cache: pages written from cache */ -#define WT_STAT_CONN_CACHE_WRITE 1143 +#define WT_STAT_CONN_CACHE_WRITE 1146 /*! cache: pages written requiring in-memory restoration */ -#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1144 +#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1147 /*! cache: percentage overhead */ -#define WT_STAT_CONN_CACHE_OVERHEAD 1145 +#define WT_STAT_CONN_CACHE_OVERHEAD 1148 /*! cache: tracked bytes belonging to internal pages in the cache */ -#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1146 +#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1149 /*! cache: tracked bytes belonging to leaf pages in the cache */ -#define WT_STAT_CONN_CACHE_BYTES_LEAF 1147 +#define WT_STAT_CONN_CACHE_BYTES_LEAF 1150 /*! cache: tracked dirty bytes in the cache */ -#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1148 +#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1151 /*! cache: tracked dirty pages in the cache */ -#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1149 +#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1152 /*! cache: unmodified pages evicted */ -#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1150 +#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1153 /*! capacity: background fsync file handles considered */ -#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1151 +#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1154 /*! capacity: background fsync file handles synced */ -#define WT_STAT_CONN_FSYNC_ALL_FH 1152 +#define WT_STAT_CONN_FSYNC_ALL_FH 1155 /*! capacity: background fsync time (msecs) */ -#define WT_STAT_CONN_FSYNC_ALL_TIME 1153 +#define WT_STAT_CONN_FSYNC_ALL_TIME 1156 /*! capacity: bytes read */ -#define WT_STAT_CONN_CAPACITY_BYTES_READ 1154 +#define WT_STAT_CONN_CAPACITY_BYTES_READ 1157 /*! capacity: bytes written for checkpoint */ -#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1155 +#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1158 /*! capacity: bytes written for eviction */ -#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1156 +#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1159 /*! capacity: bytes written for log */ -#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1157 +#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1160 /*! capacity: bytes written total */ -#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1158 +#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1161 /*! capacity: threshold to call fsync */ -#define WT_STAT_CONN_CAPACITY_THRESHOLD 1159 +#define WT_STAT_CONN_CAPACITY_THRESHOLD 1162 /*! capacity: time waiting due to total capacity (usecs) */ -#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1160 +#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1163 /*! capacity: time waiting during checkpoint (usecs) */ -#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1161 +#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1164 /*! capacity: time waiting during eviction (usecs) */ -#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1162 +#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1165 /*! capacity: time waiting during logging (usecs) */ -#define WT_STAT_CONN_CAPACITY_TIME_LOG 1163 +#define WT_STAT_CONN_CAPACITY_TIME_LOG 1166 /*! capacity: time waiting during read (usecs) */ -#define WT_STAT_CONN_CAPACITY_TIME_READ 1164 +#define WT_STAT_CONN_CAPACITY_TIME_READ 1167 /*! connection: auto adjusting condition resets */ -#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1165 +#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1168 /*! connection: auto adjusting condition wait calls */ -#define WT_STAT_CONN_COND_AUTO_WAIT 1166 +#define WT_STAT_CONN_COND_AUTO_WAIT 1169 /*! connection: detected system time went backwards */ -#define WT_STAT_CONN_TIME_TRAVEL 1167 +#define WT_STAT_CONN_TIME_TRAVEL 1170 /*! connection: files currently open */ -#define WT_STAT_CONN_FILE_OPEN 1168 +#define WT_STAT_CONN_FILE_OPEN 1171 /*! connection: memory allocations */ -#define WT_STAT_CONN_MEMORY_ALLOCATION 1169 +#define WT_STAT_CONN_MEMORY_ALLOCATION 1172 /*! connection: memory frees */ -#define WT_STAT_CONN_MEMORY_FREE 1170 +#define WT_STAT_CONN_MEMORY_FREE 1173 /*! connection: memory re-allocations */ -#define WT_STAT_CONN_MEMORY_GROW 1171 +#define WT_STAT_CONN_MEMORY_GROW 1174 /*! connection: pthread mutex condition wait calls */ -#define WT_STAT_CONN_COND_WAIT 1172 +#define WT_STAT_CONN_COND_WAIT 1175 /*! connection: pthread mutex shared lock read-lock calls */ -#define WT_STAT_CONN_RWLOCK_READ 1173 +#define WT_STAT_CONN_RWLOCK_READ 1176 /*! connection: pthread mutex shared lock write-lock calls */ -#define WT_STAT_CONN_RWLOCK_WRITE 1174 +#define WT_STAT_CONN_RWLOCK_WRITE 1177 /*! connection: total fsync I/Os */ -#define WT_STAT_CONN_FSYNC_IO 1175 +#define WT_STAT_CONN_FSYNC_IO 1178 /*! connection: total read I/Os */ -#define WT_STAT_CONN_READ_IO 1176 +#define WT_STAT_CONN_READ_IO 1179 /*! connection: total write I/Os */ -#define WT_STAT_CONN_WRITE_IO 1177 +#define WT_STAT_CONN_WRITE_IO 1180 /*! cursor: cached cursor count */ -#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1178 +#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1181 /*! cursor: cursor bulk loaded cursor insert calls */ -#define WT_STAT_CONN_CURSOR_INSERT_BULK 1179 +#define WT_STAT_CONN_CURSOR_INSERT_BULK 1182 /*! cursor: cursor close calls that result in cache */ -#define WT_STAT_CONN_CURSOR_CACHE 1180 +#define WT_STAT_CONN_CURSOR_CACHE 1183 /*! cursor: cursor create calls */ -#define WT_STAT_CONN_CURSOR_CREATE 1181 +#define WT_STAT_CONN_CURSOR_CREATE 1184 /*! cursor: cursor insert calls */ -#define WT_STAT_CONN_CURSOR_INSERT 1182 +#define WT_STAT_CONN_CURSOR_INSERT 1185 /*! cursor: cursor insert key and value bytes */ -#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1183 +#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1186 /*! cursor: cursor modify calls */ -#define WT_STAT_CONN_CURSOR_MODIFY 1184 +#define WT_STAT_CONN_CURSOR_MODIFY 1187 /*! cursor: cursor modify key and value bytes affected */ -#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1185 +#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1188 /*! cursor: cursor modify value bytes modified */ -#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1186 +#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1189 /*! cursor: cursor next calls */ -#define WT_STAT_CONN_CURSOR_NEXT 1187 +#define WT_STAT_CONN_CURSOR_NEXT 1190 /*! cursor: cursor operation restarted */ -#define WT_STAT_CONN_CURSOR_RESTART 1188 +#define WT_STAT_CONN_CURSOR_RESTART 1191 /*! cursor: cursor prev calls */ -#define WT_STAT_CONN_CURSOR_PREV 1189 +#define WT_STAT_CONN_CURSOR_PREV 1192 /*! cursor: cursor remove calls */ -#define WT_STAT_CONN_CURSOR_REMOVE 1190 +#define WT_STAT_CONN_CURSOR_REMOVE 1193 /*! cursor: cursor remove key bytes removed */ -#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1191 +#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1194 /*! cursor: cursor reserve calls */ -#define WT_STAT_CONN_CURSOR_RESERVE 1192 +#define WT_STAT_CONN_CURSOR_RESERVE 1195 /*! cursor: cursor reset calls */ -#define WT_STAT_CONN_CURSOR_RESET 1193 +#define WT_STAT_CONN_CURSOR_RESET 1196 /*! cursor: cursor search calls */ -#define WT_STAT_CONN_CURSOR_SEARCH 1194 +#define WT_STAT_CONN_CURSOR_SEARCH 1197 /*! cursor: cursor search near calls */ -#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1195 +#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1198 /*! cursor: cursor sweep buckets */ -#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1196 +#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1199 /*! cursor: cursor sweep cursors closed */ -#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1197 +#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1200 /*! cursor: cursor sweep cursors examined */ -#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1198 +#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1201 /*! cursor: cursor sweeps */ -#define WT_STAT_CONN_CURSOR_SWEEP 1199 +#define WT_STAT_CONN_CURSOR_SWEEP 1202 /*! cursor: cursor truncate calls */ -#define WT_STAT_CONN_CURSOR_TRUNCATE 1200 +#define WT_STAT_CONN_CURSOR_TRUNCATE 1203 /*! cursor: cursor update calls */ -#define WT_STAT_CONN_CURSOR_UPDATE 1201 +#define WT_STAT_CONN_CURSOR_UPDATE 1204 /*! cursor: cursor update key and value bytes */ -#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1202 +#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1205 /*! cursor: cursor update value size change */ -#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1203 +#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1206 /*! cursor: cursors reused from cache */ -#define WT_STAT_CONN_CURSOR_REOPEN 1204 +#define WT_STAT_CONN_CURSOR_REOPEN 1207 /*! cursor: open cursor count */ -#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1205 +#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1208 /*! data-handle: connection data handle size */ -#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1206 +#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1209 /*! data-handle: connection data handles currently active */ -#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1207 +#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1210 /*! data-handle: connection sweep candidate became referenced */ -#define WT_STAT_CONN_DH_SWEEP_REF 1208 +#define WT_STAT_CONN_DH_SWEEP_REF 1211 /*! data-handle: connection sweep dhandles closed */ -#define WT_STAT_CONN_DH_SWEEP_CLOSE 1209 +#define WT_STAT_CONN_DH_SWEEP_CLOSE 1212 /*! data-handle: connection sweep dhandles removed from hash list */ -#define WT_STAT_CONN_DH_SWEEP_REMOVE 1210 +#define WT_STAT_CONN_DH_SWEEP_REMOVE 1213 /*! data-handle: connection sweep time-of-death sets */ -#define WT_STAT_CONN_DH_SWEEP_TOD 1211 +#define WT_STAT_CONN_DH_SWEEP_TOD 1214 /*! data-handle: connection sweeps */ -#define WT_STAT_CONN_DH_SWEEPS 1212 +#define WT_STAT_CONN_DH_SWEEPS 1215 /*! data-handle: session dhandles swept */ -#define WT_STAT_CONN_DH_SESSION_HANDLES 1213 +#define WT_STAT_CONN_DH_SESSION_HANDLES 1216 /*! data-handle: session sweep attempts */ -#define WT_STAT_CONN_DH_SESSION_SWEEPS 1214 +#define WT_STAT_CONN_DH_SESSION_SWEEPS 1217 /*! history: history pages added for eviction during garbage collection */ -#define WT_STAT_CONN_HS_GC_PAGES_EVICT 1215 +#define WT_STAT_CONN_HS_GC_PAGES_EVICT 1218 /*! history: history pages removed for garbage collection */ -#define WT_STAT_CONN_HS_GC_PAGES_REMOVED 1216 +#define WT_STAT_CONN_HS_GC_PAGES_REMOVED 1219 /*! history: history pages visited for garbage collection */ -#define WT_STAT_CONN_HS_GC_PAGES_VISITED 1217 +#define WT_STAT_CONN_HS_GC_PAGES_VISITED 1220 /*! lock: checkpoint lock acquisitions */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1218 +#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1221 /*! lock: checkpoint lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1219 +#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1222 /*! lock: checkpoint lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1220 +#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1223 /*! lock: dhandle lock application thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1221 +#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1224 /*! lock: dhandle lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1222 +#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1225 /*! lock: dhandle read lock acquisitions */ -#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1223 +#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1226 /*! lock: dhandle write lock acquisitions */ -#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1224 +#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1227 /*! * lock: durable timestamp queue lock application thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1225 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_APPLICATION 1228 /*! * lock: durable timestamp queue lock internal thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1226 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WAIT_INTERNAL 1229 /*! lock: durable timestamp queue read lock acquisitions */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1227 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_READ_COUNT 1230 /*! lock: durable timestamp queue write lock acquisitions */ -#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1228 +#define WT_STAT_CONN_LOCK_DURABLE_TIMESTAMP_WRITE_COUNT 1231 /*! lock: metadata lock acquisitions */ -#define WT_STAT_CONN_LOCK_METADATA_COUNT 1229 +#define WT_STAT_CONN_LOCK_METADATA_COUNT 1232 /*! lock: metadata lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1230 +#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1233 /*! lock: metadata lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1231 +#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1234 /*! * lock: read timestamp queue lock application thread time waiting * (usecs) */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1232 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1235 /*! lock: read timestamp queue lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1233 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1236 /*! lock: read timestamp queue read lock acquisitions */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1234 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1237 /*! lock: read timestamp queue write lock acquisitions */ -#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1235 +#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1238 /*! lock: schema lock acquisitions */ -#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1236 +#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1239 /*! lock: schema lock application thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1237 +#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1240 /*! lock: schema lock internal thread wait time (usecs) */ -#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1238 +#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1241 /*! * lock: table lock application thread time waiting for the table lock * (usecs) */ -#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1239 +#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1242 /*! * lock: table lock internal thread time waiting for the table lock * (usecs) */ -#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1240 +#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1243 /*! lock: table read lock acquisitions */ -#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1241 +#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1244 /*! lock: table write lock acquisitions */ -#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1242 +#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1245 /*! lock: txn global lock application thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1243 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1246 /*! lock: txn global lock internal thread time waiting (usecs) */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1244 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1247 /*! lock: txn global read lock acquisitions */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1245 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1248 /*! lock: txn global write lock acquisitions */ -#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1246 +#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1249 /*! log: busy returns attempting to switch slots */ -#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1247 +#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1250 /*! log: force archive time sleeping (usecs) */ -#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1248 +#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1251 /*! log: log bytes of payload data */ -#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1249 +#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1252 /*! log: log bytes written */ -#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1250 +#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1253 /*! log: log files manually zero-filled */ -#define WT_STAT_CONN_LOG_ZERO_FILLS 1251 +#define WT_STAT_CONN_LOG_ZERO_FILLS 1254 /*! log: log flush operations */ -#define WT_STAT_CONN_LOG_FLUSH 1252 +#define WT_STAT_CONN_LOG_FLUSH 1255 /*! log: log force write operations */ -#define WT_STAT_CONN_LOG_FORCE_WRITE 1253 +#define WT_STAT_CONN_LOG_FORCE_WRITE 1256 /*! log: log force write operations skipped */ -#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1254 +#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1257 /*! log: log records compressed */ -#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1255 +#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1258 /*! log: log records not compressed */ -#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1256 +#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1259 /*! log: log records too small to compress */ -#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1257 +#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1260 /*! log: log release advances write LSN */ -#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1258 +#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1261 /*! log: log scan operations */ -#define WT_STAT_CONN_LOG_SCANS 1259 +#define WT_STAT_CONN_LOG_SCANS 1262 /*! log: log scan records requiring two reads */ -#define WT_STAT_CONN_LOG_SCAN_REREADS 1260 +#define WT_STAT_CONN_LOG_SCAN_REREADS 1263 /*! log: log server thread advances write LSN */ -#define WT_STAT_CONN_LOG_WRITE_LSN 1261 +#define WT_STAT_CONN_LOG_WRITE_LSN 1264 /*! log: log server thread write LSN walk skipped */ -#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1262 +#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1265 /*! log: log sync operations */ -#define WT_STAT_CONN_LOG_SYNC 1263 +#define WT_STAT_CONN_LOG_SYNC 1266 /*! log: log sync time duration (usecs) */ -#define WT_STAT_CONN_LOG_SYNC_DURATION 1264 +#define WT_STAT_CONN_LOG_SYNC_DURATION 1267 /*! log: log sync_dir operations */ -#define WT_STAT_CONN_LOG_SYNC_DIR 1265 +#define WT_STAT_CONN_LOG_SYNC_DIR 1268 /*! log: log sync_dir time duration (usecs) */ -#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1266 +#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1269 /*! log: log write operations */ -#define WT_STAT_CONN_LOG_WRITES 1267 +#define WT_STAT_CONN_LOG_WRITES 1270 /*! log: logging bytes consolidated */ -#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1268 +#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1271 /*! log: maximum log file size */ -#define WT_STAT_CONN_LOG_MAX_FILESIZE 1269 +#define WT_STAT_CONN_LOG_MAX_FILESIZE 1272 /*! log: number of pre-allocated log files to create */ -#define WT_STAT_CONN_LOG_PREALLOC_MAX 1270 +#define WT_STAT_CONN_LOG_PREALLOC_MAX 1273 /*! log: pre-allocated log files not ready and missed */ -#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1271 +#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1274 /*! log: pre-allocated log files prepared */ -#define WT_STAT_CONN_LOG_PREALLOC_FILES 1272 +#define WT_STAT_CONN_LOG_PREALLOC_FILES 1275 /*! log: pre-allocated log files used */ -#define WT_STAT_CONN_LOG_PREALLOC_USED 1273 +#define WT_STAT_CONN_LOG_PREALLOC_USED 1276 /*! log: records processed by log scan */ -#define WT_STAT_CONN_LOG_SCAN_RECORDS 1274 +#define WT_STAT_CONN_LOG_SCAN_RECORDS 1277 /*! log: slot close lost race */ -#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1275 +#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1278 /*! log: slot close unbuffered waits */ -#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1276 +#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1279 /*! log: slot closures */ -#define WT_STAT_CONN_LOG_SLOT_CLOSES 1277 +#define WT_STAT_CONN_LOG_SLOT_CLOSES 1280 /*! log: slot join atomic update races */ -#define WT_STAT_CONN_LOG_SLOT_RACES 1278 +#define WT_STAT_CONN_LOG_SLOT_RACES 1281 /*! log: slot join calls atomic updates raced */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1279 +#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1282 /*! log: slot join calls did not yield */ -#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1280 +#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1283 /*! log: slot join calls found active slot closed */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1281 +#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1284 /*! log: slot join calls slept */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1282 +#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1285 /*! log: slot join calls yielded */ -#define WT_STAT_CONN_LOG_SLOT_YIELD 1283 +#define WT_STAT_CONN_LOG_SLOT_YIELD 1286 /*! log: slot join found active slot closed */ -#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1284 +#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1287 /*! log: slot joins yield time (usecs) */ -#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1285 +#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1288 /*! log: slot transitions unable to find free slot */ -#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1286 +#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1289 /*! log: slot unbuffered writes */ -#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1287 +#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1290 /*! log: total in-memory size of compressed records */ -#define WT_STAT_CONN_LOG_COMPRESS_MEM 1288 +#define WT_STAT_CONN_LOG_COMPRESS_MEM 1291 /*! log: total log buffer size */ -#define WT_STAT_CONN_LOG_BUFFER_SIZE 1289 +#define WT_STAT_CONN_LOG_BUFFER_SIZE 1292 /*! log: total size of compressed records */ -#define WT_STAT_CONN_LOG_COMPRESS_LEN 1290 +#define WT_STAT_CONN_LOG_COMPRESS_LEN 1293 /*! log: written slots coalesced */ -#define WT_STAT_CONN_LOG_SLOT_COALESCED 1291 +#define WT_STAT_CONN_LOG_SLOT_COALESCED 1294 /*! log: yields waiting for previous log file close */ -#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1292 +#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1295 /*! perf: file system read latency histogram (bucket 1) - 10-49ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1293 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1296 /*! perf: file system read latency histogram (bucket 2) - 50-99ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1294 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1297 /*! perf: file system read latency histogram (bucket 3) - 100-249ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1295 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1298 /*! perf: file system read latency histogram (bucket 4) - 250-499ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1296 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1299 /*! perf: file system read latency histogram (bucket 5) - 500-999ms */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1297 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1300 /*! perf: file system read latency histogram (bucket 6) - 1000ms+ */ -#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1298 +#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1301 /*! perf: file system write latency histogram (bucket 1) - 10-49ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1299 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1302 /*! perf: file system write latency histogram (bucket 2) - 50-99ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1300 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1303 /*! perf: file system write latency histogram (bucket 3) - 100-249ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1301 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1304 /*! perf: file system write latency histogram (bucket 4) - 250-499ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1302 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1305 /*! perf: file system write latency histogram (bucket 5) - 500-999ms */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1303 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1306 /*! perf: file system write latency histogram (bucket 6) - 1000ms+ */ -#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1304 +#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1307 /*! perf: operation read latency histogram (bucket 1) - 100-249us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1305 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1308 /*! perf: operation read latency histogram (bucket 2) - 250-499us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1306 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1309 /*! perf: operation read latency histogram (bucket 3) - 500-999us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1307 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1310 /*! perf: operation read latency histogram (bucket 4) - 1000-9999us */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1308 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1311 /*! perf: operation read latency histogram (bucket 5) - 10000us+ */ -#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1309 +#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1312 /*! perf: operation write latency histogram (bucket 1) - 100-249us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1310 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1313 /*! perf: operation write latency histogram (bucket 2) - 250-499us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1311 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1314 /*! perf: operation write latency histogram (bucket 3) - 500-999us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1312 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1315 /*! perf: operation write latency histogram (bucket 4) - 1000-9999us */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1313 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1316 /*! perf: operation write latency histogram (bucket 5) - 10000us+ */ -#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1314 +#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1317 /*! reconciliation: fast-path pages deleted */ -#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1315 +#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1318 /*! reconciliation: page reconciliation calls */ -#define WT_STAT_CONN_REC_PAGES 1316 +#define WT_STAT_CONN_REC_PAGES 1319 /*! reconciliation: page reconciliation calls for eviction */ -#define WT_STAT_CONN_REC_PAGES_EVICTION 1317 +#define WT_STAT_CONN_REC_PAGES_EVICTION 1320 /*! * reconciliation: page reconciliation calls that resulted in values with * prepared transaction metadata */ -#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1318 +#define WT_STAT_CONN_REC_PAGES_WITH_PREPARE 1321 /*! * reconciliation: page reconciliation calls that resulted in values with * timestamps */ -#define WT_STAT_CONN_REC_PAGES_WITH_TS 1319 +#define WT_STAT_CONN_REC_PAGES_WITH_TS 1322 /*! * reconciliation: page reconciliation calls that resulted in values with * transaction ids */ -#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1320 +#define WT_STAT_CONN_REC_PAGES_WITH_TXN 1323 /*! reconciliation: pages deleted */ -#define WT_STAT_CONN_REC_PAGE_DELETE 1321 +#define WT_STAT_CONN_REC_PAGE_DELETE 1324 /*! reconciliation: split bytes currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1322 +#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1325 /*! reconciliation: split objects currently awaiting free */ -#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1323 +#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1326 /*! session: open session count */ -#define WT_STAT_CONN_SESSION_OPEN 1324 +#define WT_STAT_CONN_SESSION_OPEN 1327 /*! session: session query timestamp calls */ -#define WT_STAT_CONN_SESSION_QUERY_TS 1325 +#define WT_STAT_CONN_SESSION_QUERY_TS 1328 /*! session: table alter failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1326 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1329 /*! session: table alter successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1327 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1330 /*! session: table alter unchanged and skipped */ -#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1328 +#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1331 /*! session: table compact failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1329 +#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1332 /*! session: table compact successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1330 +#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1333 /*! session: table create failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1331 +#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1334 /*! session: table create successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1332 +#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1335 /*! session: table drop failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1333 +#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1336 /*! session: table drop successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1334 +#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1337 /*! session: table import failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_IMPORT_FAIL 1335 +#define WT_STAT_CONN_SESSION_TABLE_IMPORT_FAIL 1338 /*! session: table import successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_IMPORT_SUCCESS 1336 +#define WT_STAT_CONN_SESSION_TABLE_IMPORT_SUCCESS 1339 /*! session: table rebalance failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1337 +#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1340 /*! session: table rebalance successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1338 +#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1341 /*! session: table rename failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1339 +#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1342 /*! session: table rename successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1340 +#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1343 /*! session: table salvage failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1341 +#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1344 /*! session: table salvage successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1342 +#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1345 /*! session: table truncate failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1343 +#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1346 /*! session: table truncate successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1344 +#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1347 /*! session: table verify failed calls */ -#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1345 +#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1348 /*! session: table verify successful calls */ -#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1346 +#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1349 /*! thread-state: active filesystem fsync calls */ -#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1347 +#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1350 /*! thread-state: active filesystem read calls */ -#define WT_STAT_CONN_THREAD_READ_ACTIVE 1348 +#define WT_STAT_CONN_THREAD_READ_ACTIVE 1351 /*! thread-state: active filesystem write calls */ -#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1349 +#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1352 /*! thread-yield: application thread time evicting (usecs) */ -#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1350 +#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1353 /*! thread-yield: application thread time waiting for cache (usecs) */ -#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1351 +#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1354 /*! * thread-yield: connection close blocked waiting for transaction state * stabilization */ -#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1352 +#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1355 /*! thread-yield: connection close yielded for lsm manager shutdown */ -#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1353 +#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1356 /*! thread-yield: data handle lock yielded */ -#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1354 +#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1357 /*! * thread-yield: get reference for page index and slot time sleeping * (usecs) */ -#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1355 +#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1358 /*! thread-yield: log server sync yielded for log write */ -#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1356 +#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1359 /*! thread-yield: page access yielded due to prepare state change */ -#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1357 +#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1360 /*! thread-yield: page acquire busy blocked */ -#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1358 +#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1361 /*! thread-yield: page acquire eviction blocked */ -#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1359 +#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1362 /*! thread-yield: page acquire locked blocked */ -#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1360 +#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1363 /*! thread-yield: page acquire read blocked */ -#define WT_STAT_CONN_PAGE_READ_BLOCKED 1361 +#define WT_STAT_CONN_PAGE_READ_BLOCKED 1364 /*! thread-yield: page acquire time sleeping (usecs) */ -#define WT_STAT_CONN_PAGE_SLEEP 1362 +#define WT_STAT_CONN_PAGE_SLEEP 1365 /*! * thread-yield: page delete rollback time sleeping for state change * (usecs) */ -#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1363 +#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1366 /*! thread-yield: page reconciliation yielded due to child modification */ -#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1364 +#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1367 /*! transaction: Number of prepared updates */ -#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COUNT 1365 +#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COUNT 1368 /*! transaction: durable timestamp queue entries walked */ -#define WT_STAT_CONN_TXN_DURABLE_QUEUE_WALKED 1366 +#define WT_STAT_CONN_TXN_DURABLE_QUEUE_WALKED 1369 /*! transaction: durable timestamp queue insert to empty */ -#define WT_STAT_CONN_TXN_DURABLE_QUEUE_EMPTY 1367 +#define WT_STAT_CONN_TXN_DURABLE_QUEUE_EMPTY 1370 /*! transaction: durable timestamp queue inserts to head */ -#define WT_STAT_CONN_TXN_DURABLE_QUEUE_HEAD 1368 +#define WT_STAT_CONN_TXN_DURABLE_QUEUE_HEAD 1371 /*! transaction: durable timestamp queue inserts total */ -#define WT_STAT_CONN_TXN_DURABLE_QUEUE_INSERTS 1369 +#define WT_STAT_CONN_TXN_DURABLE_QUEUE_INSERTS 1372 /*! transaction: durable timestamp queue length */ -#define WT_STAT_CONN_TXN_DURABLE_QUEUE_LEN 1370 +#define WT_STAT_CONN_TXN_DURABLE_QUEUE_LEN 1373 /*! transaction: prepared transactions */ -#define WT_STAT_CONN_TXN_PREPARE 1371 +#define WT_STAT_CONN_TXN_PREPARE 1374 /*! transaction: prepared transactions committed */ -#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1372 +#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1375 /*! transaction: prepared transactions currently active */ -#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1373 +#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1376 /*! transaction: prepared transactions rolled back */ -#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1374 +#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1377 /*! transaction: query timestamp calls */ -#define WT_STAT_CONN_TXN_QUERY_TS 1375 +#define WT_STAT_CONN_TXN_QUERY_TS 1378 /*! transaction: read timestamp queue entries walked */ -#define WT_STAT_CONN_TXN_READ_QUEUE_WALKED 1376 +#define WT_STAT_CONN_TXN_READ_QUEUE_WALKED 1379 /*! transaction: read timestamp queue insert to empty */ -#define WT_STAT_CONN_TXN_READ_QUEUE_EMPTY 1377 +#define WT_STAT_CONN_TXN_READ_QUEUE_EMPTY 1380 /*! transaction: read timestamp queue inserts to head */ -#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1378 +#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1381 /*! transaction: read timestamp queue inserts total */ -#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1379 +#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1382 /*! transaction: read timestamp queue length */ -#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1380 +#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1383 /*! transaction: rollback to stable calls */ -#define WT_STAT_CONN_TXN_RTS 1381 +#define WT_STAT_CONN_TXN_RTS 1384 /*! transaction: rollback to stable keys removed */ -#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1382 +#define WT_STAT_CONN_TXN_RTS_KEYS_REMOVED 1385 /*! transaction: rollback to stable keys restored */ -#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1383 +#define WT_STAT_CONN_TXN_RTS_KEYS_RESTORED 1386 /*! transaction: rollback to stable pages visited */ -#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1384 +#define WT_STAT_CONN_TXN_RTS_PAGES_VISITED 1387 /*! transaction: rollback to stable updates aborted */ -#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1385 +#define WT_STAT_CONN_TXN_RTS_UPD_ABORTED 1388 /*! transaction: rollback to stable updates removed from history store */ -#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1386 +#define WT_STAT_CONN_TXN_RTS_HS_REMOVED 1389 /*! transaction: set timestamp calls */ -#define WT_STAT_CONN_TXN_SET_TS 1387 +#define WT_STAT_CONN_TXN_SET_TS 1390 /*! transaction: set timestamp durable calls */ -#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1388 +#define WT_STAT_CONN_TXN_SET_TS_DURABLE 1391 /*! transaction: set timestamp durable updates */ -#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1389 +#define WT_STAT_CONN_TXN_SET_TS_DURABLE_UPD 1392 /*! transaction: set timestamp oldest calls */ -#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1390 +#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1393 /*! transaction: set timestamp oldest updates */ -#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1391 +#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1394 /*! transaction: set timestamp stable calls */ -#define WT_STAT_CONN_TXN_SET_TS_STABLE 1392 +#define WT_STAT_CONN_TXN_SET_TS_STABLE 1395 /*! transaction: set timestamp stable updates */ -#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1393 +#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1396 /*! transaction: transaction begins */ -#define WT_STAT_CONN_TXN_BEGIN 1394 +#define WT_STAT_CONN_TXN_BEGIN 1397 /*! transaction: transaction checkpoint currently running */ -#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1395 +#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1398 /*! transaction: transaction checkpoint generation */ -#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1396 +#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1399 /*! * transaction: transaction checkpoint history store file duration * (usecs) */ -#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1397 +#define WT_STAT_CONN_TXN_HS_CKPT_DURATION 1400 /*! transaction: transaction checkpoint max time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1398 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1401 /*! transaction: transaction checkpoint min time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1399 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1402 /*! transaction: transaction checkpoint most recent time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1400 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1403 /*! transaction: transaction checkpoint prepare currently running */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1401 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RUNNING 1404 /*! transaction: transaction checkpoint prepare max time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1402 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MAX 1405 /*! transaction: transaction checkpoint prepare min time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1403 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_MIN 1406 /*! transaction: transaction checkpoint prepare most recent time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1404 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_RECENT 1407 /*! transaction: transaction checkpoint prepare total time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1405 +#define WT_STAT_CONN_TXN_CHECKPOINT_PREP_TOTAL 1408 /*! transaction: transaction checkpoint scrub dirty target */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1406 +#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1409 /*! transaction: transaction checkpoint scrub time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1407 +#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1410 /*! transaction: transaction checkpoint total time (msecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1408 +#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1411 /*! transaction: transaction checkpoints */ -#define WT_STAT_CONN_TXN_CHECKPOINT 1409 +#define WT_STAT_CONN_TXN_CHECKPOINT 1412 /*! * transaction: transaction checkpoints skipped because database was * clean */ -#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1410 +#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1413 /*! transaction: transaction failures due to history store */ -#define WT_STAT_CONN_TXN_FAIL_CACHE 1411 +#define WT_STAT_CONN_TXN_FAIL_CACHE 1414 /*! * transaction: transaction fsync calls for checkpoint after allocating * the transaction ID */ -#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1412 +#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1415 /*! * transaction: transaction fsync duration for checkpoint after * allocating the transaction ID (usecs) */ -#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1413 +#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1416 /*! transaction: transaction range of IDs currently pinned */ -#define WT_STAT_CONN_TXN_PINNED_RANGE 1414 +#define WT_STAT_CONN_TXN_PINNED_RANGE 1417 /*! transaction: transaction range of IDs currently pinned by a checkpoint */ -#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1415 +#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1418 /*! transaction: transaction range of timestamps currently pinned */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1416 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1419 /*! transaction: transaction range of timestamps pinned by a checkpoint */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1417 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1420 /*! * transaction: transaction range of timestamps pinned by the oldest * active read timestamp */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1418 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1421 /*! * transaction: transaction range of timestamps pinned by the oldest * timestamp */ -#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1419 +#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1422 /*! transaction: transaction read timestamp of the oldest active reader */ -#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1420 +#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1423 /*! transaction: transaction sync calls */ -#define WT_STAT_CONN_TXN_SYNC 1421 +#define WT_STAT_CONN_TXN_SYNC 1424 /*! transaction: transactions committed */ -#define WT_STAT_CONN_TXN_COMMIT 1422 +#define WT_STAT_CONN_TXN_COMMIT 1425 /*! transaction: transactions rolled back */ -#define WT_STAT_CONN_TXN_ROLLBACK 1423 +#define WT_STAT_CONN_TXN_ROLLBACK 1426 /*! transaction: update conflicts */ -#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1424 +#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1427 /*! * @} diff --git a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c index df658c85a17..9e9dd627be2 100644 --- a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c +++ b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c @@ -15,9 +15,8 @@ static inline bool __rec_update_stable(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_UPDATE *upd) { - return (F_ISSET(r, WT_REC_VISIBLE_ALL) ? - __wt_txn_upd_visible_all(session, upd) : - __wt_txn_upd_visible_type(session, upd) == WT_VISIBLE_TRUE && + return (F_ISSET(r, WT_REC_VISIBLE_ALL) ? __wt_txn_upd_visible_all(session, upd) : + __wt_txn_upd_visible(session, upd) && __wt_txn_visible(session, upd->txnid, upd->durable_ts)); } diff --git a/src/third_party/wiredtiger/src/support/modify.c b/src/third_party/wiredtiger/src/support/modify.c index 0197cf7e539..e428961dfc3 100644 --- a/src/third_party/wiredtiger/src/support/modify.c +++ b/src/third_party/wiredtiger/src/support/modify.c @@ -535,9 +535,8 @@ __wt_modify_reconstruct_from_upd_list( cursor = &cbt->iface; /* While we have a pointer to our original modify, grab this information. */ - upd_value->durable_ts = upd->durable_ts; - upd_value->txnid = upd->txnid; - upd_value->prepare_state = upd->prepare_state; + upd_value->tw.durable_start_ts = upd->durable_ts; + upd_value->tw.start_txn = upd->txnid; /* Construct full update */ __wt_modify_vector_init(session, &modifies); diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c index b8e154e110b..7be8e90982f 100644 --- a/src/third_party/wiredtiger/src/support/stat.c +++ b/src/third_party/wiredtiger/src/support/stat.c @@ -685,6 +685,12 @@ static const char *const __stats_connection_desc[] = { "cache: eviction worker thread stable number", "cache: files with active eviction walks", "cache: files with new eviction walks started", "cache: force re-tuning of eviction workers once in a while", + "cache: forced eviction - history store pages failed to evict while session has history store " + "cursor open", + "cache: forced eviction - history store pages selected while session has history store cursor " + "open", + "cache: forced eviction - history store pages successfully evicted while session has history " + "store cursor open", "cache: forced eviction - pages evicted that were clean count", "cache: forced eviction - pages evicted that were clean time (usecs)", "cache: forced eviction - pages evicted that were dirty count", @@ -1046,6 +1052,9 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats) /* not clearing cache_eviction_walks_active */ stats->cache_eviction_walks_started = 0; stats->cache_eviction_force_retune = 0; + stats->cache_eviction_force_hs_fail = 0; + stats->cache_eviction_force_hs = 0; + stats->cache_eviction_force_hs_success = 0; stats->cache_eviction_force_clean = 0; stats->cache_eviction_force_clean_time = 0; stats->cache_eviction_force_dirty = 0; @@ -1493,6 +1502,9 @@ __wt_stat_connection_aggregate(WT_CONNECTION_STATS **from, WT_CONNECTION_STATS * to->cache_eviction_walks_active += WT_STAT_READ(from, cache_eviction_walks_active); to->cache_eviction_walks_started += WT_STAT_READ(from, cache_eviction_walks_started); to->cache_eviction_force_retune += WT_STAT_READ(from, cache_eviction_force_retune); + to->cache_eviction_force_hs_fail += WT_STAT_READ(from, cache_eviction_force_hs_fail); + to->cache_eviction_force_hs += WT_STAT_READ(from, cache_eviction_force_hs); + to->cache_eviction_force_hs_success += WT_STAT_READ(from, cache_eviction_force_hs_success); to->cache_eviction_force_clean += WT_STAT_READ(from, cache_eviction_force_clean); to->cache_eviction_force_clean_time += WT_STAT_READ(from, cache_eviction_force_clean_time); to->cache_eviction_force_dirty += WT_STAT_READ(from, cache_eviction_force_dirty); diff --git a/src/third_party/wiredtiger/src/txn/txn.c b/src/third_party/wiredtiger/src/txn/txn.c index 1ca0051794a..769e54225a5 100644 --- a/src/third_party/wiredtiger/src/txn/txn.c +++ b/src/third_party/wiredtiger/src/txn/txn.c @@ -666,9 +666,9 @@ __txn_append_hs_record(WT_SESSION_IMPL *session, WT_CURSOR *hs_cursor, WT_ITEM * goto done; WT_ERR(__wt_upd_alloc(session, hs_value, WT_UPDATE_STANDARD, &upd, &size)); - upd->txnid = hs_cbt->upd_value->txnid; - upd->durable_ts = durable_ts; - upd->start_ts = hs_start_ts; + upd->txnid = hs_cbt->upd_value->tw.start_txn; + upd->durable_ts = hs_cbt->upd_value->tw.durable_start_ts; + upd->start_ts = hs_cbt->upd_value->tw.start_ts; *fix_updp = upd; /* @@ -683,10 +683,9 @@ __txn_append_hs_record(WT_SESSION_IMPL *session, WT_CURSOR *hs_cursor, WT_ITEM * /* If the history store record has a valid stop time point, append it. */ if (hs_stop_durable_ts != WT_TS_MAX) { WT_ERR(__wt_upd_alloc(session, NULL, WT_UPDATE_TOMBSTONE, &tombstone, &size)); - tombstone->durable_ts = hs_stop_durable_ts; - /* FIXME: get the correct stop ts and txnid from the cell. */ - tombstone->start_ts = hs_stop_durable_ts; - tombstone->txnid = WT_TXN_NONE; + tombstone->durable_ts = hs_cbt->upd_value->tw.durable_stop_ts; + tombstone->start_ts = hs_cbt->upd_value->tw.stop_ts; + tombstone->txnid = hs_cbt->upd_value->tw.stop_txn; tombstone->next = upd; total_size += size; } else @@ -916,8 +915,11 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit, /* * Scan the history store for the given btree and key with maximum start timestamp to let - * the search point to the last version of the key. + * the search point to the last version of the key. We must ignore tombstone in the history + * store while retrieving the update from the history store to replace the update in the + * data store. */ + F_SET(hs_cursor, WT_CURSTD_IGNORE_TOMBSTONE); WT_ERR_NOTFOUND_OK( __wt_hs_cursor_position(session, hs_cursor, hs_btree_id, &op->u.op_row.key, WT_TS_MAX), true); @@ -999,8 +1001,10 @@ __txn_resolve_prepared_op(WT_SESSION_IMPL *session, WT_TXN_OP *op, bool commit, WT_ERR(__txn_fixup_prepared_update(session, hs_cursor, fix_upd, commit)); err: - if (hs_cursor != NULL) + if (hs_cursor != NULL) { + F_CLR(hs_cursor, WT_CURSTD_IGNORE_TOMBSTONE); ret = __wt_hs_cursor_close(session, session_flags, is_owner); + } if (!upd_appended) __wt_free(session, fix_upd); return (ret); diff --git a/src/third_party/wiredtiger/test/csuite/incr_backup/main.c b/src/third_party/wiredtiger/test/csuite/incr_backup/main.c index fe0e0677996..68a4e4b26d1 100644 --- a/src/third_party/wiredtiger/test/csuite/incr_backup/main.c +++ b/src/third_party/wiredtiger/test/csuite/incr_backup/main.c @@ -59,7 +59,7 @@ static void usage(void) WT_GCC_FUNC_DECL_ATTRIBUTE((noreturn)); static bool slow_incremental = false; static bool do_drop = true; -static bool do_rename = true; +static bool do_rename = false; #define VERBOSE(level, fmt, ...) \ do { \ diff --git a/src/third_party/wiredtiger/test/csuite/timestamp_abort/main.c b/src/third_party/wiredtiger/test/csuite/timestamp_abort/main.c index 1035764c5d1..89c141290a9 100644 --- a/src/third_party/wiredtiger/test/csuite/timestamp_abort/main.c +++ b/src/third_party/wiredtiger/test/csuite/timestamp_abort/main.c @@ -523,7 +523,7 @@ main(int argc, char *argv[]) WT_RAND_STATE rnd; WT_SESSION *session; pid_t pid; - uint64_t absent_coll, absent_local, absent_oplog, count, key, last_key; + uint64_t absent_coll, absent_local, absent_oplog, absent_shadow, count, key, last_key; uint64_t stable_fp, stable_val; uint32_t i, nth, timeout; int ch, status, ret; @@ -702,7 +702,7 @@ main(int argc, char *argv[]) } count = 0; - absent_coll = absent_local = absent_oplog = 0; + absent_coll = absent_local = absent_oplog = absent_shadow = 0; fatal = false; for (i = 0; i < nth; ++i) { initialize_rep(&c_rep[i]); @@ -773,6 +773,13 @@ main(int argc, char *argv[]) if (c_rep[i].first_miss == INVALID_KEY) c_rep[i].first_miss = key; c_rep[i].absent_key = key; + } else if ((ret = cur_shadow->search(cur_shadow)) != 0) { + if (ret != WT_NOTFOUND) + testutil_die(ret, "shadow search"); + else { + printf("%s: SHADOW no record with key %" PRIu64 "\n", fname, key); + absent_shadow++; + } } else if (c_rep[i].absent_key != INVALID_KEY && c_rep[i].exist_key == INVALID_KEY) { /* * If we get here we found a record that exists after absent records, a hole in our @@ -846,6 +853,10 @@ main(int argc, char *argv[]) printf("COLLECTION: %" PRIu64 " record(s) absent from %" PRIu64 "\n", absent_coll, count); fatal = true; } + if (!inmem && absent_shadow) { + printf("SHADOW: %" PRIu64 " record(s) absent from %" PRIu64 "\n", absent_shadow, count); + fatal = true; + } if (!inmem && absent_local) { printf("LOCAL: %" PRIu64 " record(s) absent from %" PRIu64 "\n", absent_local, count); fatal = true; diff --git a/src/third_party/wiredtiger/test/evergreen.yml b/src/third_party/wiredtiger/test/evergreen.yml index a07d563542a..14d5a06fbb8 100755 --- a/src/third_party/wiredtiger/test/evergreen.yml +++ b/src/third_party/wiredtiger/test/evergreen.yml @@ -2265,7 +2265,8 @@ buildvariants: - name: recovery-stress-test - name: format-stress-sanitizer-test - name: format-stress-sanitizer-smoke-test - - name: format-stress-sanitizer-lsm-test + # Temporarily disabled (WT-6255) + # - name: format-stress-sanitizer-lsm-test - name: split-stress-test - name: format-stress-test - name: format-stress-smoke-test diff --git a/src/third_party/wiredtiger/test/format/ops.c b/src/third_party/wiredtiger/test/format/ops.c index e7faddcbd1e..7d7a9b1fa21 100644 --- a/src/third_party/wiredtiger/test/format/ops.c +++ b/src/third_party/wiredtiger/test/format/ops.c @@ -524,7 +524,7 @@ prepare_transaction(TINFO *tinfo) longwait = mmrand(&tinfo->rnd, 0, 999); if (longwait < 10) { pause_ms = mmrand(&tinfo->rnd, 1, 10) << longwait; - __wt_sleep(0, pause_ms * WT_THOUSAND); + __wt_sleep(0, (uint64_t)pause_ms * WT_THOUSAND); } } return (ret); diff --git a/src/third_party/wiredtiger/test/suite/test_prepare09.py b/src/third_party/wiredtiger/test/suite/test_prepare09.py index 31e7756cc6e..3cff781a468 100644 --- a/src/third_party/wiredtiger/test/suite/test_prepare09.py +++ b/src/third_party/wiredtiger/test/suite/test_prepare09.py @@ -67,6 +67,11 @@ class test_prepare09(wttest.WiredTigerTestCase): self.assertEqual(self.session.prepare_transaction('prepare_timestamp=' + timestamp_str(3)), 0) self.session.rollback_transaction() + # Get the previous update onto disk. + for i in range(2, 10000): + cursor2[i] = value3 + cursor2.reset() + # Do a search, if we've aborted the update correct we won't have inserted a tombstone # and the original value will be visible to us. cursor.set_key(1) diff --git a/src/third_party/wiredtiger/test/suite/test_prepare10.py b/src/third_party/wiredtiger/test/suite/test_prepare10.py new file mode 100644 index 00000000000..7df96ffd2c0 --- /dev/null +++ b/src/third_party/wiredtiger/test/suite/test_prepare10.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python +# +# Public Domain 2014-2020 MongoDB, Inc. +# Public Domain 2008-2014 WiredTiger, Inc. +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +import fnmatch, os, shutil, time +from helper import copy_wiredtiger_home +import wiredtiger, wttest +from wtdataset import SimpleDataSet + +def timestamp_str(t): + return '%x' % t + +# test_prepare07.py +# Test to ensure prepared tombstones are properly aborted even when they are written +# to the data store. +class test_prepare07(wttest.WiredTigerTestCase): + # Force a small cache. + conn_config = 'cache_size=1MB' + session_config = 'isolation=snapshot' + + def updates(self, ds, uri, nrows, value, ts): + cursor = self.session.open_cursor(uri) + self.session.begin_transaction() + for i in range(1, nrows): + cursor.set_key(ds.key(i)) + cursor.set_value(value) + self.assertEquals(cursor.insert(), 0) + self.session.commit_transaction('commit_timestamp=' + timestamp_str(ts)) + cursor.close() + + def removes(self, ds, uri, nrows, ts): + cursor = self.session.open_cursor(uri) + self.session.begin_transaction() + for i in range(1, nrows): + cursor.set_key(ds.key(i)) + self.assertEquals(cursor.remove(), 0) + self.session.commit_transaction('commit_timestamp=' + timestamp_str(ts)) + cursor.close() + + def check(self, ds, uri, nrows, value, ts): + cursor = self.session.open_cursor(uri) + self.session.begin_transaction('ignore_prepare=true,read_timestamp=' + timestamp_str(ts)) + for i in range(1, nrows): + cursor.set_key(ds.key(i)) + self.assertEquals(cursor.search(), 0) + self.assertEquals(cursor.get_value(),value) + self.session.commit_transaction() + cursor.close() + + def check_not_found(self, ds, uri, nrows, ts): + cursor = self.session.open_cursor(uri) + self.session.begin_transaction('ignore_prepare=true,read_timestamp=' + timestamp_str(ts)) + for i in range(1, nrows): + cursor.set_key(ds.key(i)) + self.assertEquals(cursor.search(), wiredtiger.WT_NOTFOUND) + self.session.commit_transaction() + cursor.close() + + def test_prepare_rollback_retrieve_time_window(self): + # Create a small table. + uri = "table:test_prepare10" + nrows = 1000 + ds = SimpleDataSet(self, uri, 0, key_format="S", value_format='u') + ds.populate() + + value_a = b"aaaaa" * 100 + value_b = b"bbbbb" * 100 + value_c = b"ccccc" * 100 + + # Commit some updates along with a prepared update, which is not resolved. + self.conn.set_timestamp('oldest_timestamp=' + timestamp_str(10)) + self.conn.set_timestamp('stable_timestamp=' + timestamp_str(10)) + + # Initially load huge data + self.updates(ds, uri, nrows, value_a, 20) + # Add some more updates + self.updates(ds, uri, nrows, value_b, 30) + + # Checkpoint + self.session.checkpoint() + + # Validate that we do see the correct value. + session2 = self.setUpSessionOpen(self.conn) + cursor2 = session2.open_cursor(uri) + session2.begin_transaction() + for i in range(1, nrows): + cursor2.set_key(ds.key(i)) + self.assertEquals(cursor2.search(), 0) + self.assertEquals(cursor2.get_value(), value_b) + session2.commit_transaction() + + # Reset the cursor. + cursor2.reset() + session2.begin_transaction() + + # Remove all keys + self.removes(ds, uri, nrows, 40) + + # Validate that we do see the correct value. + session3 = self.setUpSessionOpen(self.conn) + cursor3 = session3.open_cursor(uri) + session3.begin_transaction() + for i in range(1, nrows): + cursor3.set_key(ds.key(i)) + self.assertEquals(cursor3.search(), wiredtiger.WT_NOTFOUND) + session3.commit_transaction() + + # Reset the cursor. + cursor3.reset() + session3.begin_transaction() + + # Remove the updates from a prepare session and and keep it open. + session_p = self.conn.open_session() + cursor_p = session_p.open_cursor(uri) + session_p.begin_transaction() + for i in range(1, nrows): + cursor_p.set_key(ds.key(i)) + cursor_p.set_value(value_c) + self.assertEquals(cursor_p.insert(), 0) + session_p.prepare_transaction('prepare_timestamp=' + timestamp_str(50)) + + self.check(ds, uri, nrows, value_a, 20) + self.check(ds, uri, nrows, value_b, 35) + self.check_not_found(ds, uri, nrows, 60) + + #rollback the prepared session + session_p.rollback_transaction() + + self.check(ds, uri, nrows, value_a, 20) + self.check(ds, uri, nrows, value_b, 35) + self.check_not_found(ds, uri, nrows, 60) + + # session2 still can see the value_b + for i in range(1, nrows): + cursor2.set_key(ds.key(i)) + self.assertEquals(cursor2.search(), 0) + self.assertEquals(cursor2.get_value(), value_b) + session2.commit_transaction() + + # session3 still can't see a value + for i in range(1, nrows): + cursor3.set_key(ds.key(i)) + self.assertEquals(cursor3.search(), wiredtiger.WT_NOTFOUND) + session3.commit_transaction() + + # close sessions. + cursor_p.close() + session_p.close() + cursor2.close() + session2.close() + cursor3.close() + session3.close() + self.session.close() + +if __name__ == '__main__': + wttest.run() |