summaryrefslogtreecommitdiff
path: root/src/third_party
diff options
context:
space:
mode:
authorRamon Fernandez <ramon@mongodb.com>2017-11-17 13:50:11 -0500
committerRamon Fernandez <ramon@mongodb.com>2017-11-17 13:50:11 -0500
commitaaf2b7c407846ad28719a8efe610a4dba047dbac (patch)
tree2397257b76720f932a4348f0ee584c86ffdba6b0 /src/third_party
parent60ab064909d30d982efcc3898cb374508dd54001 (diff)
downloadmongo-aaf2b7c407846ad28719a8efe610a4dba047dbac.tar.gz
Import wiredtiger: 923937e6b2bb7ffc1ff86bfaa8c2f130930286de from branch mongodb-3.6
ref: ce5ee5097b..923937e6b2 for: 3.6.0-rc5 WT-3444 Test format on PPC fails with ENOTSUP when performing an update on an LSM tree WT-3745 Don't stall reads due to write pressure WT-3746 Don't busy wait when syncing the log and waiting for writes to complete
Diffstat (limited to 'src/third_party')
-rw-r--r--src/third_party/wiredtiger/dist/stat_data.py1
-rw-r--r--src/third_party/wiredtiger/import.data2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_compact.c2
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curnext.c1
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_curprev.c1
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_read.c41
-rw-r--r--src/third_party/wiredtiger/src/btree/bt_split.c2
-rw-r--r--src/third_party/wiredtiger/src/cache/cache_las.c8
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_cache.c41
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_cache_pool.c2
-rw-r--r--src/third_party/wiredtiger/src/evict/evict_lru.c51
-rw-r--r--src/third_party/wiredtiger/src/include/btmem.h1
-rw-r--r--src/third_party/wiredtiger/src/include/btree.i49
-rw-r--r--src/third_party/wiredtiger/src/include/cache.h2
-rw-r--r--src/third_party/wiredtiger/src/include/cache.i16
-rw-r--r--src/third_party/wiredtiger/src/include/cursor.i2
-rw-r--r--src/third_party/wiredtiger/src/include/extern.h2
-rw-r--r--src/third_party/wiredtiger/src/include/stat.h1
-rw-r--r--src/third_party/wiredtiger/src/include/txn.i18
-rw-r--r--src/third_party/wiredtiger/src/include/wiredtiger.in512
-rw-r--r--src/third_party/wiredtiger/src/log/log.c4
-rw-r--r--src/third_party/wiredtiger/src/lsm/lsm_tree.c50
-rw-r--r--src/third_party/wiredtiger/src/reconcile/rec_write.c9
-rw-r--r--src/third_party/wiredtiger/src/support/stat.c4
-rw-r--r--src/third_party/wiredtiger/src/txn/txn.c19
25 files changed, 485 insertions, 356 deletions
diff --git a/src/third_party/wiredtiger/dist/stat_data.py b/src/third_party/wiredtiger/dist/stat_data.py
index 44eb743479d..bbb581e904e 100644
--- a/src/third_party/wiredtiger/dist/stat_data.py
+++ b/src/third_party/wiredtiger/dist/stat_data.py
@@ -190,6 +190,7 @@ connection_stats = [
CacheStat('cache_bytes_internal', 'tracked bytes belonging to internal pages in the cache', 'no_clear,no_scale,size'),
CacheStat('cache_bytes_inuse', 'bytes currently in the cache', 'no_clear,no_scale,size'),
CacheStat('cache_bytes_leaf', 'tracked bytes belonging to leaf pages in the cache', 'no_clear,no_scale,size'),
+ CacheStat('cache_bytes_lookaside', 'bytes belonging to the lookaside table in the cache', 'no_clear,no_scale,size'),
CacheStat('cache_bytes_max', 'maximum bytes configured', 'no_clear,no_scale,size'),
CacheStat('cache_bytes_other', 'bytes not belonging to page images in the cache', 'no_clear,no_scale,size'),
CacheStat('cache_bytes_read', 'bytes read into cache', 'size'),
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data
index 194a0b2e3c4..cf67d077b45 100644
--- a/src/third_party/wiredtiger/import.data
+++ b/src/third_party/wiredtiger/import.data
@@ -1,5 +1,5 @@
{
- "commit": "ce5ee5097b499fb1bfa8a7ccb20e1618b68b3378",
+ "commit": "923937e6b2bb7ffc1ff86bfaa8c2f130930286de",
"github": "wiredtiger/wiredtiger.git",
"vendor": "wiredtiger",
"branch": "mongodb-3.6"
diff --git a/src/third_party/wiredtiger/src/btree/bt_compact.c b/src/third_party/wiredtiger/src/btree/bt_compact.c
index 1a39b479ae8..cbc19df65fa 100644
--- a/src/third_party/wiredtiger/src/btree/bt_compact.c
+++ b/src/third_party/wiredtiger/src/btree/bt_compact.c
@@ -160,7 +160,7 @@ __wt_compact(WT_SESSION_IMPL *session)
* checking whether the cache is full. Check now to throttle
* compact to match eviction speed.
*/
- WT_ERR(__wt_cache_eviction_check(session, false, NULL));
+ WT_ERR(__wt_cache_eviction_check(session, false, false, NULL));
/*
* Pages read for compaction aren't "useful"; don't update the
diff --git a/src/third_party/wiredtiger/src/btree/bt_curnext.c b/src/third_party/wiredtiger/src/btree/bt_curnext.c
index 59840322101..a5fb19a20e7 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curnext.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curnext.c
@@ -592,6 +592,7 @@ __wt_btcur_next(WT_CURSOR_BTREE *cbt, bool truncating)
* file.
*/
flags = WT_READ_SKIP_INTL; /* tree walk flags */
+ LF_SET(WT_READ_NO_SPLIT); /* don't try to split */
if (truncating)
LF_SET(WT_READ_TRUNCATE);
for (newpage = false;; newpage = true) {
diff --git a/src/third_party/wiredtiger/src/btree/bt_curprev.c b/src/third_party/wiredtiger/src/btree/bt_curprev.c
index c1395ea9008..50a755f1431 100644
--- a/src/third_party/wiredtiger/src/btree/bt_curprev.c
+++ b/src/third_party/wiredtiger/src/btree/bt_curprev.c
@@ -548,6 +548,7 @@ __wt_btcur_prev(WT_CURSOR_BTREE *cbt, bool truncating)
* of the file.
*/
flags = WT_READ_PREV | WT_READ_SKIP_INTL; /* tree walk flags */
+ LF_SET(WT_READ_NO_SPLIT); /* don't try to split */
if (truncating)
LF_SET(WT_READ_TRUNCATE);
for (newpage = false;; newpage = true) {
diff --git a/src/third_party/wiredtiger/src/btree/bt_read.c b/src/third_party/wiredtiger/src/btree/bt_read.c
index fc4afc7f9b1..fd9a7597d73 100644
--- a/src/third_party/wiredtiger/src/btree/bt_read.c
+++ b/src/third_party/wiredtiger/src/btree/bt_read.c
@@ -205,8 +205,31 @@ __las_page_instantiate(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t btree_id)
if (total_incr != 0) {
__wt_cache_page_inmem_incr(session, page, total_incr);
- /* Make sure the page is included in the next checkpoint. */
+ /*
+ * If the updates in lookaside are newer than the versions on
+ * the page, it must be included in the next checkpoint.
+ *
+ * Otherwise, the page image contained the newest versions of
+ * data so the updates are all older and we could consider
+ * marking it clean (i.e., the next checkpoint can use the
+ * version already on disk).
+ *
+ * This needs care because (a) it creates pages with history
+ * that can't be evicted until they are marked dirty again, and
+ * (b) checkpoints may need to visit these pages to resolve
+ * changes evicted while a checkpoint is running.
+ */
page->modify->first_dirty_txn = WT_TXN_FIRST;
+
+ if (!ref->page_las->las_skew_oldest &&
+ !S2C(session)->txn_global.has_stable_timestamp &&
+ __wt_txn_visible_all(session, ref->page_las->las_max_txn,
+ WT_TIMESTAMP_NULL(&ref->page_las->onpage_timestamp))) {
+ page->modify->rec_max_txn = ref->page_las->las_max_txn;
+ __wt_timestamp_set(&page->modify->rec_max_timestamp,
+ &ref->page_las->onpage_timestamp);
+ __wt_page_modify_clear(session, page);
+ }
}
err: WT_TRET(__wt_las_cursor_close(session, &cursor, session_flags));
@@ -275,7 +298,7 @@ __evict_force_check(WT_SESSION_IMPL *session, WT_REF *ref)
* extremely large memory footprints.
*/
if (page->modify->update_restored &&
- page->modify->last_eviction_id == __wt_txn_oldest_id(session))
+ !__wt_page_evict_retry(session, page))
return (false);
/* Trigger eviction on the next page release. */
@@ -557,13 +580,15 @@ __wt_page_in_func(WT_SESSION_IMPL *session, WT_REF *ref, uint32_t flags
return (WT_NOTFOUND);
read: /*
- * The page isn't in memory, read it. If this thread is
- * allowed to do eviction work, check for space in the
+ * The page isn't in memory, read it. If this thread
+ * respects the cache size, check for space in the
* cache.
*/
if (!LF_ISSET(WT_READ_IGNORE_CACHE_SIZE))
WT_RET(__wt_cache_eviction_check(
- session, 1, NULL));
+ session, true,
+ !F_ISSET(&session->txn, WT_TXN_HAS_ID),
+ NULL));
WT_RET(__page_read(session, ref, flags));
/*
@@ -730,8 +755,10 @@ skip_evict: /*
* substitute that for a sleep.
*/
if (!LF_ISSET(WT_READ_IGNORE_CACHE_SIZE)) {
- WT_RET(
- __wt_cache_eviction_check(session, 1, &cache_work));
+ WT_RET(__wt_cache_eviction_check(
+ session, true,
+ !F_ISSET(&session->txn, WT_TXN_HAS_ID),
+ &cache_work));
if (cache_work)
continue;
}
diff --git a/src/third_party/wiredtiger/src/btree/bt_split.c b/src/third_party/wiredtiger/src/btree/bt_split.c
index 021788919d0..a9643ed92a0 100644
--- a/src/third_party/wiredtiger/src/btree/bt_split.c
+++ b/src/third_party/wiredtiger/src/btree/bt_split.c
@@ -1497,6 +1497,8 @@ __split_multi_inmem(
* to avoid repeatedly attempting eviction on the same page.
*/
page->modify->last_eviction_id = orig->modify->last_eviction_id;
+ __wt_timestamp_set(&page->modify->last_eviction_timestamp,
+ &orig->modify->last_eviction_timestamp);
page->modify->update_restored = 1;
err: /* Free any resources that may have been cached in the cursor. */
diff --git a/src/third_party/wiredtiger/src/cache/cache_las.c b/src/third_party/wiredtiger/src/cache/cache_las.c
index 35d9f43b172..9f8aeb7cc9e 100644
--- a/src/third_party/wiredtiger/src/cache/cache_las.c
+++ b/src/third_party/wiredtiger/src/cache/cache_las.c
@@ -518,7 +518,13 @@ __wt_las_insert_block(WT_SESSION_IMPL *session, WT_CURSOR *cursor,
cursor->set_value(cursor,
upd->txnid, &las_timestamp, upd->type, &las_value);
- WT_ERR(cursor->insert(cursor));
+ /*
+ * Using update looks a little strange because the keys
+ * are guaranteed to not exist, but since we're
+ * appending, we want the cursor to stay positioned in
+ * between inserts.
+ */
+ WT_ERR(cursor->update(cursor));
++insert_cnt;
} while ((upd = upd->next) != NULL);
}
diff --git a/src/third_party/wiredtiger/src/conn/conn_cache.c b/src/third_party/wiredtiger/src/conn/conn_cache.c
index 76106b3592f..a7a9b8e2729 100644
--- a/src/third_party/wiredtiger/src/conn/conn_cache.c
+++ b/src/third_party/wiredtiger/src/conn/conn_cache.c
@@ -145,7 +145,8 @@ __wt_cache_config(WT_SESSION_IMPL *session, bool reconfigure, const char *cfg[])
session, &conn->evict_threads,
conn->evict_threads_min,
conn->evict_threads_max,
- WT_THREAD_CAN_WAIT | WT_THREAD_PANIC_FAIL));
+ WT_THREAD_CAN_WAIT | WT_THREAD_LOOKASIDE |
+ WT_THREAD_PANIC_FAIL));
return (0);
}
@@ -253,34 +254,40 @@ __wt_cache_stats_update(WT_SESSION_IMPL *session)
WT_STAT_SET(session, stats, cache_bytes_inuse, inuse);
WT_STAT_SET(session, stats, cache_overhead, cache->overhead_pct);
- WT_STAT_SET(
- session, stats, cache_bytes_dirty, __wt_cache_dirty_inuse(cache));
- WT_STAT_SET(
- session, stats, cache_bytes_image, __wt_cache_bytes_image(cache));
- WT_STAT_SET(
- session, stats, cache_pages_inuse, __wt_cache_pages_inuse(cache));
- WT_STAT_SET(
- session, stats, cache_bytes_internal, cache->bytes_internal);
+ WT_STAT_SET(session, stats,
+ cache_bytes_dirty, __wt_cache_dirty_inuse(cache));
+ WT_STAT_SET(session, stats,
+ cache_bytes_image, __wt_cache_bytes_image(cache));
+ WT_STAT_SET(session, stats,
+ cache_pages_inuse, __wt_cache_pages_inuse(cache));
+ WT_STAT_SET(session, stats,
+ cache_bytes_internal, cache->bytes_internal);
WT_STAT_SET(session, stats, cache_bytes_leaf, leaf);
- WT_STAT_SET(
- session, stats, cache_bytes_other, __wt_cache_bytes_other(cache));
+ if (F_ISSET(conn, WT_CONN_LOOKASIDE_OPEN)) {
+ WT_STAT_SET(session, stats, cache_bytes_lookaside,
+ __wt_cache_bytes_plus_overhead(
+ cache, cache->bytes_lookaside));
+ }
+ WT_STAT_SET(session, stats,
+ cache_bytes_other, __wt_cache_bytes_other(cache));
WT_STAT_SET(session, stats,
cache_eviction_maximum_page_size, cache->evict_max_page_size);
WT_STAT_SET(session, stats, cache_pages_dirty,
cache->pages_dirty_intl + cache->pages_dirty_leaf);
- WT_STAT_CONN_SET(session, cache_eviction_state, cache->flags);
- WT_STAT_CONN_SET(session,
+ WT_STAT_SET(session, stats, cache_eviction_state, cache->flags);
+ WT_STAT_SET(session, stats,
cache_eviction_aggressive_set, cache->evict_aggressive_score);
- WT_STAT_CONN_SET(session,
+ WT_STAT_SET(session, stats,
cache_eviction_empty_score, cache->evict_empty_score);
- WT_STAT_CONN_SET(session,
+ WT_STAT_SET(session, stats,
cache_lookaside_score, __wt_cache_lookaside_score(cache));
- WT_STAT_CONN_SET(session,
+ WT_STAT_SET(session, stats,
cache_eviction_active_workers, conn->evict_threads.current_threads);
- WT_STAT_CONN_SET(session, cache_eviction_stable_state_workers,
+ WT_STAT_SET(session, stats,
+ cache_eviction_stable_state_workers,
cache->evict_tune_workers_best);
/*
diff --git a/src/third_party/wiredtiger/src/conn/conn_cache_pool.c b/src/third_party/wiredtiger/src/conn/conn_cache_pool.c
index afe29284d06..ade63b00af6 100644
--- a/src/third_party/wiredtiger/src/conn/conn_cache_pool.c
+++ b/src/third_party/wiredtiger/src/conn/conn_cache_pool.c
@@ -608,7 +608,7 @@ __cache_pool_adjust(WT_SESSION_IMPL *session,
*/
pressure = cache->cp_pass_pressure / highest_percentile;
busy = __wt_eviction_needed(
- entry->default_session, false, &pct_full);
+ entry->default_session, false, true, &pct_full);
__wt_verbose(session, WT_VERB_SHARED_CACHE,
"\t%5" PRIu64 ", %3" PRIu64 ", %2" PRIu32 ", %d, %2u",
diff --git a/src/third_party/wiredtiger/src/evict/evict_lru.c b/src/third_party/wiredtiger/src/evict/evict_lru.c
index 3af5338d73f..b1e42fcf489 100644
--- a/src/third_party/wiredtiger/src/evict/evict_lru.c
+++ b/src/third_party/wiredtiger/src/evict/evict_lru.c
@@ -75,8 +75,7 @@ __evict_entry_priority(WT_SESSION_IMPL *session, WT_REF *ref)
return (WT_READGEN_OLDEST);
/* Any page from a dead tree is a great choice. */
- if (F_ISSET(btree->dhandle, WT_DHANDLE_DEAD) ||
- F_ISSET(btree, WT_BTREE_LOOKASIDE))
+ if (F_ISSET(btree->dhandle, WT_DHANDLE_DEAD))
return (WT_READGEN_OLDEST);
/* Any empty page (leaf or internal), is a good choice. */
@@ -553,6 +552,7 @@ __wt_evict_destroy(WT_SESSION_IMPL *session)
static bool
__evict_update_work(WT_SESSION_IMPL *session)
{
+ WT_BTREE *las_tree;
WT_CACHE *cache;
WT_CONNECTION_IMPL *conn;
uint64_t bytes_inuse, bytes_max, dirty_inuse;
@@ -569,6 +569,14 @@ __evict_update_work(WT_SESSION_IMPL *session)
if (!__evict_queue_empty(cache->evict_urgent_queue, false))
F_SET(cache, WT_CACHE_EVICT_URGENT);
+ if (F_ISSET(conn, WT_CONN_LOOKASIDE_OPEN)) {
+ WT_ASSERT(session,
+ F_ISSET(session, WT_SESSION_LOOKASIDE_CURSOR));
+
+ las_tree = ((WT_CURSOR_BTREE *)session->las_cursor)->btree;
+ cache->bytes_lookaside = las_tree->bytes_inmem;
+ }
+
/*
* If we need space in the cache, try to find clean pages to evict.
*
@@ -710,8 +718,8 @@ __evict_pass(WT_SESSION_IMPL *session)
* workers, it must service the urgent queue in case all
* application threads are busy.
*/
- if (cache->evict_empty_score < WT_EVICT_SCORE_CUTOFF ||
- (!WT_EVICT_HAS_WORKERS(session) &&
+ if (!WT_EVICT_HAS_WORKERS(session) &&
+ (cache->evict_empty_score < WT_EVICT_SCORE_CUTOFF ||
!__evict_queue_empty(cache->evict_urgent_queue, false)))
WT_RET(__evict_lru_pages(session, true));
@@ -1577,9 +1585,7 @@ __evict_walk_file(WT_SESSION_IMPL *session,
WT_DECL_RET;
WT_EVICT_ENTRY *end, *evict, *start;
WT_PAGE *last_parent, *page;
- WT_PAGE_MODIFY *mod;
WT_REF *ref;
- WT_TXN_GLOBAL *txn_global;
uint64_t btree_inuse, bytes_per_slot, cache_inuse, min_pages;
uint64_t pages_seen, pages_queued, refs_walked;
uint32_t remaining_slots, total_slots, walk_flags;
@@ -1590,7 +1596,6 @@ __evict_walk_file(WT_SESSION_IMPL *session,
conn = S2C(session);
btree = S2BT(session);
cache = conn->cache;
- txn_global = &conn->txn_global;
last_parent = NULL;
restarts = 0;
give_up = urgent_queued = false;
@@ -1655,21 +1660,6 @@ __evict_walk_file(WT_SESSION_IMPL *session,
target_pages = remaining_slots;
/*
- * Lookaside pages don't count toward the cache's dirty limit.
- *
- * Preferentially evict lookaside pages unless applications are stalled
- * on the dirty limit. Once application threads are stalled by the
- * dirty limit, don't take any lookaside pages unless we're also up
- * against the total cache size limit.
- */
- if (F_ISSET(btree, WT_BTREE_LOOKASIDE)) {
- if (!F_ISSET(cache, WT_CACHE_EVICT_DIRTY_HARD))
- target_pages = remaining_slots;
- else if (!F_ISSET(cache, WT_CACHE_EVICT_CLEAN_HARD))
- target_pages = 0;
- }
-
- /*
* Walk trees with a small fraction of the cache in case there are so
* many trees that none of them use enough of the cache to be allocated
* slots. Only skip a tree if it has no bytes of interest.
@@ -1797,6 +1787,7 @@ __evict_walk_file(WT_SESSION_IMPL *session,
* if we get into that situation.
*/
give_up = !__wt_cache_aggressive(session) &&
+ !F_ISSET(btree, WT_BTREE_LOOKASIDE) &&
pages_seen > min_pages &&
(pages_queued == 0 || (pages_seen / pages_queued) >
(min_pages / target_pages));
@@ -1959,14 +1950,9 @@ __evict_walk_file(WT_SESSION_IMPL *session,
* recent update on the page is not yet globally visible,
* eviction will fail. This heuristic avoids repeated attempts
* to evict the same page.
- *
- * We skip this for the lookaside table because updates there
- * can be evicted as soon as they are committed.
*/
- mod = page->modify;
- if (modified && txn_global->current != txn_global->oldest_id &&
- (mod->last_eviction_id == __wt_txn_oldest_id(session) ||
- !__wt_txn_visible_all(session, mod->update_txn, NULL)))
+ if (modified && (!__wt_page_evict_retry(session, page) ||
+ !__txn_visible_all_id(session, page->modify->update_txn)))
continue;
fast: /* If the page can't be evicted, give up. */
@@ -2284,7 +2270,8 @@ __evict_page(WT_SESSION_IMPL *session, bool is_server)
* crosses its boundaries.
*/
int
-__wt_cache_eviction_worker(WT_SESSION_IMPL *session, bool busy, u_int pct_full)
+__wt_cache_eviction_worker(
+ WT_SESSION_IMPL *session, bool busy, bool readonly, u_int pct_full)
{
struct timespec enter, leave;
WT_CACHE *cache;
@@ -2347,7 +2334,7 @@ __wt_cache_eviction_worker(WT_SESSION_IMPL *session, bool busy, u_int pct_full)
max_progress = busy ? 5 : 20;
/* See if eviction is still needed. */
- if (!__wt_eviction_needed(session, busy, &pct_full) ||
+ if (!__wt_eviction_needed(session, busy, readonly, &pct_full) ||
((pct_full < 100 || cache->eviction_scrub_limit > 0.0) &&
(cache->eviction_progress >
initial_progress + max_progress)))
@@ -2357,7 +2344,7 @@ __wt_cache_eviction_worker(WT_SESSION_IMPL *session, bool busy, u_int pct_full)
* Don't make application threads participate in scrubbing for
* checkpoints. Just throttle updates instead.
*/
- if (busy && WT_EVICT_HAS_WORKERS(session) &&
+ if (WT_EVICT_HAS_WORKERS(session) &&
cache->eviction_scrub_limit > 0.0 &&
!F_ISSET(cache, WT_CACHE_EVICT_CLEAN_HARD)) {
__wt_yield();
diff --git a/src/third_party/wiredtiger/src/include/btmem.h b/src/third_party/wiredtiger/src/include/btmem.h
index abb7cc19972..bd881af0ecf 100644
--- a/src/third_party/wiredtiger/src/include/btmem.h
+++ b/src/third_party/wiredtiger/src/include/btmem.h
@@ -209,6 +209,7 @@ struct __wt_page_modify {
/* The transaction state last time eviction was attempted. */
uint64_t last_eviction_id;
+ WT_DECL_TIMESTAMP(last_eviction_timestamp)
#ifdef HAVE_DIAGNOSTIC
/* Check that transaction time moves forward. */
diff --git a/src/third_party/wiredtiger/src/include/btree.i b/src/third_party/wiredtiger/src/include/btree.i
index edc0973ee6f..35cb868ac26 100644
--- a/src/third_party/wiredtiger/src/include/btree.i
+++ b/src/third_party/wiredtiger/src/include/btree.i
@@ -149,8 +149,7 @@ __wt_cache_page_inmem_incr(WT_SESSION_IMPL *session, WT_PAGE *page, size_t size)
if (WT_PAGE_IS_INTERNAL(page)) {
(void)__wt_atomic_add64(&btree->bytes_dirty_intl, size);
(void)__wt_atomic_add64(&cache->bytes_dirty_intl, size);
- } else if (!btree->lsm_primary &&
- !F_ISSET(btree, WT_BTREE_LOOKASIDE)) {
+ } else if (!btree->lsm_primary) {
(void)__wt_atomic_add64(&btree->bytes_dirty_leaf, size);
(void)__wt_atomic_add64(&cache->bytes_dirty_leaf, size);
}
@@ -262,7 +261,7 @@ __wt_cache_page_byte_dirty_decr(
decr, "WT_BTREE.bytes_dirty_intl");
__wt_cache_decr_check_uint64(session, &cache->bytes_dirty_intl,
decr, "WT_CACHE.bytes_dirty_intl");
- } else if (!btree->lsm_primary && !F_ISSET(btree, WT_BTREE_LOOKASIDE)) {
+ } else if (!btree->lsm_primary) {
__wt_cache_decr_check_uint64(session, &btree->bytes_dirty_leaf,
decr, "WT_BTREE.bytes_dirty_leaf");
__wt_cache_decr_check_uint64(session, &cache->bytes_dirty_leaf,
@@ -322,8 +321,7 @@ __wt_cache_dirty_incr(WT_SESSION_IMPL *session, WT_PAGE *page)
(void)__wt_atomic_add64(&cache->bytes_dirty_intl, size);
(void)__wt_atomic_add64(&cache->pages_dirty_intl, 1);
} else {
- if (!btree->lsm_primary &&
- !F_ISSET(btree, WT_BTREE_LOOKASIDE)) {
+ if (!btree->lsm_primary) {
(void)__wt_atomic_add64(&btree->bytes_dirty_leaf, size);
(void)__wt_atomic_add64(&cache->bytes_dirty_leaf, size);
}
@@ -422,8 +420,7 @@ __wt_cache_page_evict(WT_SESSION_IMPL *session, WT_PAGE *page, bool rewrite)
__wt_cache_decr_check_uint64(session,
&cache->bytes_dirty_intl,
modify->bytes_dirty, "WT_CACHE.bytes_dirty_intl");
- } else if (!btree->lsm_primary &&
- !F_ISSET(btree, WT_BTREE_LOOKASIDE)) {
+ } else if (!btree->lsm_primary) {
__wt_cache_decr_check_uint64(session,
&btree->bytes_dirty_leaf,
modify->bytes_dirty, "WT_BTREE.bytes_dirty_leaf");
@@ -1270,6 +1267,44 @@ __wt_leaf_page_can_split(WT_SESSION_IMPL *session, WT_PAGE *page)
}
/*
+ * __wt_page_evict_retry --
+ * Check if there has been transaction progress since the last eviction
+ * attempt.
+ */
+static inline bool
+__wt_page_evict_retry(WT_SESSION_IMPL *session, WT_PAGE *page)
+{
+ WT_PAGE_MODIFY *mod;
+ WT_TXN_GLOBAL *txn_global;
+
+ txn_global = &S2C(session)->txn_global;
+
+ if ((mod = page->modify) == NULL)
+ return (true);
+
+ if (txn_global->current != txn_global->oldest_id &&
+ mod->last_eviction_id == __wt_txn_oldest_id(session))
+ return (false);
+
+#ifdef HAVE_TIMESTAMPS
+ {
+ bool same_timestamp;
+
+ if (__wt_timestamp_iszero(&mod->last_eviction_timestamp))
+ return (true);
+
+ WT_WITH_TIMESTAMP_READLOCK(session, &txn_global->rwlock,
+ same_timestamp = __wt_timestamp_cmp(
+ &mod->last_eviction_timestamp, &txn_global->pinned_timestamp) == 0);
+ if (same_timestamp)
+ return (false);
+ }
+#endif
+
+ return (true);
+}
+
+/*
* __wt_page_can_evict --
* Check whether a page can be evicted.
*/
diff --git a/src/third_party/wiredtiger/src/include/cache.h b/src/third_party/wiredtiger/src/include/cache.h
index f9ce4316e29..a8873bff394 100644
--- a/src/third_party/wiredtiger/src/include/cache.h
+++ b/src/third_party/wiredtiger/src/include/cache.h
@@ -78,6 +78,8 @@ struct __wt_cache {
uint64_t bytes_read; /* Bytes read into memory */
uint64_t bytes_written;
+ uint64_t bytes_lookaside; /* Lookaside bytes inmem */
+
volatile uint64_t eviction_progress; /* Eviction progress count */
uint64_t last_eviction_progress;/* Tracked eviction progress */
diff --git a/src/third_party/wiredtiger/src/include/cache.i b/src/third_party/wiredtiger/src/include/cache.i
index c7d802f8a5f..00f45dcd44f 100644
--- a/src/third_party/wiredtiger/src/include/cache.i
+++ b/src/third_party/wiredtiger/src/include/cache.i
@@ -311,7 +311,8 @@ __wt_eviction_dirty_needed(WT_SESSION_IMPL *session, u_int *pct_fullp)
* percentage as a side-effect.
*/
static inline bool
-__wt_eviction_needed(WT_SESSION_IMPL *session, bool busy, u_int *pct_fullp)
+__wt_eviction_needed(
+ WT_SESSION_IMPL *session, bool busy, bool readonly, u_int *pct_fullp)
{
WT_CACHE *cache;
u_int pct_dirty, pct_full;
@@ -327,7 +328,11 @@ __wt_eviction_needed(WT_SESSION_IMPL *session, bool busy, u_int *pct_fullp)
return (false);
clean_needed = __wt_eviction_clean_needed(session, &pct_full);
- dirty_needed = __wt_eviction_dirty_needed(session, &pct_dirty);
+ if (readonly) {
+ dirty_needed = false;
+ pct_dirty = 0;
+ } else
+ dirty_needed = __wt_eviction_dirty_needed(session, &pct_dirty);
/*
* Calculate the cache full percentage; anything over the trigger means
@@ -370,7 +375,8 @@ __wt_cache_full(WT_SESSION_IMPL *session)
* Evict pages if the cache crosses its boundaries.
*/
static inline int
-__wt_cache_eviction_check(WT_SESSION_IMPL *session, bool busy, bool *didworkp)
+__wt_cache_eviction_check(
+ WT_SESSION_IMPL *session, bool busy, bool readonly, bool *didworkp)
{
WT_BTREE *btree;
WT_TXN_GLOBAL *txn_global;
@@ -421,7 +427,7 @@ __wt_cache_eviction_check(WT_SESSION_IMPL *session, bool busy, bool *didworkp)
return (0);
/* Check if eviction is needed. */
- if (!__wt_eviction_needed(session, busy, &pct_full))
+ if (!__wt_eviction_needed(session, busy, readonly, &pct_full))
return (0);
/*
@@ -431,5 +437,5 @@ __wt_cache_eviction_check(WT_SESSION_IMPL *session, bool busy, bool *didworkp)
if (didworkp != NULL)
*didworkp = true;
- return (__wt_cache_eviction_worker(session, busy, pct_full));
+ return (__wt_cache_eviction_worker(session, busy, readonly, pct_full));
}
diff --git a/src/third_party/wiredtiger/src/include/cursor.i b/src/third_party/wiredtiger/src/include/cursor.i
index c29d6aa09ab..ceef5061075 100644
--- a/src/third_party/wiredtiger/src/include/cursor.i
+++ b/src/third_party/wiredtiger/src/include/cursor.i
@@ -149,7 +149,7 @@ __cursor_enter(WT_SESSION_IMPL *session)
* whether the cache is full.
*/
if (session->ncursors == 0)
- WT_RET(__wt_cache_eviction_check(session, false, NULL));
+ WT_RET(__wt_cache_eviction_check(session, false, false, NULL));
++session->ncursors;
return (0);
}
diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h
index 17afb48bda6..17267861717 100644
--- a/src/third_party/wiredtiger/src/include/extern.h
+++ b/src/third_party/wiredtiger/src/include/extern.h
@@ -366,7 +366,7 @@ extern int __wt_evict_create(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUT
extern int __wt_evict_destroy(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_evict_file_exclusive_on(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern void __wt_evict_file_exclusive_off(WT_SESSION_IMPL *session);
-extern int __wt_cache_eviction_worker(WT_SESSION_IMPL *session, bool busy, u_int pct_full) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_cache_eviction_worker( WT_SESSION_IMPL *session, bool busy, bool readonly, u_int pct_full) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern bool __wt_page_evict_urgent(WT_SESSION_IMPL *session, WT_REF *ref);
extern void __wt_evict_priority_set(WT_SESSION_IMPL *session, uint64_t v);
extern void __wt_evict_priority_clear(WT_SESSION_IMPL *session);
diff --git a/src/third_party/wiredtiger/src/include/stat.h b/src/third_party/wiredtiger/src/include/stat.h
index 2477079a2a8..438333858b9 100644
--- a/src/third_party/wiredtiger/src/include/stat.h
+++ b/src/third_party/wiredtiger/src/include/stat.h
@@ -293,6 +293,7 @@ struct __wt_connection_stats {
int64_t cache_write_app_count;
int64_t cache_write_app_time;
int64_t cache_bytes_image;
+ int64_t cache_bytes_lookaside;
int64_t cache_bytes_inuse;
int64_t cache_bytes_other;
int64_t cache_bytes_read;
diff --git a/src/third_party/wiredtiger/src/include/txn.i b/src/third_party/wiredtiger/src/include/txn.i
index 9e70632d890..2ecbd5dc440 100644
--- a/src/third_party/wiredtiger/src/include/txn.i
+++ b/src/third_party/wiredtiger/src/include/txn.i
@@ -287,7 +287,8 @@ __wt_txn_oldest_id(WT_SESSION_IMPL *session)
*/
oldest_id = txn_global->oldest_id;
include_checkpoint_txn = btree == NULL ||
- btree->checkpoint_gen != __wt_gen(session, WT_GEN_CHECKPOINT);
+ (!F_ISSET(btree, WT_BTREE_LOOKASIDE) &&
+ btree->checkpoint_gen != __wt_gen(session, WT_GEN_CHECKPOINT));
if (!include_checkpoint_txn)
return (oldest_id);
@@ -523,11 +524,9 @@ __wt_txn_begin(WT_SESSION_IMPL *session, const char *cfg[])
if (session->ncursors > 0)
WT_RET(__wt_session_copy_values(session));
- /*
- * We're about to allocate a snapshot: if we need to block for
- * eviction, it's better to do it beforehand.
- */
- WT_RET(__wt_cache_eviction_check(session, false, NULL));
+ /* Stall here if the cache is completely full. */
+ WT_RET(__wt_cache_eviction_check(session, false, true, NULL));
+
__wt_txn_get_snapshot(session);
}
@@ -572,11 +571,14 @@ __wt_txn_idle_cache_check(WT_SESSION_IMPL *session)
/*
* Check the published snap_min because read-uncommitted never sets
- * WT_TXN_HAS_SNAPSHOT.
+ * WT_TXN_HAS_SNAPSHOT. We don't have any transaction information at
+ * this point, so assume the transaction will be read-only. The dirty
+ * cache check will be performed when the transaction completes, if
+ * necessary.
*/
if (F_ISSET(txn, WT_TXN_RUNNING) &&
!F_ISSET(txn, WT_TXN_HAS_ID) && txn_state->pinned_id == WT_TXN_NONE)
- WT_RET(__wt_cache_eviction_check(session, false, NULL));
+ WT_RET(__wt_cache_eviction_check(session, false, true, NULL));
return (0);
}
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index 5d3b0c52cbd..c24cffe2371 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -4742,576 +4742,578 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_WRITE_APP_TIME 1034
/*! cache: bytes belonging to page images in the cache */
#define WT_STAT_CONN_CACHE_BYTES_IMAGE 1035
+/*! cache: bytes belonging to the lookaside table in the cache */
+#define WT_STAT_CONN_CACHE_BYTES_LOOKASIDE 1036
/*! cache: bytes currently in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INUSE 1036
+#define WT_STAT_CONN_CACHE_BYTES_INUSE 1037
/*! cache: bytes not belonging to page images in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_OTHER 1037
+#define WT_STAT_CONN_CACHE_BYTES_OTHER 1038
/*! cache: bytes read into cache */
-#define WT_STAT_CONN_CACHE_BYTES_READ 1038
+#define WT_STAT_CONN_CACHE_BYTES_READ 1039
/*! cache: bytes written from cache */
-#define WT_STAT_CONN_CACHE_BYTES_WRITE 1039
+#define WT_STAT_CONN_CACHE_BYTES_WRITE 1040
/*! cache: checkpoint blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_CHECKPOINT 1040
+#define WT_STAT_CONN_CACHE_EVICTION_CHECKPOINT 1041
/*! cache: eviction calls to get a page */
-#define WT_STAT_CONN_CACHE_EVICTION_GET_REF 1041
+#define WT_STAT_CONN_CACHE_EVICTION_GET_REF 1042
/*! cache: eviction calls to get a page found queue empty */
-#define WT_STAT_CONN_CACHE_EVICTION_GET_REF_EMPTY 1042
+#define WT_STAT_CONN_CACHE_EVICTION_GET_REF_EMPTY 1043
/*! cache: eviction calls to get a page found queue empty after locking */
-#define WT_STAT_CONN_CACHE_EVICTION_GET_REF_EMPTY2 1043
+#define WT_STAT_CONN_CACHE_EVICTION_GET_REF_EMPTY2 1044
/*! cache: eviction currently operating in aggressive mode */
-#define WT_STAT_CONN_CACHE_EVICTION_AGGRESSIVE_SET 1044
+#define WT_STAT_CONN_CACHE_EVICTION_AGGRESSIVE_SET 1045
/*! cache: eviction empty score */
-#define WT_STAT_CONN_CACHE_EVICTION_EMPTY_SCORE 1045
+#define WT_STAT_CONN_CACHE_EVICTION_EMPTY_SCORE 1046
/*! cache: eviction passes of a file */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_PASSES 1046
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_PASSES 1047
/*! cache: eviction server candidate queue empty when topping up */
-#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_EMPTY 1047
+#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_EMPTY 1048
/*! cache: eviction server candidate queue not empty when topping up */
-#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_NOT_EMPTY 1048
+#define WT_STAT_CONN_CACHE_EVICTION_QUEUE_NOT_EMPTY 1049
/*! cache: eviction server evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_EVICTING 1049
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_EVICTING 1050
/*!
* cache: eviction server slept, because we did not make progress with
* eviction
*/
-#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1050
+#define WT_STAT_CONN_CACHE_EVICTION_SERVER_SLEPT 1051
/*! cache: eviction server unable to reach eviction goal */
-#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1051
+#define WT_STAT_CONN_CACHE_EVICTION_SLOW 1052
/*! cache: eviction state */
-#define WT_STAT_CONN_CACHE_EVICTION_STATE 1052
+#define WT_STAT_CONN_CACHE_EVICTION_STATE 1053
/*! cache: eviction walk target pages histogram - 0-9 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1053
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT10 1054
/*! cache: eviction walk target pages histogram - 10-31 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1054
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT32 1055
/*! cache: eviction walk target pages histogram - 128 and higher */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1055
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_GE128 1056
/*! cache: eviction walk target pages histogram - 32-63 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1056
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT64 1057
/*! cache: eviction walk target pages histogram - 64-128 */
-#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1057
+#define WT_STAT_CONN_CACHE_EVICTION_TARGET_PAGE_LT128 1058
/*! cache: eviction walks abandoned */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1058
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ABANDONED 1059
/*! cache: eviction walks gave up because they restarted their walk twice */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1059
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STOPPED 1060
/*!
* 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 1060
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_NO_TARGETS 1061
/*!
* 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 1061
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_GAVE_UP_RATIO 1062
/*! cache: eviction walks reached end of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1062
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ENDED 1063
/*! cache: eviction walks started from root of tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1063
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_FROM_ROOT 1064
/*! cache: eviction walks started from saved location in tree */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1064
+#define WT_STAT_CONN_CACHE_EVICTION_WALK_SAVED_POS 1065
/*! cache: eviction worker thread active */
-#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1065
+#define WT_STAT_CONN_CACHE_EVICTION_ACTIVE_WORKERS 1066
/*! cache: eviction worker thread created */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1066
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_CREATED 1067
/*! cache: eviction worker thread evicting pages */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1067
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1068
/*! cache: eviction worker thread removed */
-#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1068
+#define WT_STAT_CONN_CACHE_EVICTION_WORKER_REMOVED 1069
/*! cache: eviction worker thread stable number */
-#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1069
+#define WT_STAT_CONN_CACHE_EVICTION_STABLE_STATE_WORKERS 1070
/*!
* cache: failed eviction of pages that exceeded the in-memory maximum
* count
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1070
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1071
/*!
* cache: failed eviction of pages that exceeded the in-memory maximum
* time (usecs)
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1071
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL_TIME 1072
/*! cache: files with active eviction walks */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1072
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1073
/*! cache: files with new eviction walks started */
-#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1073
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1074
/*! cache: force re-tuning of eviction workers once in a while */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1074
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_RETUNE 1075
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1075
+#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1076
/*! cache: hazard pointer check calls */
-#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1076
+#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1077
/*! cache: hazard pointer check entries walked */
-#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1077
+#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1078
/*! cache: hazard pointer maximum array length */
-#define WT_STAT_CONN_CACHE_HAZARD_MAX 1078
+#define WT_STAT_CONN_CACHE_HAZARD_MAX 1079
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1079
+#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1080
/*! cache: in-memory page splits */
-#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1080
+#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1081
/*! cache: internal pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1081
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1082
/*! cache: internal pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1082
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1083
/*! cache: leaf pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1083
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1084
/*! cache: lookaside score */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_SCORE 1084
+#define WT_STAT_CONN_CACHE_LOOKASIDE_SCORE 1085
/*! cache: lookaside table entries */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_ENTRIES 1085
+#define WT_STAT_CONN_CACHE_LOOKASIDE_ENTRIES 1086
/*! cache: lookaside table insert calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1086
+#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1087
/*! cache: lookaside table remove calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1087
+#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1088
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1088
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1089
/*! cache: maximum page size at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1089
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1090
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1090
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1091
/*! cache: modified pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1091
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1092
/*! cache: overflow pages read into cache */
-#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1092
+#define WT_STAT_CONN_CACHE_READ_OVERFLOW 1093
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1093
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1094
/*! cache: page written requiring lookaside records */
-#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1094
+#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1095
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1095
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1096
/*! cache: pages evicted because they exceeded the in-memory maximum count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1096
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1097
/*!
* cache: pages evicted because they exceeded the in-memory maximum time
* (usecs)
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_TIME 1097
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_TIME 1098
/*! cache: pages evicted because they had chains of deleted items count */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1098
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1099
/*!
* cache: pages evicted because they had chains of deleted items time
* (usecs)
*/
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE_TIME 1099
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE_TIME 1100
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1100
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1101
/*! cache: pages queued for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1101
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1102
/*! cache: pages queued for urgent eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1102
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_URGENT 1103
/*! cache: pages queued for urgent eviction during walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1103
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1104
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1104
+#define WT_STAT_CONN_CACHE_READ 1105
/*! cache: pages read into cache requiring lookaside entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1105
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1106
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1106
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1107
/*! cache: pages seen by eviction walk */
-#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1107
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1108
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1108
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1109
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1109
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1110
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1110
+#define WT_STAT_CONN_CACHE_WRITE 1111
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1111
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1112
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1112
+#define WT_STAT_CONN_CACHE_OVERHEAD 1113
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1113
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1114
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1114
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1115
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1115
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1116
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1116
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1117
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1117
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1118
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1118
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1119
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1119
+#define WT_STAT_CONN_COND_AUTO_WAIT 1120
/*! connection: detected system time went backwards */
-#define WT_STAT_CONN_TIME_TRAVEL 1120
+#define WT_STAT_CONN_TIME_TRAVEL 1121
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1121
+#define WT_STAT_CONN_FILE_OPEN 1122
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1122
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1123
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1123
+#define WT_STAT_CONN_MEMORY_FREE 1124
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1124
+#define WT_STAT_CONN_MEMORY_GROW 1125
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1125
+#define WT_STAT_CONN_COND_WAIT 1126
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1126
+#define WT_STAT_CONN_RWLOCK_READ 1127
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1127
+#define WT_STAT_CONN_RWLOCK_WRITE 1128
/*! connection: total fsync I/Os */
-#define WT_STAT_CONN_FSYNC_IO 1128
+#define WT_STAT_CONN_FSYNC_IO 1129
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1129
+#define WT_STAT_CONN_READ_IO 1130
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1130
+#define WT_STAT_CONN_WRITE_IO 1131
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1131
+#define WT_STAT_CONN_CURSOR_CREATE 1132
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1132
+#define WT_STAT_CONN_CURSOR_INSERT 1133
/*! cursor: cursor modify calls */
-#define WT_STAT_CONN_CURSOR_MODIFY 1133
+#define WT_STAT_CONN_CURSOR_MODIFY 1134
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1134
+#define WT_STAT_CONN_CURSOR_NEXT 1135
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1135
+#define WT_STAT_CONN_CURSOR_PREV 1136
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1136
+#define WT_STAT_CONN_CURSOR_REMOVE 1137
/*! cursor: cursor reserve calls */
-#define WT_STAT_CONN_CURSOR_RESERVE 1137
+#define WT_STAT_CONN_CURSOR_RESERVE 1138
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1138
+#define WT_STAT_CONN_CURSOR_RESET 1139
/*! cursor: cursor restarted searches */
-#define WT_STAT_CONN_CURSOR_RESTART 1139
+#define WT_STAT_CONN_CURSOR_RESTART 1140
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1140
+#define WT_STAT_CONN_CURSOR_SEARCH 1141
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1141
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1142
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1142
+#define WT_STAT_CONN_CURSOR_UPDATE 1143
/*! cursor: truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1143
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1144
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1144
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1145
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1145
+#define WT_STAT_CONN_DH_SWEEP_REF 1146
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1146
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1147
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1147
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1148
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1148
+#define WT_STAT_CONN_DH_SWEEP_TOD 1149
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1149
+#define WT_STAT_CONN_DH_SWEEPS 1150
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1150
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1151
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1151
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1152
/*! lock: checkpoint lock acquisitions */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1152
+#define WT_STAT_CONN_LOCK_CHECKPOINT_COUNT 1153
/*! lock: checkpoint lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1153
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1154
/*! lock: checkpoint lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1154
+#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1155
/*!
* lock: dhandle lock application thread time waiting for the dhandle
* lock (usecs)
*/
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1155
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1156
/*!
* lock: dhandle lock internal thread time waiting for the dhandle lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1156
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1157
/*! lock: dhandle read lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1157
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1158
/*! lock: dhandle write lock acquisitions */
-#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1158
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1159
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1159
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1160
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1160
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1161
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1161
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1162
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1162
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1163
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1163
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1164
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1164
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1165
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1165
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1166
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1166
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1167
/*! lock: table read lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1167
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1168
/*! lock: table write lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1168
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1169
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1169
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1170
/*! log: force checkpoint calls slept */
-#define WT_STAT_CONN_LOG_FORCE_CKPT_SLEEP 1170
+#define WT_STAT_CONN_LOG_FORCE_CKPT_SLEEP 1171
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1171
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1172
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1172
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1173
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1173
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1174
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1174
+#define WT_STAT_CONN_LOG_FLUSH 1175
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1175
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1176
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1176
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1177
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1177
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1178
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1178
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1179
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1179
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1180
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1180
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1181
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1181
+#define WT_STAT_CONN_LOG_SCANS 1182
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1182
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1183
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1183
+#define WT_STAT_CONN_LOG_WRITE_LSN 1184
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1184
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1185
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1185
+#define WT_STAT_CONN_LOG_SYNC 1186
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1186
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1187
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1187
+#define WT_STAT_CONN_LOG_SYNC_DIR 1188
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1188
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1189
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1189
+#define WT_STAT_CONN_LOG_WRITES 1190
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1190
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1191
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1191
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1192
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1192
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1193
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1193
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1194
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1194
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1195
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1195
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1196
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1196
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1197
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1197
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1198
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1198
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1199
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1199
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1200
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1200
+#define WT_STAT_CONN_LOG_SLOT_RACES 1201
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1201
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1202
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1202
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1203
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1203
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1204
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1204
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1205
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1205
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1206
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1206
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1207
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1207
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1208
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1208
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1209
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1209
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1210
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1210
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1211
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1211
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1212
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1212
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1213
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1213
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1214
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1214
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1215
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1215
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1216
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1216
+#define WT_STAT_CONN_REC_PAGES 1217
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1217
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1218
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1218
+#define WT_STAT_CONN_REC_PAGE_DELETE 1219
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1219
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1220
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1220
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1221
/*! session: open cursor count */
-#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1221
+#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1222
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1222
+#define WT_STAT_CONN_SESSION_OPEN 1223
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1223
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1224
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1224
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1225
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1225
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1226
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1226
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1227
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1227
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1228
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1228
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1229
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1229
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1230
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1230
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1231
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1231
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1232
/*! session: table rebalance failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1232
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1233
/*! session: table rebalance successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1233
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1234
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1234
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1235
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1235
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1236
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1236
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1237
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1237
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1238
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1238
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1239
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1239
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1240
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1240
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1241
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1241
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1242
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1242
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1243
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1243
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1244
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1244
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1245
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1245
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1246
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1246
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1247
/*!
* thread-yield: connection close blocked waiting for transaction state
* stabilization
*/
-#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1247
+#define WT_STAT_CONN_TXN_RELEASE_BLOCKED 1248
/*! thread-yield: connection close yielded for lsm manager shutdown */
-#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1248
+#define WT_STAT_CONN_CONN_CLOSE_BLOCKED_LSM 1249
/*! thread-yield: data handle lock yielded */
-#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1249
+#define WT_STAT_CONN_DHANDLE_LOCK_BLOCKED 1250
/*!
* thread-yield: get reference for page index and slot time sleeping
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1250
+#define WT_STAT_CONN_PAGE_INDEX_SLOT_REF_BLOCKED 1251
/*! thread-yield: log server sync yielded for log write */
-#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1251
+#define WT_STAT_CONN_LOG_SERVER_SYNC_BLOCKED 1252
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1252
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1253
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1253
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1254
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1254
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1255
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1255
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1256
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1256
+#define WT_STAT_CONN_PAGE_SLEEP 1257
/*!
* thread-yield: page delete rollback time sleeping for state change
* (usecs)
*/
-#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1257
+#define WT_STAT_CONN_PAGE_DEL_ROLLBACK_BLOCKED 1258
/*! thread-yield: page reconciliation yielded due to child modification */
-#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1258
+#define WT_STAT_CONN_CHILD_MODIFY_BLOCKED_PAGE 1259
/*!
* thread-yield: tree descend one level yielded for split page index
* update
*/
-#define WT_STAT_CONN_TREE_DESCEND_BLOCKED 1259
+#define WT_STAT_CONN_TREE_DESCEND_BLOCKED 1260
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1260
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1261
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1261
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1262
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1262
+#define WT_STAT_CONN_TXN_BEGIN 1263
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1263
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1264
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1264
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1265
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1265
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1266
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1266
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1267
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1267
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1268
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1268
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1269
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1269
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1270
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1270
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1271
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1271
+#define WT_STAT_CONN_TXN_CHECKPOINT 1272
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1272
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1273
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1273
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1274
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1274
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1275
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1275
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1276
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1276
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1277
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1277
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1278
/*!
* transaction: transaction range of IDs currently pinned by named
* snapshots
*/
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1278
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1279
/*! transaction: transaction range of timestamps currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1279
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP 1280
/*!
* transaction: transaction range of timestamps pinned by the oldest
* timestamp
*/
-#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1280
+#define WT_STAT_CONN_TXN_PINNED_TIMESTAMP_OLDEST 1281
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1281
+#define WT_STAT_CONN_TXN_SYNC 1282
/*! transaction: transactions commit timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1282
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_HEAD 1283
/*! transaction: transactions commit timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1283
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_INSERTS 1284
/*! transaction: transactions commit timestamp queue length */
-#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1284
+#define WT_STAT_CONN_TXN_COMMIT_QUEUE_LEN 1285
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1285
+#define WT_STAT_CONN_TXN_COMMIT 1286
/*! transaction: transactions read timestamp queue inserts to head */
-#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1286
+#define WT_STAT_CONN_TXN_READ_QUEUE_HEAD 1287
/*! transaction: transactions read timestamp queue inserts total */
-#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1287
+#define WT_STAT_CONN_TXN_READ_QUEUE_INSERTS 1288
/*! transaction: transactions read timestamp queue length */
-#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1288
+#define WT_STAT_CONN_TXN_READ_QUEUE_LEN 1289
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1289
+#define WT_STAT_CONN_TXN_ROLLBACK 1290
/*! transaction: update conflicts */
-#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1290
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1291
/*!
* @}
diff --git a/src/third_party/wiredtiger/src/log/log.c b/src/third_party/wiredtiger/src/log/log.c
index 4c32b9b02ed..17c77f532bb 100644
--- a/src/third_party/wiredtiger/src/log/log.c
+++ b/src/third_party/wiredtiger/src/log/log.c
@@ -2658,8 +2658,10 @@ __wt_log_flush(WT_SESSION_IMPL *session, uint32_t flags)
* Wait until all current outstanding writes have been written
* to the file system.
*/
- while (__wt_log_cmp(&last_lsn, &lsn) > 0)
+ while (__wt_log_cmp(&last_lsn, &lsn) > 0) {
+ __wt_sleep(0, WT_THOUSAND);
WT_RET(__wt_log_flush_lsn(session, &lsn, false));
+ }
__wt_verbose(session, WT_VERB_LOG,
"log_flush: flags %#" PRIx32 " LSN %" PRIu32 "/%" PRIu32,
diff --git a/src/third_party/wiredtiger/src/lsm/lsm_tree.c b/src/third_party/wiredtiger/src/lsm/lsm_tree.c
index 6927fe909f8..c5b63df099f 100644
--- a/src/third_party/wiredtiger/src/lsm/lsm_tree.c
+++ b/src/third_party/wiredtiger/src/lsm/lsm_tree.c
@@ -16,7 +16,7 @@ static int __lsm_tree_set_name(WT_SESSION_IMPL *, WT_LSM_TREE *, const char *);
/*
* __lsm_tree_discard_state --
- * Free the metadata configuration state related LSM tree pointers.
+ * Free the metadata configuration state-related LSM tree pointers.
*/
static void
__lsm_tree_discard_state(WT_SESSION_IMPL *session, WT_LSM_TREE *lsm_tree)
@@ -1127,7 +1127,7 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
WT_LSM_TREE *lsm_tree;
uint64_t progress;
uint32_t i;
- bool compacting, flushing, locked, ref;
+ bool compacting, flushing, locked, push_flush, ref;
compacting = flushing = locked = ref = false;
chunk = NULL;
@@ -1188,10 +1188,15 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
/*
* Set the switch transaction on the current chunk, if it
* hasn't been set before. This prevents further writes, so it
- * can be flushed by the checkpoint worker.
+ * can be flushed by the checkpoint worker. If this is a newly
+ * opened tree the primary chunk may already be stable. Only
+ * push a flush work unit if necessary.
*/
+ push_flush = false;
if (lsm_tree->nchunks > 0 &&
- (chunk = lsm_tree->chunk[lsm_tree->nchunks - 1]) != NULL) {
+ (chunk = lsm_tree->chunk[lsm_tree->nchunks - 1]) != NULL &&
+ !F_ISSET(chunk, (WT_LSM_CHUNK_ONDISK | WT_LSM_CHUNK_STABLE))) {
+ push_flush = true;
if (chunk->switch_txn == WT_TXN_NONE) {
/*
* Make sure any cursors open on the tree see the
@@ -1209,15 +1214,14 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
ref = true;
}
- locked = false;
- __wt_lsm_tree_writeunlock(session, lsm_tree);
-
- if (chunk != NULL) {
+ if (push_flush) {
__wt_verbose(session, WT_VERB_LSM,
"Compact force flush %s flags 0x%" PRIx32
" chunk %" PRIu32 " flags 0x%" PRIx32,
name, lsm_tree->flags, chunk->id, chunk->flags);
flushing = true;
+ locked = false;
+ __wt_lsm_tree_writeunlock(session, lsm_tree);
/*
* Make sure the in-memory chunk gets flushed do not push a
* switch, because we don't want to create a new in-memory
@@ -1235,6 +1239,8 @@ __wt_lsm_compact(WT_SESSION_IMPL *session, const char *name, bool *skipp)
F_SET(lsm_tree, WT_LSM_TREE_COMPACTING);
__wt_verbose(session, WT_VERB_LSM,
"COMPACT: Start compacting %s", lsm_tree->name);
+ locked = false;
+ __wt_lsm_tree_writeunlock(session, lsm_tree);
}
/* Wait for the work unit queues to drain. */
@@ -1341,11 +1347,13 @@ __wt_lsm_tree_worker(WT_SESSION_IMPL *session,
WT_LSM_CHUNK *chunk;
WT_LSM_TREE *lsm_tree;
u_int i;
- bool exclusive, locked;
+ bool exclusive, locked, need_release;
locked = false;
+ need_release = false;
exclusive = FLD_ISSET(open_flags, WT_DHANDLE_EXCLUSIVE);
WT_RET(__wt_lsm_tree_get(session, uri, exclusive, &lsm_tree));
+ need_release = true;
/*
* We mark that we're busy using the tree to coordinate
@@ -1383,13 +1391,22 @@ __wt_lsm_tree_worker(WT_SESSION_IMPL *session,
if (FLD_ISSET(open_flags, WT_BTREE_ALTER)) {
WT_ERR(__wt_lsm_meta_write(session, lsm_tree, cfg[0]));
/*
- * We're about to read in the new configuration that
- * we just wrote. Free the old ones.
+ * We're about to discard the tree so we do not need to
+ * release it later.
+ */
+ need_release = false;
+ if (exclusive)
+ __wt_lsm_tree_writeunlock(session, lsm_tree);
+ else
+ __wt_lsm_tree_readunlock(session, lsm_tree);
+ locked = false;
+ /*
+ * We rewrote the meta-data. Discard the tree and the next
+ * access will reopen it.
*/
- __lsm_tree_discard_state(session, lsm_tree);
- if ((ret = __wt_lsm_meta_read(session, lsm_tree)) != 0)
- WT_PANIC_ERR(session, ret,
- "Failed to read updated LSM configuration");
+ WT_WITH_HANDLE_LIST_WRITE_LOCK(session,
+ ret = __lsm_tree_discard(session, lsm_tree, false));
+ WT_ERR(ret);
}
err: if (locked) {
@@ -1398,6 +1415,7 @@ err: if (locked) {
else
__wt_lsm_tree_readunlock(session, lsm_tree);
}
- __wt_lsm_tree_release(session, lsm_tree);
+ if (need_release)
+ __wt_lsm_tree_release(session, lsm_tree);
return (ret);
}
diff --git a/src/third_party/wiredtiger/src/reconcile/rec_write.c b/src/third_party/wiredtiger/src/reconcile/rec_write.c
index b509c49cbbc..7e9980e0887 100644
--- a/src/third_party/wiredtiger/src/reconcile/rec_write.c
+++ b/src/third_party/wiredtiger/src/reconcile/rec_write.c
@@ -420,8 +420,15 @@ __wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref,
}
oldest_id = __wt_txn_oldest_id(session);
- if (LF_ISSET(WT_REC_EVICT))
+ if (LF_ISSET(WT_REC_EVICT)) {
mod->last_eviction_id = oldest_id;
+#ifdef HAVE_TIMESTAMPS
+ WT_WITH_TIMESTAMP_READLOCK(session,
+ &S2C(session)->txn_global.rwlock,
+ __wt_timestamp_set(&mod->last_eviction_timestamp,
+ &S2C(session)->txn_global.pinned_timestamp));
+#endif
+ }
#ifdef HAVE_DIAGNOSTIC
/*
diff --git a/src/third_party/wiredtiger/src/support/stat.c b/src/third_party/wiredtiger/src/support/stat.c
index b4533841ec6..eeb1f2d26e9 100644
--- a/src/third_party/wiredtiger/src/support/stat.c
+++ b/src/third_party/wiredtiger/src/support/stat.c
@@ -761,6 +761,7 @@ static const char * const __stats_connection_desc[] = {
"cache: application threads page write from cache to disk count",
"cache: application threads page write from cache to disk time (usecs)",
"cache: bytes belonging to page images in the cache",
+ "cache: bytes belonging to the lookaside table in the cache",
"cache: bytes currently in the cache",
"cache: bytes not belonging to page images in the cache",
"cache: bytes read into cache",
@@ -1094,6 +1095,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->cache_write_app_count = 0;
stats->cache_write_app_time = 0;
/* not clearing cache_bytes_image */
+ /* not clearing cache_bytes_lookaside */
/* not clearing cache_bytes_inuse */
/* not clearing cache_bytes_other */
stats->cache_bytes_read = 0;
@@ -1409,6 +1411,8 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, cache_write_app_count);
to->cache_write_app_time += WT_STAT_READ(from, cache_write_app_time);
to->cache_bytes_image += WT_STAT_READ(from, cache_bytes_image);
+ to->cache_bytes_lookaside +=
+ WT_STAT_READ(from, cache_bytes_lookaside);
to->cache_bytes_inuse += WT_STAT_READ(from, cache_bytes_inuse);
to->cache_bytes_other += WT_STAT_READ(from, cache_bytes_other);
to->cache_bytes_read += WT_STAT_READ(from, cache_bytes_read);
diff --git a/src/third_party/wiredtiger/src/txn/txn.c b/src/third_party/wiredtiger/src/txn/txn.c
index 8b4a7fc7936..c461e5f8e45 100644
--- a/src/third_party/wiredtiger/src/txn/txn.c
+++ b/src/third_party/wiredtiger/src/txn/txn.c
@@ -612,7 +612,7 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
WT_TXN_GLOBAL *txn_global;
WT_TXN_OP *op;
u_int i;
- bool locked;
+ bool locked, readonly;
#ifdef HAVE_TIMESTAMPS
wt_timestamp_t prev_commit_timestamp, ts;
bool update_timestamp;
@@ -627,6 +627,7 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
WT_ASSERT(session, !F_ISSET(txn, WT_TXN_ERROR) ||
txn->mod_count == 0);
+ readonly = txn->mod_count == 0;
/*
* Look for a commit timestamp.
*/
@@ -849,6 +850,13 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
}
#endif
+ /*
+ * We're between transactions, if we need to block for eviction, it's
+ * a good time to do so. Note that we must ignore any error return
+ * because the user's data is committed.
+ */
+ if (!readonly)
+ (void)__wt_cache_eviction_check(session, false, false, NULL);
return (0);
err: /*
@@ -874,10 +882,12 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
WT_TXN *txn;
WT_TXN_OP *op;
u_int i;
+ bool readonly;
WT_UNUSED(cfg);
txn = &session->txn;
+ readonly = txn->mod_count == 0;
WT_ASSERT(session, F_ISSET(txn, WT_TXN_RUNNING));
/* Rollback notification. */
@@ -921,6 +931,13 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
txn->mod_count = 0;
__wt_txn_release(session);
+ /*
+ * We're between transactions, if we need to block for eviction, it's
+ * a good time to do so. Note that we must ignore any error return
+ * because the user's data is committed.
+ */
+ if (!readonly)
+ (void)__wt_cache_eviction_check(session, false, false, NULL);
return (ret);
}