summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src
diff options
context:
space:
mode:
authorLuke Chen <luke.chen@mongodb.com>2019-07-10 13:26:20 +1000
committerLuke Chen <luke.chen@mongodb.com>2019-07-10 13:26:20 +1000
commit1a50f90ec4418b0e2f9bdadb79ea49684911b0fb (patch)
tree37d119374d45e1f1a508cadf40b3a86ea7e31523 /src/third_party/wiredtiger/src
parent40b6fd725ccb0464644b1b9f75b113ebf7ed6a74 (diff)
downloadmongo-1a50f90ec4418b0e2f9bdadb79ea49684911b0fb.tar.gz
Import wiredtiger: 99e0760cc5f11440b21184874d8dd2ae5bde23d6 from branch mongodb-4.2
ref: d86b3a8a33..99e0760cc5 for: 4.2.0-rc3 WT-4502 Assertion checking hazard pointers on page discard is too strong WT-4733 Change test/format to do longer-term repeatable read testing WT-4743 Fix memory leaks and core dumps in page-split error handling WT-4786 Coverity: Invalid format specifiers in printf-like invocations WT-4792 Add stat to track pages queued for eviction after LRU sorting WT-4805 Modify error message verification for test_prepare04.py WT-4812 Fix the Python distribution script for Python3 changes WT-4818 Add debugging of bad read file descriptor when files are missing during recovery WT-4832 Change ordering on shutdown to close LSM and async threads earlier WT-4836 Lower scheduling frequency for endianness compatibility tests WT-4840 WT_CURSOR.modify must require explicit, snapshot-isolation transaction WT-4864 Coverity: Redundant NULL check WT-4866 Coverity: WT_SESSION.import can leak memory WT-4867 Skip assertion when reserved updates are seen WT-4882 Improve checkpoint performance when there are large metadata pages WT-4887 Skip read timestamp required assert during recovery WT-4888 Remove support for Berkeley DB WT-4891 WT_SESSION.verify memory allocation overrun WT-4892 Improve statistics about forced eviction WT-4893 Fix a race between internal page child-page eviction checks and cursors in the tree WT-4895 Fix debug eviction mode so it chooses skew more randomly WT-4898 Don't allow the eviction server to reconcile if it's busy WT-4910 Port Windows SConstruct to Python 3 WT-4918 LSM allocated mutexes leaked in readonly tests WT-4920 Add statistics tracking when eviction server is waiting for page transitions
Diffstat (limited to 'src/third_party/wiredtiger/src')
-rw-r--r--src/third_party/wiredtiger/src/async/async_api.c9
-rw-r--r--src/third_party/wiredtiger/src/block/block_ckpt.c2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c4
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_cursor.c13
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_discard.c48
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_split.c61
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_walk.c9
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_api.c47
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_handle.c8
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_open.c27
-rw-r--r--src/third_party/wiredtiger/src/cursor/cur_std.c11
-rw-r--r--src/third_party/wiredtiger/src/docs/checkpoint.dox12
-rw-r--r--src/third_party/wiredtiger/src/docs/custom-data-sources.dox6
-rw-r--r--src/third_party/wiredtiger/src/docs/spell.ok2
-rw-r--r--src/third_party/wiredtiger/src/docs/upgrading.dox13
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_lru.c2
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_page.c188
-rw-r--r--src/third_party/wiredtiger/src/include/btmem.h42
-rw-r--r--src/third_party/wiredtiger/src/include/btree.i7
-rw-r--r--src/third_party/wiredtiger/src/include/cache.h5
-rw-r--r--src/third_party/wiredtiger/src/include/cursor.i4
-rw-r--r--src/third_party/wiredtiger/src/include/extern.h4
-rw-r--r--src/third_party/wiredtiger/src/include/stat.h18
-rw-r--r--src/third_party/wiredtiger/src/include/txn.h1
-rw-r--r--src/third_party/wiredtiger/src/include/txn.i9
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in716
-rw-r--r--src/third_party/wiredtiger/src/lsm/lsm_manager.c6
-rw-r--r--src/third_party/wiredtiger/src/meta/meta_ckpt.c11
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_visibility.c10
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_write.c3
-rw-r--r--src/third_party/wiredtiger/src/session/session_api.c3
-rw-r--r--src/third_party/wiredtiger/src/support/hazard.c8
-rw-r--r--src/third_party/wiredtiger/src/support/stat.c70
-rw-r--r--src/third_party/wiredtiger/src/txn/txn.c56
35 files changed, 837 insertions, 602 deletions
diff --git a/src/third_party/wiredtiger/src/async/async_api.c b/src/third_party/wiredtiger/src/async/async_api.c
index e879067bbbb..9f9aa979139 100644
--- a/src/third_party/wiredtiger/src/async/async_api.c
+++ b/src/third_party/wiredtiger/src/async/async_api.c
@@ -345,7 +345,7 @@ __wt_async_reconfig(WT_SESSION_IMPL *session, const char *cfg[])
return (ret);
}
if (!conn->async_cfg && run) /* Case 2 */
- return (__async_start(session));
+ return (__wt_async_create(session, cfg));
if (!conn->async_cfg) /* Case 3 */
return (0);
@@ -578,22 +578,25 @@ __async_runtime_config(WT_ASYNC_OP_IMPL *op, const char *cfg[])
*/
int
__wt_async_new_op(WT_SESSION_IMPL *session, const char *uri,
- const char *config, const char *cfg[], WT_ASYNC_CALLBACK *cb,
- WT_ASYNC_OP_IMPL **opp)
+ const char *config, WT_ASYNC_CALLBACK *cb, WT_ASYNC_OP_IMPL **opp)
{
WT_ASYNC_OP_IMPL *op;
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
+ const char *cfg[] = { S2C(session)->cfg, NULL, NULL };
*opp = NULL;
conn = S2C(session);
if (!conn->async_cfg)
+ WT_RET(__wt_async_create(session, cfg));
+ if (!conn->async_cfg)
WT_RET_MSG(
session, ENOTSUP, "Asynchronous operations not configured");
op = NULL;
WT_ERR(__async_new_op_alloc(session, uri, config, &op));
+ cfg[1] = config;
WT_ERR(__async_runtime_config(op, cfg));
op->cb = cb;
*opp = op;
diff --git a/src/third_party/wiredtiger/src/block/block_ckpt.c b/src/third_party/wiredtiger/src/block/block_ckpt.c
index db6b458d671..a968370c2a5 100644
--- a/src/third_party/wiredtiger/src/block/block_ckpt.c
+++ b/src/third_party/wiredtiger/src/block/block_ckpt.c
@@ -140,7 +140,7 @@ err: /*
}
/* Checkpoints don't need the original information, discard it. */
- if (checkpoint && ci != NULL)
+ if (checkpoint)
__wt_block_ckpt_destroy(session, ci);
return (ret);
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c
index 6a85ccf6c17..94fe29d468d 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curnext.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c
@@ -711,8 +711,10 @@ __wt_btcur_next(WT_CURSOR_BTREE *cbt, bool truncating)
*/
if (page != NULL &&
(cbt->page_deleted_count > WT_BTREE_DELETE_THRESHOLD ||
- (newpage && cbt->page_deleted_count > 0)))
+ (newpage && cbt->page_deleted_count > 0))) {
__wt_page_evict_soon(session, cbt->ref);
+ WT_STAT_CONN_INCR(session, cache_eviction_force_delete);
+ }
cbt->page_deleted_count = 0;
if (F_ISSET(cbt, WT_CBT_READ_ONCE))
diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c
index 1b8df0008b9..5ac53cb2036 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curprev.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c
@@ -665,8 +665,10 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
*/
if (page != NULL &&
(cbt->page_deleted_count > WT_BTREE_DELETE_THRESHOLD ||
- (newpage && cbt->page_deleted_count > 0)))
+ (newpage && cbt->page_deleted_count > 0))) {
__wt_page_evict_soon(session, cbt->ref);
+ WT_STAT_CONN_INCR(session, cache_eviction_force_delete);
+ }
cbt->page_deleted_count = 0;
if (F_ISSET(cbt, WT_CBT_READ_ONCE))
diff --git a/src/third_party/wiredtiger/src/btree/bt_cursor.c b/src/third_party/wiredtiger/src/btree/bt_cursor.c
index b7176c74adf..51ccf1d6415 100644
--- a/src/third_party/wiredtiger/src/btree/bt_cursor.c
+++ b/src/third_party/wiredtiger/src/btree/bt_cursor.c
@@ -1477,9 +1477,11 @@ __wt_btcur_modify(WT_CURSOR_BTREE *cbt, WT_MODIFY *entries, int nentries)
* the update if the update chain is too long; third, there's a check
* if the updated value is too large to store; fourth, to simplify the
* count of bytes being added/removed; fifth, we can get into serious
- * trouble if we attempt to modify a value that doesn't exist. For the
- * fifth reason, verify we're not in a read-uncommitted transaction,
- * that implies a value that might disappear out from under us.
+ * trouble if we attempt to modify a value that doesn't exist or read
+ * a value that might not exist in the future. For the fifth reason,
+ * fail if in anything other than a snapshot transaction, read-committed
+ * and read-uncommitted imply values that might disappear out from under
+ * us or an inability to repeat point-in-time reads.
*
* Also, an application might read a value outside of a transaction and
* then call modify. For that to work, the read must be part of the
@@ -1490,9 +1492,10 @@ __wt_btcur_modify(WT_CURSOR_BTREE *cbt, WT_MODIFY *entries, int nentries)
* because it will work most of the time and the failure is unlikely to
* be detected. Require explicit transactions for modify operations.
*/
- if (session->txn.isolation == WT_ISO_READ_UNCOMMITTED)
+ if (session->txn.isolation != WT_ISO_SNAPSHOT)
WT_ERR_MSG(session, ENOTSUP,
- "not supported in read-uncommitted transactions");
+ "not supported in read-committed or read-uncommitted "
+ "transactions");
if (F_ISSET(&session->txn, WT_TXN_AUTOCOMMIT))
WT_ERR_MSG(session, ENOTSUP,
"not supported in implicit transactions");
diff --git a/src/third_party/wiredtiger/src/btree/bt_discard.c b/src/third_party/wiredtiger/src/btree/bt_discard.c
index 44d4e1a63a7..a3cbd6a2101 100644
--- a/src/third_party/wiredtiger/src/btree/bt_discard.c
+++ b/src/third_party/wiredtiger/src/btree/bt_discard.c
@@ -225,16 +225,6 @@ __free_page_modify(WT_SESSION_IMPL *session, WT_PAGE *page)
}
/*
- * __free_page_int --
- * Discard a WT_PAGE_COL_INT or WT_PAGE_ROW_INT page.
- */
-static void
-__free_page_int(WT_SESSION_IMPL *session, WT_PAGE *page)
-{
- __wt_free_ref_index(session, page, WT_INTL_INDEX_GET_SAFE(page), false);
-}
-
-/*
* __wt_free_ref --
* Discard the contents of a WT_REF structure (optionally including the
* pages it references).
@@ -248,9 +238,6 @@ __wt_free_ref(
if (ref == NULL)
return;
- /* Assert there are no hazard pointers. */
- WT_ASSERT(session, __wt_hazard_check_assert(session, ref, false));
-
/*
* Optionally free the referenced pages. (The path to free referenced
* page is used for error cleanup, no instantiated and then discarded
@@ -289,7 +276,24 @@ __wt_free_ref(
__wt_free(session, ref->page_del);
}
- __wt_overwrite_and_free(session, ref);
+ __wt_overwrite_and_free_len(session, ref, WT_REF_CLEAR_SIZE);
+}
+
+/*
+ * __free_page_int --
+ * Discard a WT_PAGE_COL_INT or WT_PAGE_ROW_INT page.
+ */
+static void
+__free_page_int(WT_SESSION_IMPL *session, WT_PAGE *page)
+{
+ WT_PAGE_INDEX *pindex;
+ uint32_t i;
+
+ for (pindex =
+ WT_INTL_INDEX_GET_SAFE(page), i = 0; i < pindex->entries; ++i)
+ __wt_free_ref(session, pindex->index[i], page->type, false);
+
+ __wt_free(session, pindex);
}
/*
@@ -300,14 +304,24 @@ void
__wt_free_ref_index(WT_SESSION_IMPL *session,
WT_PAGE *page, WT_PAGE_INDEX *pindex, bool free_pages)
{
+ WT_REF *ref;
uint32_t i;
if (pindex == NULL)
return;
- for (i = 0; i < pindex->entries; ++i)
- __wt_free_ref(
- session, pindex->index[i], page->type, free_pages);
+ for (i = 0; i < pindex->entries; ++i) {
+ ref = pindex->index[i];
+
+ /*
+ * Used when unrolling splits and other error paths where there
+ * should never have been a hazard pointer taken.
+ */
+ WT_ASSERT(session,
+ __wt_hazard_check_assert(session, ref, false));
+
+ __wt_free_ref(session, ref, page->type, free_pages);
+ }
__wt_free(session, pindex);
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_split.c b/src/third_party/wiredtiger/src/btree/bt_split.c
index 8bd58c17975..c0a48edf639 100644
--- a/src/third_party/wiredtiger/src/btree/bt_split.c
+++ b/src/third_party/wiredtiger/src/btree/bt_split.c
@@ -1182,8 +1182,49 @@ err: __split_ref_final(session, &locked);
switch (complete) {
case WT_ERR_RETURN:
+ /*
+ * The replace-index variable is the internal page being split's
+ * new page index, referencing the first chunk of WT_REFs that
+ * aren't being moved to other pages. Those WT_REFs survive the
+ * failure, they're referenced from the page's current index.
+ * Simply free that memory, but nothing it references.
+ */
+ __wt_free(session, replace_index);
+
+ /*
+ * The alloc-index variable is the array of new WT_REF entries
+ * intended to be inserted into the page being split's parent.
+ *
+ * Except for the first slot (the original page's WT_REF), it's
+ * an array of newly allocated combined WT_PAGE_INDEX and WT_REF
+ * structures, each of which references a newly allocated (and
+ * modified) child page, each of which references an index of
+ * WT_REFs from the page being split. Free everything except for
+ * slot 1 and the WT_REFs in the child page indexes.
+ *
+ * First, skip slot 1. Second, we want to free all of the child
+ * pages referenced from the alloc-index array, but we can't
+ * just call the usual discard function because the WT_REFs
+ * referenced by the child pages remain referenced by the
+ * original page, after error. For each entry, free the child
+ * page's page index (so the underlying page-free function will
+ * ignore it), then call the general-purpose discard function.
+ */
+ if (alloc_index == NULL)
+ break;
+ alloc_refp = alloc_index->index;
+ *alloc_refp++ = NULL;
+ for (i = 1; i < children; ++alloc_refp, ++i) {
+ ref = *alloc_refp;
+ if (ref == NULL || ref->page == NULL)
+ continue;
+
+ child = ref->page;
+ child_pindex = WT_INTL_INDEX_GET_SAFE(child);
+ __wt_free(session, child_pindex);
+ WT_INTL_INDEX_SET(child, NULL);
+ }
__wt_free_ref_index(session, page, alloc_index, true);
- __wt_free_ref_index(session, page, replace_index, false);
break;
case WT_ERR_PANIC:
__wt_err(session, ret,
@@ -1408,8 +1449,20 @@ err: if (parent != NULL)
__split_internal_unlock(session, page);
/* A page may have been busy, in which case return without error. */
- WT_RET_BUSY_OK(ret);
- return (0);
+ switch (ret) {
+ case 0:
+ case WT_PANIC:
+ break;
+ case EBUSY:
+ ret = 0;
+ break;
+ default:
+ __wt_err(session, ret,
+ "ignoring not-fatal error during parent page split");
+ ret = 0;
+ break;
+ }
+ return (ret);
}
#ifdef HAVE_DIAGNOSTIC
@@ -1625,7 +1678,7 @@ __split_multi_inmem_fail(WT_SESSION_IMPL *session, WT_PAGE *orig, WT_REF *ref)
/*
* We failed creating new in-memory pages. For error-handling reasons,
* we've left the update chains referenced by both the original and
- * new pages. Discard the new allocated WT_REF structures and their
+ * new pages. Discard the newly allocated WT_REF structures and their
* pages (setting a flag so the discard code doesn't discard the updates
* on the page).
*
diff --git a/src/third_party/wiredtiger/src/btree/bt_walk.c b/src/third_party/wiredtiger/src/btree/bt_walk.c
index a7cb433b56a..30cdaf2225a 100644
--- a/src/third_party/wiredtiger/src/btree/bt_walk.c
+++ b/src/third_party/wiredtiger/src/btree/bt_walk.c
@@ -447,6 +447,13 @@ restart: /*
WT_ERR_NOTFOUND_OK(ret);
__wt_spin_backoff(&swap_yield, &swap_sleep);
+ if (swap_yield < 1000)
+ WT_STAT_CONN_INCR(session,
+ cache_eviction_walk_internal_yield);
+ if (swap_sleep != 0)
+ WT_STAT_CONN_INCRV(session,
+ cache_eviction_walk_internal_wait,
+ swap_sleep);
}
/* NOTREACHED */
}
@@ -560,6 +567,8 @@ descend: /*
* An expected error, so "couple" is unchanged.
*/
if (ret == WT_NOTFOUND) {
+ WT_STAT_CONN_INCR(session,
+ cache_eviction_walk_leaf_notfound);
WT_NOT_READ(ret, 0);
break;
}
diff --git a/src/third_party/wiredtiger/src/conn/conn_api.c b/src/third_party/wiredtiger/src/conn/conn_api.c
index e68fb6c15f8..24df42b45f1 100644
--- a/src/third_party/wiredtiger/src/conn/conn_api.c
+++ b/src/third_party/wiredtiger/src/conn/conn_api.c
@@ -725,7 +725,9 @@ __conn_async_new_op(WT_CONNECTION *wt_conn, const char *uri, const char *config,
conn = (WT_CONNECTION_IMPL *)wt_conn;
CONNECTION_API_CALL(conn, session, async_new_op, config, cfg);
- WT_ERR(__wt_async_new_op(session, uri, config, cfg, callback, &op));
+ WT_UNUSED(cfg);
+
+ WT_ERR(__wt_async_new_op(session, uri, config, callback, &op));
*asyncopp = &op->iface;
@@ -1047,22 +1049,13 @@ __conn_close(WT_CONNECTION *wt_conn, const char *config)
const char *ckpt_cfg;
conn = (WT_CONNECTION_IMPL *)wt_conn;
- ckpt_cfg = "use_timestamp=false";
CONNECTION_API_CALL(conn, session, close, config, cfg);
-
- /* The default session is used to access data handles during close. */
- F_CLR(session, WT_SESSION_NO_DATA_HANDLES);
+err:
WT_TRET(__wt_config_gets(session, cfg, "leak_memory", &cval));
if (cval.val != 0)
F_SET(conn, WT_CONN_LEAK_MEMORY);
- WT_TRET(__wt_config_gets(session, cfg, "use_timestamp", &cval));
- if (cval.val != 0) {
- ckpt_cfg = "use_timestamp=true";
- if (conn->txn_global.has_stable_timestamp)
- F_SET(conn, WT_CONN_CLOSING_TIMESTAMP);
- }
/*
* Ramp the eviction dirty target down to encourage eviction threads to
@@ -1071,7 +1064,7 @@ __conn_close(WT_CONNECTION *wt_conn, const char *config)
conn->cache->eviction_dirty_trigger = 1.0;
conn->cache->eviction_dirty_target = 0.1;
-err: /*
+ /*
* Rollback all running transactions.
* We do this as a separate pass because an active transaction in one
* session could cause trouble when closing a file, even if that
@@ -1102,7 +1095,8 @@ err: /*
WT_TRET(wt_session->close(wt_session, config));
}
- WT_TRET(__wt_async_flush(session));
+ /* Wait for in-flight operations to complete. */
+ WT_TRET(__wt_txn_activity_drain(session));
/*
* Disable lookaside eviction: it doesn't help us shut down and can
@@ -1111,8 +1105,24 @@ err: /*
*/
F_SET(conn, WT_CONN_EVICTION_NO_LOOKASIDE);
- /* Wait for in-flight operations to complete. */
- WT_TRET(__wt_txn_activity_drain(session));
+ /*
+ * Clear any pending async operations and shut down the async worker
+ * threads and system before closing LSM.
+ */
+ WT_TRET(__wt_async_flush(session));
+ WT_TRET(__wt_async_destroy(session));
+
+ WT_TRET(__wt_lsm_manager_destroy(session));
+
+ /*
+ * After the async and LSM threads have exited, we shouldn't opening
+ * any more files.
+ */
+ F_SET(conn, WT_CONN_CLOSING_NO_MORE_OPENS);
+ WT_FULL_BARRIER();
+
+ /* The default session is used to access data handles during close. */
+ F_CLR(session, WT_SESSION_NO_DATA_HANDLES);
/*
* Perform a system-wide checkpoint so that all tables are consistent
@@ -1121,6 +1131,13 @@ err: /*
* shutting down all the subsystems. We have shut down all user
* sessions, but send in true for waiting for internal races.
*/
+ WT_TRET(__wt_config_gets(session, cfg, "use_timestamp", &cval));
+ ckpt_cfg = "use_timestamp=false";
+ if (cval.val != 0) {
+ ckpt_cfg = "use_timestamp=true";
+ if (conn->txn_global.has_stable_timestamp)
+ F_SET(conn, WT_CONN_CLOSING_TIMESTAMP);
+ }
if (!F_ISSET(conn, WT_CONN_IN_MEMORY | WT_CONN_READONLY)) {
s = NULL;
WT_TRET(__wt_open_internal_session(
diff --git a/src/third_party/wiredtiger/src/conn/conn_handle.c b/src/third_party/wiredtiger/src/conn/conn_handle.c
index faee6216ed7..6f61d10afbe 100644
--- a/src/third_party/wiredtiger/src/conn/conn_handle.c
+++ b/src/third_party/wiredtiger/src/conn/conn_handle.c
@@ -65,7 +65,7 @@ __wt_connection_init(WT_CONNECTION_IMPL *conn)
WT_RET(__wt_rwlock_init(session, &conn->hot_backup_lock));
WT_RWLOCK_INIT_TRACKED(session, &conn->table_lock, table);
- /* Setup the spin locks for the LSM manager queues. */
+ /* Setup serialization for the LSM manager queues. */
WT_RET(__wt_spin_init(session,
&conn->lsm_manager.app_lock, "LSM application queue lock"));
WT_RET(__wt_spin_init(session,
@@ -130,6 +130,12 @@ __wt_connection_destroy(WT_CONNECTION_IMPL *conn)
__wt_rwlock_destroy(session, &conn->table_lock);
__wt_spin_destroy(session, &conn->turtle_lock);
+ /* Free LSM serialization resources. */
+ __wt_spin_destroy(session, &conn->lsm_manager.switch_lock);
+ __wt_spin_destroy(session, &conn->lsm_manager.app_lock);
+ __wt_spin_destroy(session, &conn->lsm_manager.manager_lock);
+ __wt_cond_destroy(session, &conn->lsm_manager.work_cond);
+
/* Free allocated memory. */
__wt_free(session, conn->cfg);
__wt_free(session, conn->debug_ckpt);
diff --git a/src/third_party/wiredtiger/src/conn/conn_open.c b/src/third_party/wiredtiger/src/conn/conn_open.c
index 3a1025fea1b..c9d34987df4 100644
--- a/src/third_party/wiredtiger/src/conn/conn_open.c
+++ b/src/third_party/wiredtiger/src/conn/conn_open.c
@@ -76,32 +76,24 @@ __wt_connection_close(WT_CONNECTION_IMPL *conn)
wt_conn = &conn->iface;
session = conn->default_session;
+ /*
+ * The LSM and async services are not shut down in this path (which is
+ * called when wiredtiger_open hits an error (as well as during normal
+ * shutdown). Assert they're not running.
+ */
+ WT_ASSERT(session,
+ !F_ISSET(conn, WT_CONN_SERVER_ASYNC | WT_CONN_SERVER_LSM));
+
/* Shut down the subsystems, ensuring workers see the state change. */
F_SET(conn, WT_CONN_CLOSING);
WT_FULL_BARRIER();
/*
- * Clear any pending async operations and shut down the async worker
- * threads and system before closing LSM.
- */
- WT_TRET(__wt_async_flush(session));
- WT_TRET(__wt_async_destroy(session));
-
- /*
* Shut down server threads other than the eviction server, which is
* needed later to close btree handles. Some of these threads access
* btree handles, so take care in ordering shutdown to make sure they
* exit before files are closed.
*/
- WT_TRET(__wt_lsm_manager_destroy(session));
-
- /*
- * Once the async and LSM threads exit, we shouldn't be opening any
- * more files.
- */
- F_SET(conn, WT_CONN_CLOSING_NO_MORE_OPENS);
- WT_FULL_BARRIER();
-
WT_TRET(__wt_capacity_server_destroy(session));
WT_TRET(__wt_checkpoint_server_destroy(session));
WT_TRET(__wt_statlog_destroy(session, true));
@@ -250,9 +242,6 @@ __wt_connection_workers(WT_SESSION_IMPL *session, const char *cfg[])
/* Start the handle sweep thread. */
WT_RET(__wt_sweep_create(session));
- /* Start the optional async threads. */
- WT_RET(__wt_async_create(session, cfg));
-
/* Start the optional capacity thread. */
WT_RET(__wt_capacity_server_create(session, cfg));
diff --git a/src/third_party/wiredtiger/src/cursor/cur_std.c b/src/third_party/wiredtiger/src/cursor/cur_std.c
index 808780b4675..073df6eaaf6 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_std.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_std.c
@@ -916,11 +916,16 @@ __cursor_modify(WT_CURSOR *cursor, WT_MODIFY *entries, int nentries)
/*
* The underlying btree code cannot support WT_CURSOR.modify within
- * a read-uncommitted transaction. Disallow it here for consistency.
+ * a read-committed or read-uncommitted transaction, or outside of
+ * an explicit transaction. Disallow here as well, for consistency.
*/
- if (session->txn.isolation == WT_ISO_READ_UNCOMMITTED)
+ if (session->txn.isolation != WT_ISO_SNAPSHOT)
WT_ERR_MSG(session, ENOTSUP,
- "not supported in read-uncommitted transactions");
+ "not supported in read-committed or read-uncommitted "
+ "transactions");
+ if (F_ISSET(&session->txn, WT_TXN_AUTOCOMMIT))
+ WT_ERR_MSG(session, ENOTSUP,
+ "not supported in implicit transactions");
WT_ERR(__cursor_checkkey(cursor));
diff --git a/src/third_party/wiredtiger/src/docs/checkpoint.dox b/src/third_party/wiredtiger/src/docs/checkpoint.dox
index 3d636cd17b6..2da3b1df272 100644
--- a/src/third_party/wiredtiger/src/docs/checkpoint.dox
+++ b/src/third_party/wiredtiger/src/docs/checkpoint.dox
@@ -55,11 +55,13 @@ archiving purposes.
@section checkpoint_cursors Checkpoint cursors
Cursors are normally opened in the most recent version of a data source.
-However, a checkpoint configuration string may be provided to
-WT_SESSION::open_cursor, opening a read-only, static view of the data
-source. This provides a limited form of time-travel, as the static view
-is not changed by subsequent checkpoints, and will persist until the
-checkpoint cursor is closed.
+However, a checkpoint configuration string may be provided
+to WT_SESSION::open_cursor, opening a read-only, static view of the
+data source. This provides a limited form of time-travel, as the static
+view is not changed by subsequent checkpoints and will persist until
+the checkpoint cursor is closed. While it is not an error to set a read
+timestamp in a transaction including a checkpoint cursor, it also has no
+effect on the checkpoint cursor's behavior.
@section checkpoint_naming Checkpoint naming
diff --git a/src/third_party/wiredtiger/src/docs/custom-data-sources.dox b/src/third_party/wiredtiger/src/docs/custom-data-sources.dox
index 9082ee95dea..340f25997a5 100644
--- a/src/third_party/wiredtiger/src/docs/custom-data-sources.dox
+++ b/src/third_party/wiredtiger/src/docs/custom-data-sources.dox
@@ -6,12 +6,6 @@ support a set of methods for a different URI type (for example, in the
same way WiredTiger supports the built-in type "file:", an application
data source might support the type "dsrc:").
-The WiredTiger distribution includes an example of a complete custom
-data source implementation (based on Oracle's Berkeley DB database
-engine), in the file test/format/kvs_bdb.c. This example implementation is
-public domain software, please feel free to use this code as a prototype
-implementation of other custom data sources.
-
Applications register their WT_DATA_SOURCE interface implementations
with WiredTiger using the WT_CONNECTION::add_data_source method:
diff --git a/src/third_party/wiredtiger/src/docs/spell.ok b/src/third_party/wiredtiger/src/docs/spell.ok
index cb65c7b1b01..98ec49779a4 100644
--- a/src/third_party/wiredtiger/src/docs/spell.ok
+++ b/src/third_party/wiredtiger/src/docs/spell.ok
@@ -120,8 +120,6 @@ autogen
automake
basecfg
basho
-bdb
-bdbmap
benchmarking
bigram
bindir
diff --git a/src/third_party/wiredtiger/src/docs/upgrading.dox b/src/third_party/wiredtiger/src/docs/upgrading.dox
index b4c7f5b7d2b..c5bb8ded037 100644
--- a/src/third_party/wiredtiger/src/docs/upgrading.dox
+++ b/src/third_party/wiredtiger/src/docs/upgrading.dox
@@ -1,6 +1,19 @@
/*! @page upgrading Upgrading WiredTiger applications
</dl><hr>
+@section version_321 Upgrading to Version 3.2.1
+<dl>
+
+<dt>WT_CURSOR::modify transaction requirements</dt>
+<dd>
+In previous releases of WiredTiger, WT_CURSOR::modify operations could be
+performed within <code>read-committed</code> transactions. This implies
+point-in-time reads that cannot be repeated. In the 3.2.1 release,
+WT_CURSOR::modify operations must be performed in an explicit transaction
+at snapshot isolation, and will fail if that's not the case.
+</dd>
+
+</dl><hr>
@section version_320 Upgrading to Version 3.2.0
<dl>
diff --git a/src/third_party/wiredtiger/src/evict/evict_lru.c b/src/third_party/wiredtiger/src/evict/evict_lru.c
index 931216376b9..b0b29942cb2 100644
--- a/src/third_party/wiredtiger/src/evict/evict_lru.c
+++ b/src/third_party/wiredtiger/src/evict/evict_lru.c
@@ -1373,6 +1373,8 @@ __evict_lru_walk(WT_SESSION_IMPL *session)
}
}
+ WT_STAT_CONN_INCRV(session,
+ cache_eviction_pages_queued_post_lru, queue->evict_candidates);
queue->evict_current = queue->evict_queue;
__wt_spin_unlock(session, &queue->evict_lock);
diff --git a/src/third_party/wiredtiger/src/evict/evict_page.c b/src/third_party/wiredtiger/src/evict/evict_page.c
index 2510815401f..5df9b7ce9bb 100644
--- a/src/third_party/wiredtiger/src/evict/evict_page.c
+++ b/src/third_party/wiredtiger/src/evict/evict_page.c
@@ -55,16 +55,10 @@ __wt_page_release_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags)
{
WT_BTREE *btree;
WT_DECL_RET;
- WT_PAGE *page;
- uint64_t time_start, time_stop;
uint32_t evict_flags, previous_state;
- bool locked, too_big;
+ bool locked;
btree = S2BT(session);
- locked = false;
- page = ref->page;
- time_start = __wt_clock(session);
- evict_flags = LF_ISSET(WT_READ_NO_SPLIT) ? WT_EVICT_CALL_NO_SPLIT : 0;
/*
* This function always releases the hazard pointer - ensure that's
@@ -73,47 +67,20 @@ __wt_page_release_evict(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags)
* without first locking the page, it could be evicted in between.
*/
previous_state = ref->state;
- if ((previous_state == WT_REF_MEM || previous_state == WT_REF_LIMBO) &&
- WT_REF_CAS_STATE(session, ref, previous_state, WT_REF_LOCKED))
- locked = true;
+ locked =
+ (previous_state == WT_REF_MEM || previous_state == WT_REF_LIMBO) &&
+ WT_REF_CAS_STATE(session, ref, previous_state, WT_REF_LOCKED);
if ((ret = __wt_hazard_clear(session, ref)) != 0 || !locked) {
if (locked)
WT_REF_SET_STATE(ref, previous_state);
return (ret == 0 ? EBUSY : ret);
}
- (void)__wt_atomic_addv32(&btree->evict_busy, 1);
-
- too_big = page->memory_footprint >= btree->splitmempage;
+ evict_flags = LF_ISSET(WT_READ_NO_SPLIT) ? WT_EVICT_CALL_NO_SPLIT : 0;
+ FLD_SET(evict_flags, WT_EVICT_CALL_URGENT);
- /*
- * Track how long the call to evict took. If eviction is successful then
- * we have one of two pairs of stats to increment.
- */
+ (void)__wt_atomic_addv32(&btree->evict_busy, 1);
ret = __wt_evict(session, ref, previous_state, evict_flags);
- time_stop = __wt_clock(session);
- if (ret == 0) {
- if (too_big) {
- WT_STAT_CONN_INCR(session, cache_eviction_force);
- WT_STAT_CONN_INCRV(session, cache_eviction_force_time,
- WT_CLOCKDIFF_US(time_stop, time_start));
- } else {
- /*
- * If the page isn't too big, we are evicting it because
- * it had a chain of deleted entries that make traversal
- * expensive.
- */
- WT_STAT_CONN_INCR(session, cache_eviction_force_delete);
- WT_STAT_CONN_INCRV(session,
- cache_eviction_force_delete_time,
- WT_CLOCKDIFF_US(time_stop, time_start));
- }
- } else {
- 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));
- }
-
(void)__wt_atomic_subv32(&btree->evict_busy, 1);
return (ret);
@@ -130,12 +97,14 @@ __wt_evict(WT_SESSION_IMPL *session,
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
WT_PAGE *page;
+ uint64_t time_start, time_stop;
bool clean_page, closing, inmem_split, local_gen, tree_dead;
conn = S2C(session);
page = ref->page;
closing = LF_ISSET(WT_EVICT_CALL_CLOSING);
local_gen = false;
+ time_start = time_stop = 0; /* [-Werror=maybe-uninitialized] */
__wt_verbose(session, WT_VERB_EVICT,
"page %p (%s)", (void *)page, __wt_page_type_string(page->type));
@@ -155,6 +124,16 @@ __wt_evict(WT_SESSION_IMPL *session,
}
/*
+ * Track how long forcible eviction took. Immediately increment the
+ * forcible eviction counter, we might do an in-memory split and not
+ * an eviction, which skips the other statistics.
+ */
+ if (LF_ISSET(WT_EVICT_CALL_URGENT)) {
+ time_start = __wt_clock(session);
+ WT_STAT_CONN_INCR(session, cache_eviction_force);
+ }
+
+ /*
* Get exclusive access to the page if our caller doesn't have the tree
* locked down.
*/
@@ -225,6 +204,21 @@ __wt_evict(WT_SESSION_IMPL *session,
else
WT_ERR(__evict_page_dirty_update(session, ref, flags));
+ if (LF_ISSET(WT_EVICT_CALL_URGENT)) {
+ time_stop = __wt_clock(session);
+ if (clean_page) {
+ WT_STAT_CONN_INCR(session, cache_eviction_force_clean);
+ WT_STAT_CONN_INCRV(session,
+ cache_eviction_force_clean_time,
+ WT_CLOCKDIFF_US(time_stop, time_start));
+ }
+ else {
+ WT_STAT_CONN_INCR(session, cache_eviction_force_dirty);
+ WT_STAT_CONN_INCRV(session,
+ cache_eviction_force_dirty_time,
+ WT_CLOCKDIFF_US(time_stop, time_start));
+ }
+ }
if (clean_page) {
WT_STAT_CONN_INCR(session, cache_eviction_clean);
WT_STAT_DATA_INCR(session, cache_eviction_clean);
@@ -237,6 +231,14 @@ __wt_evict(WT_SESSION_IMPL *session,
err: if (!closing)
__evict_exclusive_clear(session, ref, previous_state);
+ if (LF_ISSET(WT_EVICT_CALL_URGENT)) {
+ time_stop = __wt_clock(session);
+ 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));
+ }
+
WT_STAT_CONN_INCR(session, cache_eviction_fail);
WT_STAT_DATA_INCR(session, cache_eviction_fail);
}
@@ -470,11 +472,46 @@ __evict_child_check(WT_SESSION_IMPL *session, WT_REF *parent)
WT_REF *child;
bool active;
+ /*
+ * There may be cursors in the tree walking the list of child pages.
+ * The parent is locked, so all we care about is cursors already in the
+ * child pages, no thread can enter them. Any cursor moving through the
+ * child pages must be hazard pointer coupling between pages, where the
+ * page on which it currently has a hazard pointer must be in a state
+ * other than on-disk. Walk the child list forward, then backward, to
+ * ensure we don't race with a cursor walking in the opposite direction
+ * from our check.
+ */
+ WT_INTL_FOREACH_BEGIN(session, parent->page, child) {
+ switch (child->state) {
+ case WT_REF_DISK: /* On-disk */
+ case WT_REF_DELETED: /* On-disk, deleted */
+ case WT_REF_LOOKASIDE: /* On-disk, lookaside */
+ break;
+ default:
+ return (__wt_set_return(session, EBUSY));
+ }
+ } WT_INTL_FOREACH_END;
+ WT_INTL_FOREACH_REVERSE_BEGIN(session, parent->page, child) {
+ switch (child->state) {
+ case WT_REF_DISK: /* On-disk */
+ case WT_REF_DELETED: /* On-disk, deleted */
+ case WT_REF_LOOKASIDE: /* On-disk, lookaside */
+ break;
+ default:
+ return (__wt_set_return(session, EBUSY));
+ }
+ } WT_INTL_FOREACH_END;
+
+ /*
+ * The fast check is done and there are no cursors in the child pages.
+ * Make sure the child WT_REF structures pages can be discarded.
+ */
WT_INTL_FOREACH_BEGIN(session, parent->page, child) {
switch (child->state) {
case WT_REF_DISK: /* On-disk */
break;
- case WT_REF_DELETED: /* Deleted */
+ case WT_REF_DELETED: /* On-disk, deleted */
/*
* If the child page was part of a truncate,
* transaction rollback might switch this page into its
@@ -498,7 +535,7 @@ __evict_child_check(WT_SESSION_IMPL *session, WT_REF *parent)
if (active)
return (__wt_set_return(session, EBUSY));
break;
- case WT_REF_LOOKASIDE:
+ case WT_REF_LOOKASIDE: /* On-disk, lookaside */
/*
* If the lookaside history is obsolete, the reference
* can be ignored.
@@ -520,9 +557,8 @@ __evict_child_check(WT_SESSION_IMPL *session, WT_REF *parent)
* for conditions that would block its eviction.
*/
static int
-__evict_review(
- WT_SESSION_IMPL *session, WT_REF *ref, uint32_t evict_flags,
- bool *inmem_splitp)
+__evict_review(WT_SESSION_IMPL *session,
+ WT_REF *ref, uint32_t evict_flags, bool *inmem_splitp)
{
WT_CACHE *cache;
WT_CONNECTION_IMPL *conn;
@@ -646,41 +682,39 @@ __evict_review(
if (closing)
LF_SET(WT_REC_VISIBILITY_ERR);
- else if (!WT_PAGE_IS_INTERNAL(page) &&
- !F_ISSET(S2BT(session), WT_BTREE_LOOKASIDE)) {
- if (F_ISSET(conn, WT_CONN_IN_MEMORY))
- LF_SET(WT_REC_IN_MEMORY |
- WT_REC_SCRUB | WT_REC_UPDATE_RESTORE);
- else if (WT_SESSION_BTREE_SYNC(session))
- LF_SET(WT_REC_LOOKASIDE);
- else if (!WT_IS_METADATA(session->dhandle)) {
- LF_SET(WT_REC_UPDATE_RESTORE);
+ else if (WT_PAGE_IS_INTERNAL(page) ||
+ F_ISSET(S2BT(session), WT_BTREE_LOOKASIDE))
+ ;
+ else if (WT_SESSION_BTREE_SYNC(session))
+ LF_SET(WT_REC_LOOKASIDE);
+ else if (F_ISSET(conn, WT_CONN_IN_MEMORY))
+ LF_SET(WT_REC_IN_MEMORY | WT_REC_SCRUB | WT_REC_UPDATE_RESTORE);
+ else {
+ LF_SET(WT_REC_UPDATE_RESTORE);
- /*
- * Scrub if we're supposed to or toss it in sometimes
- * if we are in debugging mode.
- */
- if (F_ISSET(cache, WT_CACHE_EVICT_SCRUB) ||
- (F_ISSET(cache, WT_CACHE_EVICT_DEBUG_MODE) &&
- __wt_random(&session->rnd) % 3 == 0))
- LF_SET(WT_REC_SCRUB);
+ /*
+ * Scrub if we're supposed to or toss it in sometimes if we are
+ * in debugging mode.
+ */
+ if (F_ISSET(cache, WT_CACHE_EVICT_SCRUB) ||
+ (F_ISSET(cache, WT_CACHE_EVICT_DEBUG_MODE) &&
+ __wt_random(&session->rnd) % 3 == 0))
+ LF_SET(WT_REC_SCRUB);
- /*
- * If the cache is under pressure with many updates
- * that can't be evicted, check if reconciliation
- * suggests trying the lookaside table.
- */
- if (F_ISSET(cache, WT_CACHE_EVICT_LOOKASIDE) &&
- !F_ISSET(conn, WT_CONN_EVICTION_NO_LOOKASIDE)) {
- if (F_ISSET(cache,
- WT_CACHE_EVICT_DEBUG_MODE) &&
- __wt_random(&session->rnd) % 10 == 0) {
- LF_CLR(WT_REC_SCRUB |
- WT_REC_UPDATE_RESTORE);
- LF_SET(WT_REC_LOOKASIDE);
- }
- lookaside_retryp = &lookaside_retry;
+ /*
+ * If the cache is under pressure with many updates that can't
+ * be evicted, check if reconciliation suggests trying the
+ * lookaside table.
+ */
+ if (!WT_IS_METADATA(session->dhandle) &&
+ F_ISSET(cache, WT_CACHE_EVICT_LOOKASIDE) &&
+ !F_ISSET(conn, WT_CONN_EVICTION_NO_LOOKASIDE)) {
+ if (F_ISSET(cache, WT_CACHE_EVICT_DEBUG_MODE) &&
+ __wt_random(&session->rnd) % 10 == 0) {
+ LF_CLR(WT_REC_SCRUB | WT_REC_UPDATE_RESTORE);
+ LF_SET(WT_REC_LOOKASIDE);
}
+ lookaside_retryp = &lookaside_retry;
}
}
diff --git a/src/third_party/wiredtiger/src/include/btmem.h b/src/third_party/wiredtiger/src/include/btmem.h
index 7729c9887d5..a7c289a7b7f 100644
--- a/src/third_party/wiredtiger/src/include/btmem.h
+++ b/src/third_party/wiredtiger/src/include/btmem.h
@@ -593,6 +593,14 @@ struct __wt_page {
for (__refp = __pindex->index, \
__entries = __pindex->entries; __entries > 0; --__entries) {\
(ref) = *__refp++;
+#define WT_INTL_FOREACH_REVERSE_BEGIN(session, page, ref) do { \
+ WT_PAGE_INDEX *__pindex; \
+ WT_REF **__refp; \
+ uint32_t __entries; \
+ WT_INTL_INDEX_GET(session, page, __pindex); \
+ for (__refp = __pindex->index + __pindex->entries, \
+ __entries = __pindex->entries; __entries > 0; --__entries) {\
+ (ref) = *--__refp;
#define WT_INTL_FOREACH_END \
} \
} while (0)
@@ -897,43 +905,51 @@ struct __wt_ref {
WT_PAGE_DELETED *page_del; /* Deleted page information */
WT_PAGE_LOOKASIDE *page_las; /* Lookaside information */
-/* A macro wrapper allowing us to remember the callers code location */
-#define WT_REF_CAS_STATE(session, ref, old_state, new_state) \
- __wt_ref_cas_state_int((session), (ref), (old_state), (new_state),\
- __FILE__, __LINE__)
+ /*
+ * In DIAGNOSTIC mode we overwrite the WT_REF on free to force failures.
+ * Don't clear the history in that case.
+ */
+#define WT_REF_CLEAR_SIZE (offsetof(WT_REF, hist))
+
+#define WT_REF_SAVE_STATE_MAX 3
#ifdef HAVE_DIAGNOSTIC
/* Capture history of ref state changes. */
struct __wt_ref_hist {
WT_SESSION_IMPL *session;
const char *name;
- const char *file;
- int line;
- uint32_t state;
- } hist[3];
+ const char *func;
+ uint16_t line;
+ uint16_t state;
+ } hist[WT_REF_SAVE_STATE_MAX];
uint64_t histoff;
#define WT_REF_SAVE_STATE(ref, s, f, l) do { \
(ref)->hist[(ref)->histoff].session = session; \
(ref)->hist[(ref)->histoff].name = session->name; \
- (ref)->hist[(ref)->histoff].file = (f); \
- (ref)->hist[(ref)->histoff].line = (l); \
- (ref)->hist[(ref)->histoff].state = s; \
+ (ref)->hist[(ref)->histoff].func = (f); \
+ (ref)->hist[(ref)->histoff].line = (uint16_t)(l); \
+ (ref)->hist[(ref)->histoff].state = (uint16_t)(s); \
(ref)->histoff = \
((ref)->histoff + 1) % WT_ELEMENTS((ref)->hist); \
} while (0)
#define WT_REF_SET_STATE(ref, s) do { \
- WT_REF_SAVE_STATE(ref, s, __FILE__, __LINE__); \
+ WT_REF_SAVE_STATE(ref, s, __func__, __LINE__); \
WT_PUBLISH((ref)->state, s); \
} while (0)
#else
#define WT_REF_SET_STATE(ref, s) WT_PUBLISH((ref)->state, s)
#endif
+
+/* A macro wrapper allowing us to remember the callers code location */
+#define WT_REF_CAS_STATE(session, ref, old_state, new_state) \
+ __wt_ref_cas_state_int( \
+ session, ref, old_state, new_state, __func__, __LINE__)
};
/*
* WT_REF_SIZE is the expected structure size -- we verify the build to ensure
* the compiler hasn't inserted padding which would break the world.
*/
#ifdef HAVE_DIAGNOSTIC
-#define WT_REF_SIZE (56 + 3 * sizeof(WT_REF_HIST) + 8)
+#define WT_REF_SIZE (56 + WT_REF_SAVE_STATE_MAX * sizeof(WT_REF_HIST) + 8)
#else
#define WT_REF_SIZE 56
#endif
diff --git a/src/third_party/wiredtiger/src/include/btree.i b/src/third_party/wiredtiger/src/include/btree.i
index 906c615057a..5cf67d8600f 100644
--- a/src/third_party/wiredtiger/src/include/btree.i
+++ b/src/third_party/wiredtiger/src/include/btree.i
@@ -1508,7 +1508,8 @@ __wt_page_release(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags)
* memory_page_max setting, when we see many deleted items, and when we
* are attempting to scan without trashing the cache.
*
- * Fast checks if eviction is disabled for this handle, operation or
+ * Fast checks if flag indicates no evict, session can't perform slow
+ * operation, eviction is disabled for this handle, operation or
* tree, then perform a general check if eviction will be possible.
*
* Checkpoint should not queue pages for urgent eviction if it cannot
@@ -1517,7 +1518,9 @@ __wt_page_release(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags)
* checkpointed, and no other thread can help with that.
*/
page = ref->page;
- if (WT_READGEN_EVICT_SOON(page->read_gen) &&
+ if (!LF_ISSET(WT_READ_NO_EVICT) &&
+ __wt_session_can_wait(session) &&
+ WT_READGEN_EVICT_SOON(page->read_gen) &&
btree->evict_disabled == 0 &&
__wt_page_can_evict(session, ref, &inmem_split)) {
if (!__wt_page_evict_clean(page) &&
diff --git a/src/third_party/wiredtiger/src/include/cache.h b/src/third_party/wiredtiger/src/include/cache.h
index 163e0a2753c..46718d9aba2 100644
--- a/src/third_party/wiredtiger/src/include/cache.h
+++ b/src/third_party/wiredtiger/src/include/cache.h
@@ -294,6 +294,7 @@ struct __wt_cache_pool {
/* Flags used with __wt_evict */
/* AUTOMATIC FLAG VALUE GENERATION START */
-#define WT_EVICT_CALL_CLOSING 0x1u /* Closing connection or tree */
-#define WT_EVICT_CALL_NO_SPLIT 0x2u /* Splits not allowed */
+#define WT_EVICT_CALL_CLOSING 0x1u /* Closing connection or tree */
+#define WT_EVICT_CALL_NO_SPLIT 0x2u /* Splits not allowed */
+#define WT_EVICT_CALL_URGENT 0x4u /* Urgent eviction */
/* AUTOMATIC FLAG VALUE GENERATION STOP */
diff --git a/src/third_party/wiredtiger/src/include/cursor.i b/src/third_party/wiredtiger/src/include/cursor.i
index 3c08f808c62..0cb3708a030 100644
--- a/src/third_party/wiredtiger/src/include/cursor.i
+++ b/src/third_party/wiredtiger/src/include/cursor.i
@@ -200,8 +200,10 @@ __cursor_reset(WT_CURSOR_BTREE *cbt)
* If we were scanning and saw a lot of deleted records on this page,
* try to evict the page when we release it.
*/
- if (cbt->page_deleted_count > WT_BTREE_DELETE_THRESHOLD)
+ if (cbt->page_deleted_count > WT_BTREE_DELETE_THRESHOLD) {
__wt_page_evict_soon(session, cbt->ref);
+ WT_STAT_CONN_INCR(session, cache_eviction_force_delete);
+ }
cbt->page_deleted_count = 0;
/*
diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h
index a4706a36796..1c704be9c3e 100644
--- a/src/third_party/wiredtiger/src/include/extern.h
+++ b/src/third_party/wiredtiger/src/include/extern.h
@@ -36,7 +36,7 @@ extern int __wt_apply_single_idx(WT_SESSION_IMPL *session, WT_INDEX *idx, WT_CUR
extern int __wt_async_create(WT_SESSION_IMPL *session, const char *cfg[]) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_async_destroy(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_async_flush(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_async_new_op(WT_SESSION_IMPL *session, const char *uri, const char *config, const char *cfg[], WT_ASYNC_CALLBACK *cb, WT_ASYNC_OP_IMPL **opp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_async_new_op(WT_SESSION_IMPL *session, const char *uri, const char *config, WT_ASYNC_CALLBACK *cb, WT_ASYNC_OP_IMPL **opp) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_async_op_enqueue(WT_SESSION_IMPL *session, WT_ASYNC_OP_IMPL *op) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_async_op_init(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_async_reconfig(WT_SESSION_IMPL *session, const char *cfg[]) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
@@ -925,7 +925,7 @@ static inline bool __wt_page_is_empty(WT_PAGE *page) WT_GCC_FUNC_DECL_ATTRIBUTE(
static inline bool __wt_page_is_modified(WT_PAGE *page) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_page_las_active(WT_SESSION_IMPL *session, WT_REF *ref) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_rec_need_split(WT_RECONCILE *r, size_t len) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-static inline bool __wt_ref_cas_state_int(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t old_state, uint32_t new_state, const char *file, int line) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+static inline bool __wt_ref_cas_state_int(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t old_state, uint32_t new_state, const char *func, int line) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_ref_is_root(WT_REF *ref) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_row_leaf_key_info(WT_PAGE *page, void *copy, WT_IKEY **ikeyp, WT_CELL **cellp, void *datap, size_t *sizep) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
static inline bool __wt_row_leaf_value(WT_PAGE *page, WT_ROW *rip, WT_ITEM *value) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h
index 26c030009e6..8968c5e1010 100644
--- a/src/third_party/wiredtiger/src/include/stat.h
+++ b/src/third_party/wiredtiger/src/include/stat.h
@@ -386,6 +386,9 @@ struct __wt_connection_stats {
int64_t cache_eviction_server_evicting;
int64_t cache_eviction_server_slept;
int64_t cache_eviction_slow;
+ int64_t cache_eviction_walk_leaf_notfound;
+ int64_t cache_eviction_walk_internal_wait;
+ int64_t cache_eviction_walk_internal_yield;
int64_t cache_eviction_state;
int64_t cache_eviction_target_page_lt10;
int64_t cache_eviction_target_page_lt32;
@@ -404,11 +407,17 @@ struct __wt_connection_stats {
int64_t cache_eviction_worker_evicting;
int64_t cache_eviction_worker_removed;
int64_t cache_eviction_stable_state_workers;
- int64_t cache_eviction_force_fail;
- int64_t cache_eviction_force_fail_time;
int64_t cache_eviction_walks_active;
int64_t cache_eviction_walks_started;
int64_t cache_eviction_force_retune;
+ int64_t cache_eviction_force_clean;
+ int64_t cache_eviction_force_clean_time;
+ int64_t cache_eviction_force_dirty;
+ int64_t cache_eviction_force_dirty_time;
+ int64_t cache_eviction_force_delete;
+ int64_t cache_eviction_force;
+ int64_t cache_eviction_force_fail;
+ int64_t cache_eviction_force_fail_time;
int64_t cache_eviction_hazard;
int64_t cache_hazard_checks;
int64_t cache_hazard_walks;
@@ -427,12 +436,9 @@ struct __wt_connection_stats {
int64_t cache_eviction_deepen;
int64_t cache_write_lookaside;
int64_t cache_pages_inuse;
- int64_t cache_eviction_force;
- int64_t cache_eviction_force_time;
- int64_t cache_eviction_force_delete;
- int64_t cache_eviction_force_delete_time;
int64_t cache_eviction_app;
int64_t cache_eviction_pages_queued;
+ int64_t cache_eviction_pages_queued_post_lru;
int64_t cache_eviction_pages_queued_urgent;
int64_t cache_eviction_pages_queued_oldest;
int64_t cache_read;
diff --git a/src/third_party/wiredtiger/src/include/txn.h b/src/third_party/wiredtiger/src/include/txn.h
index 7e73bbacf8e..ac4c4f0e2d8 100644
--- a/src/third_party/wiredtiger/src/include/txn.h
+++ b/src/third_party/wiredtiger/src/include/txn.h
@@ -251,6 +251,7 @@ struct __wt_txn_op {
/* AUTOMATIC FLAG VALUE GENERATION START */
#define WT_TXN_OP_KEY_REPEATED 0x1u
+#define WT_TXN_OP_KEY_RESERVED 0x2u
/* AUTOMATIC FLAG VALUE GENERATION STOP */
uint32_t flags;
};
diff --git a/src/third_party/wiredtiger/src/include/txn.i b/src/third_party/wiredtiger/src/include/txn.i
index f904e62cc05..abb2b1ccc66 100644
--- a/src/third_party/wiredtiger/src/include/txn.i
+++ b/src/third_party/wiredtiger/src/include/txn.i
@@ -13,13 +13,13 @@
*/
static inline bool
__wt_ref_cas_state_int(WT_SESSION_IMPL *session, WT_REF *ref,
- uint32_t old_state, uint32_t new_state, const char *file, int line)
+ uint32_t old_state, uint32_t new_state, const char *func, int line)
{
bool cas_result;
/* Parameters that are used in a macro for diagnostic builds */
WT_UNUSED(session);
- WT_UNUSED(file);
+ WT_UNUSED(func);
WT_UNUSED(line);
cas_result = __wt_atomic_casv32(&ref->state, old_state, new_state);
@@ -31,7 +31,7 @@ __wt_ref_cas_state_int(WT_SESSION_IMPL *session, WT_REF *ref,
* updated.
*/
if (cas_result)
- WT_REF_SAVE_STATE(ref, new_state, file, line);
+ WT_REF_SAVE_STATE(ref, new_state, func, line);
#endif
return (cas_result);
}
@@ -1081,7 +1081,8 @@ __wt_txn_search_check(WT_SESSION_IMPL *session)
* verify this transaction has one. Same if it should never have
* a read timestamp.
*/
- if (FLD_ISSET(btree->assert_flags, WT_ASSERT_READ_TS_ALWAYS) &&
+ if (!F_ISSET(S2C(session), WT_CONN_RECOVERING) &&
+ FLD_ISSET(btree->assert_flags, WT_ASSERT_READ_TS_ALWAYS) &&
!F_ISSET(txn, WT_TXN_PUBLIC_TS_READ))
WT_RET_MSG(session, EINVAL, "read_timestamp required and "
"none set on this transaction");
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index 484175dd43e..119d734d01f 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -498,11 +498,7 @@ struct __wt_cursor {
* format type \c u).
*
* The WT_CURSOR::modify method can only be called from within an
- * explicit transaction configured at a higher isolation level than
- * \c read-uncommitted. Using \c read-committed isolation is allowed,
- * but requires caution: reading a value, re-positioning the cursor
- * and then modifying the value based on the initial read could lead
- * to unexpected results. Using \c snapshot isolation is recommended.
+ * explicit transaction configured at the snapshot isolation level.
*
* The WT_CURSOR::modify method stores a change record in cache and
* writes a change record to the log instead of the usual complete
@@ -2180,7 +2176,10 @@ struct __wt_connection {
/*!
* Close a connection.
*
- * Any open sessions will be closed.
+ * Any open sessions will be closed. This will release the resources
+ * associated with the session handle, including rolling back any
+ * active transactions and closing any cursors that remain open in the
+ * session.
*
* @snippet ex_all.c Close a connection
*
@@ -5196,735 +5195,738 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1060
/*! cache: eviction server unable to reach eviction goal */
#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1061
+/*! cache: eviction server waiting for a leaf page */
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_LEAF_NOTFOUND 1062
+/*! cache: eviction server waiting for an internal page sleep (usec) */
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_INTERNAL_WAIT 1063
+/*! cache: eviction server waiting for an internal page yields */
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_INTERNAL_YIELD 1064
/*! cache: eviction state */
-#define WT_STAT_CONN_CACHE_EVICTION_STATE 1062
+#define WT_STAT_CONN_CACHE_EVICTION_STATE 1065
/*! cache: eviction walk target pages histogram - 0-9 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1063
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1066
/*! cache: eviction walk target pages histogram - 10-31 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1064
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1067
/*! cache: eviction walk target pages histogram - 128 and higher */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1065
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1068
/*! cache: eviction walk target pages histogram - 32-63 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1066
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1069
/*! cache: eviction walk target pages histogram - 64-128 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1067
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1070
/*! cache: eviction walks abandoned */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1068
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1071
/*! cache: eviction walks gave up because they restarted their walk twice */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1069
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1072
/*!
* cache: eviction walks gave up because they saw too many pages and
* found no candidates
*/
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 1070
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 1073
/*!
* cache: eviction walks gave up because they saw too many pages and
* found too few candidates
*/
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 1071
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 1074
/*! cache: eviction walks reached end of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1072
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1075
/*! cache: eviction walks started from root of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1073
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1076
/*! cache: eviction walks started from saved location in tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1074
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1077
/*! cache: eviction worker thread active */
-#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1075
+#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1078
/*! cache: eviction worker thread created */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1076
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1079
/*! cache: eviction worker thread evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1077
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1080
/*! cache: eviction worker thread removed */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1078
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1081
/*! cache: eviction worker thread stable number */
-#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1079
-/*!
- * cache: failed eviction of pages that exceeded the in-memory maximum
- * count
- */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1080
-/*!
- * cache: failed eviction of pages that exceeded the in-memory maximum
- * time (usecs)
- */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1081
+#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1082
/*! cache: files with active eviction walks */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1082
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1083
/*! cache: files with new eviction walks started */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1083
+#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 1084
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1085
+/*! cache: forced eviction - pages evicted that were clean count */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN 1086
+/*! cache: forced eviction - pages evicted that were clean time (usecs) */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_CLEAN_TIME 1087
+/*! cache: forced eviction - pages evicted that were dirty count */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY 1088
+/*! cache: forced eviction - pages evicted that were dirty time (usecs) */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DIRTY_TIME 1089
+/*!
+ * cache: forced eviction - pages selected because of too many deleted
+ * items count
+ */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1090
+/*! cache: forced eviction - pages selected count */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1091
+/*! cache: forced eviction - pages selected unable to be evicted count */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1092
+/*! cache: forced eviction - pages selected unable to be evicted time */
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1093
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1085
+#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1094
/*! cache: hazard pointer check calls */
-#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1086
+#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1095
/*! cache: hazard pointer check entries walked */
-#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1087
+#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1096
/*! cache: hazard pointer maximum array length */
-#define WT_STAT_CONN_CACHE_HAZARD_MAX 1088
+#define WT_STAT_CONN_CACHE_HAZARD_MAX 1097
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1089
+#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1098
/*! cache: in-memory page splits */
-#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1090
+#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1099
/*! cache: internal pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1091
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1100
/*! cache: internal pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1092
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1101
/*! cache: leaf pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1093
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1102
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1094
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1103
/*! cache: maximum page size at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1095
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1104
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1096
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1105
/*! cache: modified pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1097
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1106
/*! cache: operations timed out waiting for space in cache */
-#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1098
+#define WT_STAT_CONN_CACHE_TIMED_OUT_OPS 1107
/*! cache: overflow pages read into cache */
-#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1099
+#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1108
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1100
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1109
/*! cache: page written requiring cache overflow records */
-#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1101
+#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1110
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1102
-/*! cache: pages evicted because they exceeded the in-memory maximum count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1103
-/*!
- * cache: pages evicted because they exceeded the in-memory maximum time
- * (usecs)
- */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_TIME 1104
-/*! cache: pages evicted because they had chains of deleted items count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1105
-/*!
- * cache: pages evicted because they had chains of deleted items time
- * (usecs)
- */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE_TIME 1106
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1111
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1107
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1112
/*! cache: pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1108
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1113
+/*! cache: pages queued for eviction post lru sorting */
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_POST_LRU 1114
/*! cache: pages queued for urgent eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1109
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1115
/*! cache: pages queued for urgent eviction during walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1110
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1116
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1111
+#define WT_STAT_CONN_CACHE_READ 1117
/*! cache: pages read into cache after truncate */
-#define WT_STAT_CONN_CACHE_READ_DELETED 1112
+#define WT_STAT_CONN_CACHE_READ_DELETED 1118
/*! cache: pages read into cache after truncate in prepare state */
-#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1113
+#define WT_STAT_CONN_CACHE_READ_DELETED_PREPARED 1119
/*! cache: pages read into cache requiring cache overflow entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1114
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1120
/*! cache: pages read into cache requiring cache overflow for checkpoint */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_CHECKPOINT 1115
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_CHECKPOINT 1121
/*! cache: pages read into cache skipping older cache overflow entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_SKIPPED 1116
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_SKIPPED 1122
/*!
* cache: pages read into cache with skipped cache overflow entries
* needed later
*/
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_DELAY 1117
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_DELAY 1123
/*!
* cache: pages read into cache with skipped cache overflow entries
* needed later by checkpoint
*/
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_DELAY_CHECKPOINT 1118
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE_DELAY_CHECKPOINT 1124
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1119
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1125
/*! cache: pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1120
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1126
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1121
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1127
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1122
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1128
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1123
+#define WT_STAT_CONN_CACHE_WRITE 1129
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1124
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1130
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1125
+#define WT_STAT_CONN_CACHE_OVERHEAD 1131
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1126
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1132
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1127
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1133
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1128
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1134
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1129
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1135
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1130
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1136
/*! capacity: background fsync file handles considered */
-#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1131
+#define WT_STAT_CONN_FSYNC_ALL_FH_TOTAL 1137
/*! capacity: background fsync file handles synced */
-#define WT_STAT_CONN_FSYNC_ALL_FH 1132
+#define WT_STAT_CONN_FSYNC_ALL_FH 1138
/*! capacity: background fsync time (msecs) */
-#define WT_STAT_CONN_FSYNC_ALL_TIME 1133
+#define WT_STAT_CONN_FSYNC_ALL_TIME 1139
/*! capacity: bytes read */
-#define WT_STAT_CONN_CAPACITY_BYTES_READ 1134
+#define WT_STAT_CONN_CAPACITY_BYTES_READ 1140
/*! capacity: bytes written for checkpoint */
-#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1135
+#define WT_STAT_CONN_CAPACITY_BYTES_CKPT 1141
/*! capacity: bytes written for eviction */
-#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1136
+#define WT_STAT_CONN_CAPACITY_BYTES_EVICT 1142
/*! capacity: bytes written for log */
-#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1137
+#define WT_STAT_CONN_CAPACITY_BYTES_LOG 1143
/*! capacity: bytes written total */
-#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1138
+#define WT_STAT_CONN_CAPACITY_BYTES_WRITTEN 1144
/*! capacity: threshold to call fsync */
-#define WT_STAT_CONN_CAPACITY_THRESHOLD 1139
+#define WT_STAT_CONN_CAPACITY_THRESHOLD 1145
/*! capacity: time waiting due to total capacity (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1140
+#define WT_STAT_CONN_CAPACITY_TIME_TOTAL 1146
/*! capacity: time waiting during checkpoint (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1141
+#define WT_STAT_CONN_CAPACITY_TIME_CKPT 1147
/*! capacity: time waiting during eviction (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1142
+#define WT_STAT_CONN_CAPACITY_TIME_EVICT 1148
/*! capacity: time waiting during logging (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_LOG 1143
+#define WT_STAT_CONN_CAPACITY_TIME_LOG 1149
/*! capacity: time waiting during read (usecs) */
-#define WT_STAT_CONN_CAPACITY_TIME_READ 1144
+#define WT_STAT_CONN_CAPACITY_TIME_READ 1150
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1145
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1151
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1146
+#define WT_STAT_CONN_COND_AUTO_WAIT 1152
/*! connection: detected system time went backwards */
-#define WT_STAT_CONN_TIME_TRAVEL 1147
+#define WT_STAT_CONN_TIME_TRAVEL 1153
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1148
+#define WT_STAT_CONN_FILE_OPEN 1154
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1149
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1155
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1150
+#define WT_STAT_CONN_MEMORY_FREE 1156
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1151
+#define WT_STAT_CONN_MEMORY_GROW 1157
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1152
+#define WT_STAT_CONN_COND_WAIT 1158
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1153
+#define WT_STAT_CONN_RWLOCK_READ 1159
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1154
+#define WT_STAT_CONN_RWLOCK_WRITE 1160
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1155
+#define WT_STAT_CONN_FSYNC_IO 1161
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1156
+#define WT_STAT_CONN_READ_IO 1162
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1157
+#define WT_STAT_CONN_WRITE_IO 1163
/*! cursor: cached cursor count */
-#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1158
+#define WT_STAT_CONN_CURSOR_CACHED_COUNT 1164
/*! cursor: cursor bulk loaded cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT_BULK 1159
+#define WT_STAT_CONN_CURSOR_INSERT_BULK 1165
/*! cursor: cursor close calls that result in cache */
-#define WT_STAT_CONN_CURSOR_CACHE 1160
+#define WT_STAT_CONN_CURSOR_CACHE 1166
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1161
+#define WT_STAT_CONN_CURSOR_CREATE 1167
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1162
+#define WT_STAT_CONN_CURSOR_INSERT 1168
/*! cursor: cursor insert key and value bytes */
-#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1163
+#define WT_STAT_CONN_CURSOR_INSERT_BYTES 1169
/*! cursor: cursor modify calls */
-#define WT_STAT_CONN_CURSOR_MODIFY 1164
+#define WT_STAT_CONN_CURSOR_MODIFY 1170
/*! cursor: cursor modify key and value bytes affected */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1165
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES 1171
/*! cursor: cursor modify value bytes modified */
-#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1166
+#define WT_STAT_CONN_CURSOR_MODIFY_BYTES_TOUCH 1172
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1167
+#define WT_STAT_CONN_CURSOR_NEXT 1173
/*! cursor: cursor operation restarted */
-#define WT_STAT_CONN_CURSOR_RESTART 1168
+#define WT_STAT_CONN_CURSOR_RESTART 1174
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1169
+#define WT_STAT_CONN_CURSOR_PREV 1175
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1170
+#define WT_STAT_CONN_CURSOR_REMOVE 1176
/*! cursor: cursor remove key bytes removed */
-#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1171
+#define WT_STAT_CONN_CURSOR_REMOVE_BYTES 1177
/*! cursor: cursor reserve calls */
-#define WT_STAT_CONN_CURSOR_RESERVE 1172
+#define WT_STAT_CONN_CURSOR_RESERVE 1178
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1173
+#define WT_STAT_CONN_CURSOR_RESET 1179
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1174
+#define WT_STAT_CONN_CURSOR_SEARCH 1180
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1175
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1181
/*! cursor: cursor sweep buckets */
-#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1176
+#define WT_STAT_CONN_CURSOR_SWEEP_BUCKETS 1182
/*! cursor: cursor sweep cursors closed */
-#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1177
+#define WT_STAT_CONN_CURSOR_SWEEP_CLOSED 1183
/*! cursor: cursor sweep cursors examined */
-#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1178
+#define WT_STAT_CONN_CURSOR_SWEEP_EXAMINED 1184
/*! cursor: cursor sweeps */
-#define WT_STAT_CONN_CURSOR_SWEEP 1179
+#define WT_STAT_CONN_CURSOR_SWEEP 1185
/*! cursor: cursor truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1180
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1186
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1181
+#define WT_STAT_CONN_CURSOR_UPDATE 1187
/*! cursor: cursor update key and value bytes */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1182
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES 1188
/*! cursor: cursor update value size change */
-#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1183
+#define WT_STAT_CONN_CURSOR_UPDATE_BYTES_CHANGED 1189
/*! cursor: cursors reused from cache */
-#define WT_STAT_CONN_CURSOR_REOPEN 1184
+#define WT_STAT_CONN_CURSOR_REOPEN 1190
/*! cursor: open cursor count */
-#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1185
+#define WT_STAT_CONN_CURSOR_OPEN_COUNT 1191
/*! data-handle: connection data handle size */
-#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1186
+#define WT_STAT_CONN_DH_CONN_HANDLE_SIZE 1192
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1187
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1193
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1188
+#define WT_STAT_CONN_DH_SWEEP_REF 1194
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1189
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1195
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1190
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1196
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1191
+#define WT_STAT_CONN_DH_SWEEP_TOD 1197
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1192
+#define WT_STAT_CONN_DH_SWEEPS 1198
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1193
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1199
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1194
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1200
/*! lock: checkpoint lock acquisitions */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1195
+#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1201
/*! lock: checkpoint lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1196
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1202
/*! lock: checkpoint lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1197
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1203
/*!
* lock: commit timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WAIT_APPLICATION 1198
+#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WAIT_APPLICATION 1204
/*! lock: commit timestamp queue lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WAIT_INTERNAL 1199
+#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WAIT_INTERNAL 1205
/*! lock: commit timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_READ_COUNT 1200
+#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_READ_COUNT 1206
/*! lock: commit timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WRITE_COUNT 1201
+#define WT_STAT_CONN_LOCK_COMMIT_TIMESTAMP_WRITE_COUNT 1207
/*! lock: dhandle lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1202
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1208
/*! lock: dhandle lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1203
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1209
/*! lock: dhandle read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1204
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1210
/*! lock: dhandle write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1205
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1211
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1206
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1212
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1207
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1213
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1208
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1214
/*!
* lock: read timestamp queue lock application thread time waiting
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1209
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_APPLICATION 1215
/*! lock: read timestamp queue lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1210
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WAIT_INTERNAL 1216
/*! lock: read timestamp queue read lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1211
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_READ_COUNT 1217
/*! lock: read timestamp queue write lock acquisitions */
-#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1212
+#define WT_STAT_CONN_LOCK_READ_TIMESTAMP_WRITE_COUNT 1218
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1213
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1219
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1214
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1220
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1215
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1221
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1216
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1222
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1217
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1223
/*! lock: table read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1218
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1224
/*! lock: table write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1219
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1225
/*! lock: txn global lock application thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1220
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_APPLICATION 1226
/*! lock: txn global lock internal thread time waiting (usecs) */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1221
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WAIT_INTERNAL 1227
/*! lock: txn global read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1222
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_READ_COUNT 1228
/*! lock: txn global write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1223
+#define WT_STAT_CONN_LOCK_TXN_GLOBAL_WRITE_COUNT 1229
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1224
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1230
/*! log: force archive time sleeping (usecs) */
-#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1225
+#define WT_STAT_CONN_LOG_FORCE_ARCHIVE_SLEEP 1231
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1226
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1232
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1227
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1233
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1228
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1234
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1229
+#define WT_STAT_CONN_LOG_FLUSH 1235
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1230
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1236
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1231
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1237
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1232
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1238
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1233
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1239
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1234
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1240
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1235
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1241
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1236
+#define WT_STAT_CONN_LOG_SCANS 1242
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1237
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1243
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1238
+#define WT_STAT_CONN_LOG_WRITE_LSN 1244
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1239
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1245
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1240
+#define WT_STAT_CONN_LOG_SYNC 1246
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1241
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1247
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1242
+#define WT_STAT_CONN_LOG_SYNC_DIR 1248
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1243
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1249
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1244
+#define WT_STAT_CONN_LOG_WRITES 1250
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1245
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1251
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1246
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1252
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1247
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1253
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1248
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1254
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1249
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1255
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1250
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1256
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1251
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1257
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1252
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1258
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1253
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1259
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1254
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1260
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1255
+#define WT_STAT_CONN_LOG_SLOT_RACES 1261
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1256
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1262
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1257
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1263
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1258
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1264
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1259
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1265
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1260
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1266
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1261
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1267
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1262
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1268
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1263
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1269
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1264
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1270
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1265
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1271
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1266
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1272
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1267
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1273
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1268
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1274
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1269
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1275
/*! perf: file system read latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1270
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT50 1276
/*! perf: file system read latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1271
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT100 1277
/*! perf: file system read latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1272
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT250 1278
/*! perf: file system read latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1273
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT500 1279
/*! perf: file system read latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1274
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_LT1000 1280
/*! perf: file system read latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1275
+#define WT_STAT_CONN_PERF_HIST_FSREAD_LATENCY_GT1000 1281
/*! perf: file system write latency histogram (bucket 1) - 10-49ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1276
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT50 1282
/*! perf: file system write latency histogram (bucket 2) - 50-99ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1277
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT100 1283
/*! perf: file system write latency histogram (bucket 3) - 100-249ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1278
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT250 1284
/*! perf: file system write latency histogram (bucket 4) - 250-499ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1279
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT500 1285
/*! perf: file system write latency histogram (bucket 5) - 500-999ms */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1280
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_LT1000 1286
/*! perf: file system write latency histogram (bucket 6) - 1000ms+ */
-#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1281
+#define WT_STAT_CONN_PERF_HIST_FSWRITE_LATENCY_GT1000 1287
/*! perf: operation read latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1282
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT250 1288
/*! perf: operation read latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1283
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT500 1289
/*! perf: operation read latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1284
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT1000 1290
/*! perf: operation read latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1285
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_LT10000 1291
/*! perf: operation read latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1286
+#define WT_STAT_CONN_PERF_HIST_OPREAD_LATENCY_GT10000 1292
/*! perf: operation write latency histogram (bucket 1) - 100-249us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1287
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT250 1293
/*! perf: operation write latency histogram (bucket 2) - 250-499us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1288
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT500 1294
/*! perf: operation write latency histogram (bucket 3) - 500-999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1289
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT1000 1295
/*! perf: operation write latency histogram (bucket 4) - 1000-9999us */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1290
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_LT10000 1296
/*! perf: operation write latency histogram (bucket 5) - 10000us+ */
-#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1291
+#define WT_STAT_CONN_PERF_HIST_OPWRITE_LATENCY_GT10000 1297
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1292
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1298
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1293
+#define WT_STAT_CONN_REC_PAGES 1299
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1294
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1300
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1295
+#define WT_STAT_CONN_REC_PAGE_DELETE 1301
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1296
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1302
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1297
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1303
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1298
+#define WT_STAT_CONN_SESSION_OPEN 1304
/*! session: session query timestamp calls */
-#define WT_STAT_CONN_SESSION_QUERY_TS 1299
+#define WT_STAT_CONN_SESSION_QUERY_TS 1305
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1300
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1306
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1301
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1307
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1302
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1308
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1303
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1309
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1304
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1310
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1305
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1311
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1306
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1312
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1307
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1313
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1308
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1314
/*! session: table import failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_IMPORT_FAIL 1309
+#define WT_STAT_CONN_SESSION_TABLE_IMPORT_FAIL 1315
/*! session: table import successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_IMPORT_SUCCESS 1310
+#define WT_STAT_CONN_SESSION_TABLE_IMPORT_SUCCESS 1316
/*! session: table rebalance failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1311
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1317
/*! session: table rebalance successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1312
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1318
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1313
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1319
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1314
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1320
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1315
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1321
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1316
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1322
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1317
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1323
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1318
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1324
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1319
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1325
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1320
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1326
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1321
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1327
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1322
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1328
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1323
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1329
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1324
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1330
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1325
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1331
/*!
* thread-yield: connection close blocked waiting for transaction state
* stabilization
*/
-#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1326
+#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1332
/*! thread-yield: connection close yielded for lsm manager shutdown */
-#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1327
+#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1333
/*! thread-yield: data handle lock yielded */
-#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1328
+#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1334
/*!
* thread-yield: get reference for page index and slot time sleeping
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1329
+#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1335
/*! thread-yield: log server sync yielded for log write */
-#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1330
+#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1336
/*! thread-yield: page access yielded due to prepare state change */
-#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1331
+#define WT_STAT_CONN_PREPARED_TRANSITION_BLOCKED_PAGE 1337
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1332
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1338
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1333
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1339
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1334
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1340
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1335
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1341
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1336
+#define WT_STAT_CONN_PAGE_SLEEP 1342
/*!
* thread-yield: page delete rollback time sleeping for state change
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1337
+#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1343
/*! thread-yield: page reconciliation yielded due to child modification */
-#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1338
+#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1344
/*! transaction: Number of prepared updates */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COUNT 1339
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_COUNT 1345
/*! transaction: Number of prepared updates added to cache overflow */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_LOOKASIDE_INSERTS 1340
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_LOOKASIDE_INSERTS 1346
/*! transaction: Number of prepared updates resolved */
-#define WT_STAT_CONN_TXN_PREPARED_UPDATES_RESOLVED 1341
+#define WT_STAT_CONN_TXN_PREPARED_UPDATES_RESOLVED 1347
/*! transaction: commit timestamp queue entries walked */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_WALKED 1342
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_WALKED 1348
/*! transaction: commit timestamp queue insert to empty */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_EMPTY 1343
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_EMPTY 1349
/*! transaction: commit timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1344
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1350
/*! transaction: commit timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1345
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1351
/*! transaction: commit timestamp queue length */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1346
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1352
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1347
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1353
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1348
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1354
/*! transaction: prepared transactions */
-#define WT_STAT_CONN_TXN_PREPARE 1349
+#define WT_STAT_CONN_TXN_PREPARE 1355
/*! transaction: prepared transactions committed */
-#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1350
+#define WT_STAT_CONN_TXN_PREPARE_COMMIT 1356
/*! transaction: prepared transactions currently active */
-#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1351
+#define WT_STAT_CONN_TXN_PREPARE_ACTIVE 1357
/*! transaction: prepared transactions rolled back */
-#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1352
+#define WT_STAT_CONN_TXN_PREPARE_ROLLBACK 1358
/*! transaction: query timestamp calls */
-#define WT_STAT_CONN_TXN_QUERY_TS 1353
+#define WT_STAT_CONN_TXN_QUERY_TS 1359
/*! transaction: read timestamp queue entries walked */
-#define WT_STAT_CONN_TXN_READ_QUEUE_WALKED 1354
+#define WT_STAT_CONN_TXN_READ_QUEUE_WALKED 1360
/*! transaction: read timestamp queue insert to empty */
-#define WT_STAT_CONN_TXN_READ_QUEUE_EMPTY 1355
+#define WT_STAT_CONN_TXN_READ_QUEUE_EMPTY 1361
/*! transaction: read timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1356
+#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1362
/*! transaction: read timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1357
+#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1363
/*! transaction: read timestamp queue length */
-#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1358
+#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1364
/*! transaction: rollback to stable calls */
-#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE 1359
+#define WT_STAT_CONN_TXN_ROLLBACK_TO_STABLE 1365
/*! transaction: rollback to stable updates aborted */
-#define WT_STAT_CONN_TXN_ROLLBACK_UPD_ABORTED 1360
+#define WT_STAT_CONN_TXN_ROLLBACK_UPD_ABORTED 1366
/*! transaction: rollback to stable updates removed from cache overflow */
-#define WT_STAT_CONN_TXN_ROLLBACK_LAS_REMOVED 1361
+#define WT_STAT_CONN_TXN_ROLLBACK_LAS_REMOVED 1367
/*! transaction: set timestamp calls */
-#define WT_STAT_CONN_TXN_SET_TS 1362
+#define WT_STAT_CONN_TXN_SET_TS 1368
/*! transaction: set timestamp commit calls */
-#define WT_STAT_CONN_TXN_SET_TS_COMMIT 1363
+#define WT_STAT_CONN_TXN_SET_TS_COMMIT 1369
/*! transaction: set timestamp commit updates */
-#define WT_STAT_CONN_TXN_SET_TS_COMMIT_UPD 1364
+#define WT_STAT_CONN_TXN_SET_TS_COMMIT_UPD 1370
/*! transaction: set timestamp oldest calls */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1365
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST 1371
/*! transaction: set timestamp oldest updates */
-#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1366
+#define WT_STAT_CONN_TXN_SET_TS_OLDEST_UPD 1372
/*! transaction: set timestamp stable calls */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE 1367
+#define WT_STAT_CONN_TXN_SET_TS_STABLE 1373
/*! transaction: set timestamp stable updates */
-#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1368
+#define WT_STAT_CONN_TXN_SET_TS_STABLE_UPD 1374
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1369
+#define WT_STAT_CONN_TXN_BEGIN 1375
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1370
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1376
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1371
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1377
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1372
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1378
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1373
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1379
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1374
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1380
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1375
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1381
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1376
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1382
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1377
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1383
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1378
+#define WT_STAT_CONN_TXN_CHECKPOINT 1384
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1379
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1385
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1380
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1386
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1381
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1387
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1382
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1388
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1383
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1389
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1384
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1390
/*!
* transaction: transaction range of IDs currently pinned by named
* snapshots
*/
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1385
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1391
/*! transaction: transaction range of timestamps currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1386
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1392
/*! transaction: transaction range of timestamps pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1387
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_CHECKPOINT 1393
/*!
* transaction: transaction range of timestamps pinned by the oldest
* active read timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1388
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_READER 1394
/*!
* transaction: transaction range of timestamps pinned by the oldest
* timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1389
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1395
/*! transaction: transaction read timestamp of the oldest active reader */
-#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1390
+#define WT_STAT_CONN_TXN_TIMESTAMP_OLDEST_ACTIVE_READ 1396
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1391
+#define WT_STAT_CONN_TXN_SYNC 1397
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1392
+#define WT_STAT_CONN_TXN_COMMIT 1398
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1393
+#define WT_STAT_CONN_TXN_ROLLBACK 1399
/*! transaction: update conflicts */
-#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1394
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1400
/*!
* @}
diff --git a/src/third_party/wiredtiger/src/lsm/lsm_manager.c b/src/third_party/wiredtiger/src/lsm/lsm_manager.c
index d1eceaf2afd..aa5f08034d4 100644
--- a/src/third_party/wiredtiger/src/lsm/lsm_manager.c
+++ b/src/third_party/wiredtiger/src/lsm/lsm_manager.c
@@ -339,12 +339,6 @@ __wt_lsm_manager_destroy(WT_SESSION_IMPL *session)
}
WT_STAT_CONN_INCRV(session, lsm_work_units_discarded, removed);
- /* Free resources that are allocated in connection initialize */
- __wt_spin_destroy(session, &manager->switch_lock);
- __wt_spin_destroy(session, &manager->app_lock);
- __wt_spin_destroy(session, &manager->manager_lock);
- __wt_cond_destroy(session, &manager->work_cond);
-
return (ret);
}
diff --git a/src/third_party/wiredtiger/src/meta/meta_ckpt.c b/src/third_party/wiredtiger/src/meta/meta_ckpt.c
index 35b6389bced..49b2d2a2a2d 100644
--- a/src/third_party/wiredtiger/src/meta/meta_ckpt.c
+++ b/src/third_party/wiredtiger/src/meta/meta_ckpt.c
@@ -351,8 +351,12 @@ __wt_meta_ckptlist_get(WT_SESSION_IMPL *session,
__wt_config_getones(session, config, "checkpoint", &v)) == 0) {
__wt_config_subinit(session, &ckptconf, &v);
for (; __wt_config_next(&ckptconf, &k, &v) == 0; ++slot) {
+ /*
+ * Allocate a slot for a new value, plus a slot to mark
+ * the end.
+ */
WT_ERR(__wt_realloc_def(
- session, &allocated, slot + 1, &ckptbase));
+ session, &allocated, slot + 2, &ckptbase));
ckpt = &ckptbase[slot];
WT_ERR(__ckpt_load(session, &k, &v, ckpt));
@@ -367,9 +371,6 @@ __wt_meta_ckptlist_get(WT_SESSION_IMPL *session,
if (update) {
/*
- * Allocate an extra slot for a new value, plus a slot to mark
- * mark the end.
- *
* This isn't clean, but there's necessary cooperation between
* the schema layer (that maintains the list of checkpoints),
* the btree layer (that knows when the root page is written,
@@ -377,6 +378,8 @@ __wt_meta_ckptlist_get(WT_SESSION_IMPL *session,
* actually creates the checkpoint). All of that cooperation is
* handled in the array of checkpoint structures referenced from
* the WT_BTREE structure.
+ *
+ * Allocate a slot for a new value, plus a slot to mark the end.
*/
WT_ERR(__wt_realloc_def(
session, &allocated, slot + 2, &ckptbase));
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c
index 2766e74f92c..9222272767b 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_visibility.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_visibility.c
@@ -424,9 +424,9 @@ __wt_rec_upd_select(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins,
r->unstable_txn = first_upd->txnid;
if (first_ts_upd != NULL) {
WT_ASSERT(session,
- first_ts_upd->prepare_state ==
- WT_PREPARE_INPROGRESS ||
- first_ts_upd->start_ts <= first_ts_upd->durable_ts);
+ first_ts_upd->prepare_state ==
+ WT_PREPARE_INPROGRESS ||
+ first_ts_upd->start_ts <= first_ts_upd->durable_ts);
if (r->unstable_timestamp < first_ts_upd->start_ts)
r->unstable_timestamp = first_ts_upd->start_ts;
@@ -452,8 +452,8 @@ __wt_rec_upd_select(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins,
* both will be set.
*/
WT_ASSERT(session,
- upd->prepare_state == WT_PREPARE_INPROGRESS ||
- upd->durable_ts >= upd->start_ts);
+ upd->prepare_state == WT_PREPARE_INPROGRESS ||
+ upd->durable_ts >= upd->start_ts);
if (r->unstable_timestamp > upd->start_ts)
r->unstable_timestamp = upd->start_ts;
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_write.c b/src/third_party/wiredtiger/src/reconcile/rec_write.c
index 7193e6f2b2c..5a78f0df88d 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_write.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_write.c
@@ -639,8 +639,7 @@ __rec_init(WT_SESSION_IMPL *session,
else
r->las_skew_newest =
LF_ISSET(WT_REC_LOOKASIDE) && LF_ISSET(WT_REC_VISIBLE_ALL);
- r->las_skew_newest =
- LF_ISSET(WT_REC_LOOKASIDE) && LF_ISSET(WT_REC_VISIBLE_ALL);
+
if (r->las_skew_newest &&
!__wt_btree_immediately_durable(session) &&
txn_global->has_stable_timestamp &&
diff --git a/src/third_party/wiredtiger/src/session/session_api.c b/src/third_party/wiredtiger/src/session/session_api.c
index 4e1742a89db..7db62d29738 100644
--- a/src/third_party/wiredtiger/src/session/session_api.c
+++ b/src/third_party/wiredtiger/src/session/session_api.c
@@ -1127,6 +1127,8 @@ __session_import(WT_SESSION *wt_session, const char *uri, const char *config)
WT_UNUSED(config);
+ value = NULL;
+
session = (WT_SESSION_IMPL *)wt_session;
SESSION_API_CALL_NOCONF(session, import);
@@ -1148,6 +1150,7 @@ err:
WT_STAT_CONN_INCR(session, session_table_import_fail);
else
WT_STAT_CONN_INCR(session, session_table_import_success);
+ __wt_free(session, value);
API_END_RET_NOTFOUND_MAP(session, ret);
}
diff --git a/src/third_party/wiredtiger/src/support/hazard.c b/src/third_party/wiredtiger/src/support/hazard.c
index 52f77b5b232..a44f349e3e5 100644
--- a/src/third_party/wiredtiger/src/support/hazard.c
+++ b/src/third_party/wiredtiger/src/support/hazard.c
@@ -208,9 +208,7 @@ __wt_hazard_clear(WT_SESSION_IMPL *session, WT_REF *ref)
* We don't publish the hazard pointer clear in the
* general case. It's not required for correctness;
* it gives an eviction thread faster access to the
- * page were the page selected for eviction, but the
- * generation number was just set, it's unlikely the
- * page will be selected for eviction.
+ * page were the page selected for eviction.
*/
hp->ref = NULL;
@@ -330,6 +328,10 @@ __wt_hazard_check(WT_SESSION_IMPL *session,
WT_SESSION_IMPL *s;
uint32_t i, j, hazard_inuse, max, session_cnt, walk_cnt;
+ /* If a file can never be evicted, hazard pointers aren't required. */
+ if (F_ISSET(S2BT(session), WT_BTREE_IN_MEMORY))
+ return (NULL);
+
conn = S2C(session);
WT_STAT_CONN_INCR(session, cache_hazard_checks);
diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c
index e76930c3b38..95e04dd7d7c 100644
--- a/src/third_party/wiredtiger/src/support/stat.c
+++ b/src/third_party/wiredtiger/src/support/stat.c
@@ -827,6 +827,9 @@ static const char * const __stats_connection_desc[] = {
"cache: eviction server evicting pages",
"cache: eviction server slept, because we did not make progress with eviction",
"cache: eviction server unable to reach eviction goal",
+ "cache: eviction server waiting for a leaf page",
+ "cache: eviction server waiting for an internal page sleep (usec)",
+ "cache: eviction server waiting for an internal page yields",
"cache: eviction state",
"cache: eviction walk target pages histogram - 0-9",
"cache: eviction walk target pages histogram - 10-31",
@@ -845,11 +848,17 @@ static const char * const __stats_connection_desc[] = {
"cache: eviction worker thread evicting pages",
"cache: eviction worker thread removed",
"cache: eviction worker thread stable number",
- "cache: failed eviction of pages that exceeded the in-memory maximum count",
- "cache: failed eviction of pages that exceeded the in-memory maximum time (usecs)",
"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 - 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",
+ "cache: forced eviction - pages evicted that were dirty time (usecs)",
+ "cache: forced eviction - pages selected because of too many deleted items count",
+ "cache: forced eviction - pages selected count",
+ "cache: forced eviction - pages selected unable to be evicted count",
+ "cache: forced eviction - pages selected unable to be evicted time",
"cache: hazard pointer blocked page eviction",
"cache: hazard pointer check calls",
"cache: hazard pointer check entries walked",
@@ -868,12 +877,9 @@ static const char * const __stats_connection_desc[] = {
"cache: page split during eviction deepened the tree",
"cache: page written requiring cache overflow records",
"cache: pages currently held in the cache",
- "cache: pages evicted because they exceeded the in-memory maximum count",
- "cache: pages evicted because they exceeded the in-memory maximum time (usecs)",
- "cache: pages evicted because they had chains of deleted items count",
- "cache: pages evicted because they had chains of deleted items time (usecs)",
"cache: pages evicted by application threads",
"cache: pages queued for eviction",
+ "cache: pages queued for eviction post lru sorting",
"cache: pages queued for urgent eviction",
"cache: pages queued for urgent eviction during walk",
"cache: pages read into cache",
@@ -1264,6 +1270,9 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_server_evicting = 0;
stats->cache_eviction_server_slept = 0;
stats->cache_eviction_slow = 0;
+ stats->cache_eviction_walk_leaf_notfound = 0;
+ stats->cache_eviction_walk_internal_wait = 0;
+ stats->cache_eviction_walk_internal_yield = 0;
/* not clearing cache_eviction_state */
stats->cache_eviction_target_page_lt10 = 0;
stats->cache_eviction_target_page_lt32 = 0;
@@ -1282,11 +1291,17 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_worker_evicting = 0;
stats->cache_eviction_worker_removed = 0;
/* not clearing cache_eviction_stable_state_workers */
- stats->cache_eviction_force_fail = 0;
- stats->cache_eviction_force_fail_time = 0;
/* not clearing cache_eviction_walks_active */
stats->cache_eviction_walks_started = 0;
stats->cache_eviction_force_retune = 0;
+ stats->cache_eviction_force_clean = 0;
+ stats->cache_eviction_force_clean_time = 0;
+ stats->cache_eviction_force_dirty = 0;
+ stats->cache_eviction_force_dirty_time = 0;
+ stats->cache_eviction_force_delete = 0;
+ stats->cache_eviction_force = 0;
+ stats->cache_eviction_force_fail = 0;
+ stats->cache_eviction_force_fail_time = 0;
stats->cache_eviction_hazard = 0;
stats->cache_hazard_checks = 0;
stats->cache_hazard_walks = 0;
@@ -1305,12 +1320,9 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_eviction_deepen = 0;
stats->cache_write_lookaside = 0;
/* not clearing cache_pages_inuse */
- stats->cache_eviction_force = 0;
- stats->cache_eviction_force_time = 0;
- stats->cache_eviction_force_delete = 0;
- stats->cache_eviction_force_delete_time = 0;
stats->cache_eviction_app = 0;
stats->cache_eviction_pages_queued = 0;
+ stats->cache_eviction_pages_queued_post_lru = 0;
stats->cache_eviction_pages_queued_urgent = 0;
stats->cache_eviction_pages_queued_oldest = 0;
stats->cache_read = 0;
@@ -1704,6 +1716,12 @@ __wt_stat_connection_aggregate(
to->cache_eviction_server_slept +=
WT_STAT_READ(from, cache_eviction_server_slept);
to->cache_eviction_slow += WT_STAT_READ(from, cache_eviction_slow);
+ to->cache_eviction_walk_leaf_notfound +=
+ WT_STAT_READ(from, cache_eviction_walk_leaf_notfound);
+ to->cache_eviction_walk_internal_wait +=
+ WT_STAT_READ(from, cache_eviction_walk_internal_wait);
+ to->cache_eviction_walk_internal_yield +=
+ WT_STAT_READ(from, cache_eviction_walk_internal_yield);
to->cache_eviction_state += WT_STAT_READ(from, cache_eviction_state);
to->cache_eviction_target_page_lt10 +=
WT_STAT_READ(from, cache_eviction_target_page_lt10);
@@ -1739,16 +1757,27 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, cache_eviction_worker_removed);
to->cache_eviction_stable_state_workers +=
WT_STAT_READ(from, cache_eviction_stable_state_workers);
- to->cache_eviction_force_fail +=
- WT_STAT_READ(from, cache_eviction_force_fail);
- to->cache_eviction_force_fail_time +=
- WT_STAT_READ(from, cache_eviction_force_fail_time);
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_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);
+ to->cache_eviction_force_dirty_time +=
+ WT_STAT_READ(from, cache_eviction_force_dirty_time);
+ to->cache_eviction_force_delete +=
+ WT_STAT_READ(from, cache_eviction_force_delete);
+ to->cache_eviction_force += WT_STAT_READ(from, cache_eviction_force);
+ to->cache_eviction_force_fail +=
+ WT_STAT_READ(from, cache_eviction_force_fail);
+ to->cache_eviction_force_fail_time +=
+ WT_STAT_READ(from, cache_eviction_force_fail_time);
to->cache_eviction_hazard +=
WT_STAT_READ(from, cache_eviction_hazard);
to->cache_hazard_checks += WT_STAT_READ(from, cache_hazard_checks);
@@ -1777,16 +1806,11 @@ __wt_stat_connection_aggregate(
to->cache_write_lookaside +=
WT_STAT_READ(from, cache_write_lookaside);
to->cache_pages_inuse += WT_STAT_READ(from, cache_pages_inuse);
- to->cache_eviction_force += WT_STAT_READ(from, cache_eviction_force);
- to->cache_eviction_force_time +=
- WT_STAT_READ(from, cache_eviction_force_time);
- to->cache_eviction_force_delete +=
- WT_STAT_READ(from, cache_eviction_force_delete);
- to->cache_eviction_force_delete_time +=
- WT_STAT_READ(from, cache_eviction_force_delete_time);
to->cache_eviction_app += WT_STAT_READ(from, cache_eviction_app);
to->cache_eviction_pages_queued +=
WT_STAT_READ(from, cache_eviction_pages_queued);
+ to->cache_eviction_pages_queued_post_lru +=
+ WT_STAT_READ(from, cache_eviction_pages_queued_post_lru);
to->cache_eviction_pages_queued_urgent +=
WT_STAT_READ(from, cache_eviction_pages_queued_urgent);
to->cache_eviction_pages_queued_oldest +=
diff --git a/src/third_party/wiredtiger/src/txn/txn.c b/src/third_party/wiredtiger/src/txn/txn.c
index 53bde4a499b..f7c94399710 100644
--- a/src/third_party/wiredtiger/src/txn/txn.c
+++ b/src/third_party/wiredtiger/src/txn/txn.c
@@ -804,13 +804,13 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
int64_t resolved_update_count, visited_update_count;
uint32_t fileid;
u_int i;
- bool locked, prepare, readonly, update_timestamp;
+ bool locked, prepare, readonly, skip_update_assert, update_timestamp;
txn = &session->txn;
conn = S2C(session);
txn_global = &conn->txn_global;
prev_commit_timestamp = 0; /* -Wconditional-uninitialized */
- locked = false;
+ locked = skip_update_assert = false;
resolved_update_count = visited_update_count = 0;
WT_ASSERT(session, F_ISSET(txn, WT_TXN_RUNNING));
@@ -843,7 +843,7 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
"transaction");
WT_ASSERT(session,
- txn->prepare_timestamp <= txn->commit_timestamp);
+ txn->prepare_timestamp <= txn->commit_timestamp);
} else {
if (F_ISSET(txn, WT_TXN_HAS_TS_PREPARE))
WT_ERR_MSG(session, EINVAL,
@@ -987,10 +987,15 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
* it would have happened on a previous
* modification in this txn.
*/
- if (!F_ISSET(op, WT_TXN_OP_KEY_REPEATED))
+ if (!F_ISSET(op, WT_TXN_OP_KEY_REPEATED)) {
+ skip_update_assert =
+ skip_update_assert ||
+ F_ISSET(op, WT_TXN_OP_KEY_RESERVED);
WT_ERR(__wt_txn_resolve_prepared_op(
session, op, true,
&resolved_update_count));
+ }
+
/*
* We should resolve at least one or more
* updates each time we call
@@ -1015,7 +1020,8 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
__wt_txn_op_free(session, op);
}
- WT_ASSERT(session, resolved_update_count == visited_update_count);
+ WT_ASSERT(session, skip_update_assert ||
+ resolved_update_count == visited_update_count);
WT_STAT_CONN_INCRV(session, txn_prepared_updates_resolved,
resolved_update_count);
@@ -1123,8 +1129,14 @@ __wt_txn_prepare(WT_SESSION_IMPL *session, const char *cfg[])
WT_RET(__wt_session_copy_values(session));
}
- /* Prepare updates. */
- for (i = 0, op = txn->mod; i < txn->mod_count; i++, op++) {
+ /*
+ * Prepare updates, traverse the modification array in reverse order
+ * so that we visit the update chain in newest to oldest order
+ * allowing us to set the key repeated flag with reserved updates in
+ * the chain.
+ */
+ for (i = txn->mod_count; i > 0; i--) {
+ op = &txn->mod[i - 1];
/* Assert it's not an update to the lookaside file. */
WT_ASSERT(session, S2C(session)->cache->las_fileid == 0 ||
!F_ISSET(op->btree, WT_BTREE_LOOKASIDE));
@@ -1165,9 +1177,23 @@ __wt_txn_prepare(WT_SESSION_IMPL *session, const char *cfg[])
* Set the key repeated flag which tells us that we've
* got multiple updates to the same key by the same txn.
* This is later used in txn commit.
+ *
+ * When we see a reserved update we set the
+ * WT_UPDATE_RESERVED flag instead. We do this as we
+ * cannot know if our current update should specify the
+ * key repeated flag as we don't want to traverse the
+ * entire update chain to find out. i.e. if there is
+ * an update with our txnid after the reserved update
+ * we should set key repeated, but if there isn't we
+ * shouldn't.
*/
- if (upd->next != NULL && upd->txnid == upd->next->txnid)
- F_SET(op, WT_TXN_OP_KEY_REPEATED);
+ if (upd->next != NULL &&
+ upd->txnid == upd->next->txnid) {
+ if (upd->next->type == WT_UPDATE_RESERVE)
+ F_SET(op, WT_TXN_OP_KEY_RESERVED);
+ else
+ F_SET(op, WT_TXN_OP_KEY_REPEATED);
+ }
break;
case WT_TXN_OP_REF_DELETE:
__wt_txn_op_apply_prepare_state(
@@ -1209,12 +1235,13 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
WT_UPDATE *upd;
int64_t resolved_update_count, visited_update_count;
u_int i;
- bool readonly;
+ bool readonly, skip_update_assert;
WT_UNUSED(cfg);
resolved_update_count = visited_update_count = 0;
txn = &session->txn;
readonly = txn->mod_count == 0;
+ skip_update_assert = false;
WT_ASSERT(session, F_ISSET(txn, WT_TXN_RUNNING));
/* Rollback notification. */
@@ -1254,10 +1281,14 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
* it would have happened on a previous
* modification in this txn.
*/
- if (!F_ISSET(op, WT_TXN_OP_KEY_REPEATED))
+ if (!F_ISSET(op, WT_TXN_OP_KEY_REPEATED)) {
+ skip_update_assert =
+ skip_update_assert ||
+ F_ISSET(op, WT_TXN_OP_KEY_RESERVED);
WT_RET(__wt_txn_resolve_prepared_op(
session, op, false,
&resolved_update_count));
+ }
/*
* We should resolve at least one or more
* updates each time we call
@@ -1290,7 +1321,8 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
__wt_txn_op_free(session, op);
}
- WT_ASSERT(session, resolved_update_count == visited_update_count);
+ WT_ASSERT(session, skip_update_assert ||
+ resolved_update_count == visited_update_count);
WT_STAT_CONN_INCRV(session, txn_prepared_updates_resolved,
resolved_update_count);