summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Chen <luke.chen@mongodb.com>2020-05-19 16:40:28 +1000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-05-19 07:20:45 +0000
commite8cfc643a3d959896889046a47129684f5dbb89a (patch)
tree4981698805b98346fd401b888295441c856d291e
parent2fbd718e0ab222d4b6614c452b0241e325421395 (diff)
downloadmongo-e8cfc643a3d959896889046a47129684f5dbb89a.tar.gz
Import wiredtiger: 55d47c210ccb07a115c2e6f71ee90367c7c3ab77 from branch mongodb-4.4
ref: 32b5f903db..55d47c210c for: 4.5.1 WT-6170 Retrieve the original time window from the history store to replace an aborted prepared update WT-6225 Retry reading when the reader run concurrently with committing or rollbacking of prepared updates WT-6249 test_timestamp_abort should report all failing records before dying WT-6254 Statistics for force evicting history store pages while the session has history store cursor open WT-6255 Temporarily disable format-stress-sanitizer-lsm-test in Evergreen WT-6261 Turn off incremental backup rename testing WT-6265 Coverity: Integer overflow in test/format/ops.c
-rw-r--r--src/third_party/wiredtiger/dist/stat_data.py3
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c16
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c16
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_cursor.c2
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_page.c15
-rw-r--r--src/third_party/wiredtiger/src/history/hs.c47
-rw-r--r--src/third_party/wiredtiger/src/include/btmem.h4
-rw-r--r--src/third_party/wiredtiger/src/include/extern.h2
-rw-r--r--src/third_party/wiredtiger/src/include/stat.h3
-rw-r--r--src/third_party/wiredtiger/src/include/txn.i102
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in693
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_visibility.c5
-rw-r--r--src/third_party/wiredtiger/src/support/modify.c5
-rw-r--r--src/third_party/wiredtiger/src/support/stat.c12
-rw-r--r--src/third_party/wiredtiger/src/txn/txn.c22
-rw-r--r--src/third_party/wiredtiger/test/csuite/incr_backup/main.c2
-rw-r--r--src/third_party/wiredtiger/test/csuite/timestamp_abort/main.c15
-rwxr-xr-xsrc/third_party/wiredtiger/test/evergreen.yml3
-rw-r--r--src/third_party/wiredtiger/test/format/ops.c2
-rw-r--r--src/third_party/wiredtiger/test/suite/test_prepare09.py5
-rw-r--r--src/third_party/wiredtiger/test/suite/test_prepare10.py180
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()