summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/btree/bt_read.c48
-rw-r--r--src/cache/cache_las.c12
-rw-r--r--src/config/config_def.c55
-rw-r--r--src/conn/conn_api.c1
-rw-r--r--src/conn/conn_dhandle.c89
-rw-r--r--src/conn/conn_handle.c4
-rw-r--r--src/cursor/cur_table.c6
-rw-r--r--src/docs/backup.dox5
-rw-r--r--src/evict/evict_lru.c23
-rw-r--r--src/include/connection.h10
-rw-r--r--src/include/extern_posix.h4
-rw-r--r--src/include/flags.h39
-rw-r--r--src/include/mutex.h24
-rw-r--r--src/include/stat.h9
-rw-r--r--src/include/txn.i2
-rw-r--r--src/include/wiredtiger.in272
-rw-r--r--src/lsm/lsm_cursor.c4
-rw-r--r--src/os_posix/os_thread.c2
-rw-r--r--src/reconcile/rec_write.c58
-rw-r--r--src/session/session_dhandle.c3
-rw-r--r--src/support/err.c11
-rw-r--r--src/support/mtx_rw.c48
-rw-r--r--src/support/stat.c34
23 files changed, 495 insertions, 268 deletions
diff --git a/src/btree/bt_read.c b/src/btree/bt_read.c
index de84a711019..3f85e58f088 100644
--- a/src/btree/bt_read.c
+++ b/src/btree/bt_read.c
@@ -8,6 +8,8 @@
#include "wt_internal.h"
+static void __btree_verbose_lookaside_read(WT_SESSION_IMPL *);
+
/*
* __wt_las_remove_block --
* Remove all records matching a key prefix from the lookaside store.
@@ -19,8 +21,7 @@ __wt_las_remove_block(WT_SESSION_IMPL *session,
WT_DECL_ITEM(las_addr);
WT_DECL_ITEM(las_key);
WT_DECL_RET;
- uint64_t las_counter, las_txnid;
- int64_t remove_cnt;
+ uint64_t las_counter, las_txnid, remove_cnt;
uint32_t las_id;
int exact;
@@ -74,7 +75,7 @@ err: __wt_scr_free(session, &las_addr);
if (remove_cnt > S2C(session)->las_record_cnt)
S2C(session)->las_record_cnt = 0;
else if (remove_cnt > 0)
- (void)__wt_atomic_subi64(
+ (void)__wt_atomic_sub64(
&S2C(session)->las_record_cnt, remove_cnt);
return (ret);
@@ -451,6 +452,7 @@ __page_read(WT_SESSION_IMPL *session, WT_REF *ref)
*/
dsk = tmp.data;
if (F_ISSET(dsk, WT_PAGE_LAS_UPDATE) && __wt_las_is_written(session)) {
+ __btree_verbose_lookaside_read(session);
WT_STAT_CONN_INCR(session, cache_read_lookaside);
WT_STAT_DATA_INCR(session, cache_read_lookaside);
@@ -680,3 +682,43 @@ skip_evict:
__wt_sleep(0, sleep_cnt);
}
}
+
+/*
+ * __btree_verbose_lookaside_read --
+ * Create a verbose message to display at most once per checkpoint when
+ * performing a lookaside table read.
+ */
+static void
+__btree_verbose_lookaside_read(WT_SESSION_IMPL *session)
+{
+#ifdef HAVE_VERBOSE
+ WT_CONNECTION_IMPL *conn;
+ uint64_t ckpt_gen_current, ckpt_gen_last;
+
+ if (!WT_VERBOSE_ISSET(session, WT_VERB_LOOKASIDE)) return;
+
+ conn = S2C(session);
+ ckpt_gen_current = __wt_gen(session, WT_GEN_CHECKPOINT);
+ ckpt_gen_last = conn->las_verb_gen_read;
+
+ /*
+ * This message is throttled to one per checkpoint. To do this we
+ * track the generation of the last checkpoint for which the message
+ * was printed and check against the current checkpoint generation.
+ */
+ if (ckpt_gen_current > ckpt_gen_last) {
+ /*
+ * Attempt to atomically replace the last checkpoint generation
+ * for which this message was printed. If the atomic swap fails
+ * we have raced and the winning thread will print the message.
+ */
+ if (__wt_atomic_casv64(&conn->las_verb_gen_read,
+ ckpt_gen_last, ckpt_gen_current)) {
+ __wt_verbose(session, WT_VERB_LOOKASIDE,
+ "Read from lookaside file triggered.");
+ }
+ }
+#else
+ WT_UNUSED(session);
+#endif
+}
diff --git a/src/cache/cache_las.c b/src/cache/cache_las.c
index 06c6354148c..a2233514223 100644
--- a/src/cache/cache_las.c
+++ b/src/cache/cache_las.c
@@ -292,8 +292,7 @@ __wt_las_sweep(WT_SESSION_IMPL *session)
WT_DECL_ITEM(las_key);
WT_DECL_RET;
WT_ITEM *key;
- uint64_t cnt, las_counter, las_txnid;
- int64_t remove_cnt;
+ uint64_t cnt, las_counter, las_txnid, remove_cnt;
uint32_t las_id, session_flags;
int notused;
@@ -342,7 +341,7 @@ __wt_las_sweep(WT_SESSION_IMPL *session)
* blocks in the cache in order to get rid of them, and slowly review
* lookaside blocks that have already been evicted.
*/
- cnt = (uint64_t)WT_MAX(100, conn->las_record_cnt / 30);
+ cnt = WT_MAX(100, conn->las_record_cnt / 30);
/* Discard pages we read as soon as we're done with them. */
F_SET(session, WT_SESSION_NO_CACHE);
@@ -390,14 +389,13 @@ err: __wt_buf_free(session, key);
WT_TRET(__wt_las_cursor_close(session, &cursor, session_flags));
/*
- * If there were races to remove records, we can over-count. All
- * arithmetic is signed, so underflow isn't fatal, but check anyway so
- * we don't skew low over time.
+ * If there were races to remove records, we can over-count. Underflow
+ * isn't fatal, but check anyway so we don't skew low over time.
*/
if (remove_cnt > conn->las_record_cnt)
conn->las_record_cnt = 0;
else if (remove_cnt > 0)
- (void)__wt_atomic_subi64(&conn->las_record_cnt, remove_cnt);
+ (void)__wt_atomic_sub64(&conn->las_record_cnt, remove_cnt);
F_CLR(session, WT_SESSION_NO_CACHE);
diff --git a/src/config/config_def.c b/src/config/config_def.c
index f152fbacad4..a7397d21c6a 100644
--- a/src/config/config_def.c
+++ b/src/config/config_def.c
@@ -148,11 +148,12 @@ static const WT_CONFIG_CHECK confchk_WT_CONNECTION_reconfigure[] = {
{ "verbose", "list",
NULL, "choices=[\"api\",\"block\",\"checkpoint\",\"compact\","
"\"evict\",\"evict_stuck\",\"evictserver\",\"fileops\","
- "\"handleops\",\"log\",\"lsm\",\"lsm_manager\",\"metadata\","
- "\"mutex\",\"overflow\",\"read\",\"rebalance\",\"reconcile\","
- "\"recovery\",\"recovery_progress\",\"salvage\",\"shared_cache\","
- "\"split\",\"temporary\",\"thread_group\",\"transaction\","
- "\"verify\",\"version\",\"write\"]",
+ "\"handleops\",\"log\",\"lookaside_activity\",\"lsm\","
+ "\"lsm_manager\",\"metadata\",\"mutex\",\"overflow\",\"read\","
+ "\"rebalance\",\"reconcile\",\"recovery\",\"recovery_progress\","
+ "\"salvage\",\"shared_cache\",\"split\",\"temporary\","
+ "\"thread_group\",\"transaction\",\"verify\",\"version\","
+ "\"write\"]",
NULL, 0 },
{ NULL, NULL, NULL, NULL, NULL, 0 }
};
@@ -751,11 +752,12 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open[] = {
{ "verbose", "list",
NULL, "choices=[\"api\",\"block\",\"checkpoint\",\"compact\","
"\"evict\",\"evict_stuck\",\"evictserver\",\"fileops\","
- "\"handleops\",\"log\",\"lsm\",\"lsm_manager\",\"metadata\","
- "\"mutex\",\"overflow\",\"read\",\"rebalance\",\"reconcile\","
- "\"recovery\",\"recovery_progress\",\"salvage\",\"shared_cache\","
- "\"split\",\"temporary\",\"thread_group\",\"transaction\","
- "\"verify\",\"version\",\"write\"]",
+ "\"handleops\",\"log\",\"lookaside_activity\",\"lsm\","
+ "\"lsm_manager\",\"metadata\",\"mutex\",\"overflow\",\"read\","
+ "\"rebalance\",\"reconcile\",\"recovery\",\"recovery_progress\","
+ "\"salvage\",\"shared_cache\",\"split\",\"temporary\","
+ "\"thread_group\",\"transaction\",\"verify\",\"version\","
+ "\"write\"]",
NULL, 0 },
{ "write_through", "list",
NULL, "choices=[\"data\",\"log\"]",
@@ -838,11 +840,12 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_all[] = {
{ "verbose", "list",
NULL, "choices=[\"api\",\"block\",\"checkpoint\",\"compact\","
"\"evict\",\"evict_stuck\",\"evictserver\",\"fileops\","
- "\"handleops\",\"log\",\"lsm\",\"lsm_manager\",\"metadata\","
- "\"mutex\",\"overflow\",\"read\",\"rebalance\",\"reconcile\","
- "\"recovery\",\"recovery_progress\",\"salvage\",\"shared_cache\","
- "\"split\",\"temporary\",\"thread_group\",\"transaction\","
- "\"verify\",\"version\",\"write\"]",
+ "\"handleops\",\"log\",\"lookaside_activity\",\"lsm\","
+ "\"lsm_manager\",\"metadata\",\"mutex\",\"overflow\",\"read\","
+ "\"rebalance\",\"reconcile\",\"recovery\",\"recovery_progress\","
+ "\"salvage\",\"shared_cache\",\"split\",\"temporary\","
+ "\"thread_group\",\"transaction\",\"verify\",\"version\","
+ "\"write\"]",
NULL, 0 },
{ "version", "string", NULL, NULL, NULL, 0 },
{ "write_through", "list",
@@ -920,11 +923,12 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_basecfg[] = {
{ "verbose", "list",
NULL, "choices=[\"api\",\"block\",\"checkpoint\",\"compact\","
"\"evict\",\"evict_stuck\",\"evictserver\",\"fileops\","
- "\"handleops\",\"log\",\"lsm\",\"lsm_manager\",\"metadata\","
- "\"mutex\",\"overflow\",\"read\",\"rebalance\",\"reconcile\","
- "\"recovery\",\"recovery_progress\",\"salvage\",\"shared_cache\","
- "\"split\",\"temporary\",\"thread_group\",\"transaction\","
- "\"verify\",\"version\",\"write\"]",
+ "\"handleops\",\"log\",\"lookaside_activity\",\"lsm\","
+ "\"lsm_manager\",\"metadata\",\"mutex\",\"overflow\",\"read\","
+ "\"rebalance\",\"reconcile\",\"recovery\",\"recovery_progress\","
+ "\"salvage\",\"shared_cache\",\"split\",\"temporary\","
+ "\"thread_group\",\"transaction\",\"verify\",\"version\","
+ "\"write\"]",
NULL, 0 },
{ "version", "string", NULL, NULL, NULL, 0 },
{ "write_through", "list",
@@ -1002,11 +1006,12 @@ static const WT_CONFIG_CHECK confchk_wiredtiger_open_usercfg[] = {
{ "verbose", "list",
NULL, "choices=[\"api\",\"block\",\"checkpoint\",\"compact\","
"\"evict\",\"evict_stuck\",\"evictserver\",\"fileops\","
- "\"handleops\",\"log\",\"lsm\",\"lsm_manager\",\"metadata\","
- "\"mutex\",\"overflow\",\"read\",\"rebalance\",\"reconcile\","
- "\"recovery\",\"recovery_progress\",\"salvage\",\"shared_cache\","
- "\"split\",\"temporary\",\"thread_group\",\"transaction\","
- "\"verify\",\"version\",\"write\"]",
+ "\"handleops\",\"log\",\"lookaside_activity\",\"lsm\","
+ "\"lsm_manager\",\"metadata\",\"mutex\",\"overflow\",\"read\","
+ "\"rebalance\",\"reconcile\",\"recovery\",\"recovery_progress\","
+ "\"salvage\",\"shared_cache\",\"split\",\"temporary\","
+ "\"thread_group\",\"transaction\",\"verify\",\"version\","
+ "\"write\"]",
NULL, 0 },
{ "write_through", "list",
NULL, "choices=[\"data\",\"log\"]",
diff --git a/src/conn/conn_api.c b/src/conn/conn_api.c
index c0a1f5c0920..70e96aa8473 100644
--- a/src/conn/conn_api.c
+++ b/src/conn/conn_api.c
@@ -1803,6 +1803,7 @@ __wt_verbose_config(WT_SESSION_IMPL *session, const char *cfg[])
{ "fileops", WT_VERB_FILEOPS },
{ "handleops", WT_VERB_HANDLEOPS },
{ "log", WT_VERB_LOG },
+ { "lookaside_activity", WT_VERB_LOOKASIDE },
{ "lsm", WT_VERB_LSM },
{ "lsm_manager", WT_VERB_LSM_MANAGER },
{ "metadata", WT_VERB_METADATA },
diff --git a/src/conn/conn_dhandle.c b/src/conn/conn_dhandle.c
index d4670562eb8..97fdc7557ee 100644
--- a/src/conn/conn_dhandle.c
+++ b/src/conn/conn_dhandle.c
@@ -481,6 +481,49 @@ err: WT_DHANDLE_RELEASE(dhandle);
}
/*
+ * __conn_dhandle_close_one --
+ * Lock and, if necessary, close a data handle.
+ */
+static int
+__conn_dhandle_close_one(WT_SESSION_IMPL *session,
+ const char *uri, const char *checkpoint, bool force)
+{
+ WT_DECL_RET;
+
+ /*
+ * Lock the handle exclusively. If this is part of schema-changing
+ * operation (indicated by metadata tracking being enabled), hold the
+ * lock for the duration of the operation.
+ */
+ WT_RET(__wt_session_get_btree(session, uri, checkpoint,
+ NULL, WT_DHANDLE_EXCLUSIVE | WT_DHANDLE_LOCK_ONLY));
+ if (WT_META_TRACKING(session))
+ WT_RET(__wt_meta_track_handle_lock(session, false));
+
+ /*
+ * We have an exclusive lock, which means there are no cursors open at
+ * this point. Close the handle, if necessary.
+ */
+ if (F_ISSET(session->dhandle, WT_DHANDLE_OPEN)) {
+ __wt_meta_track_sub_on(session);
+ ret = __wt_conn_btree_sync_and_close(session, false, force);
+
+ /*
+ * If the close succeeded, drop any locks it acquired. If
+ * there was a failure, this function will fail and the whole
+ * transaction will be rolled back.
+ */
+ if (ret == 0)
+ ret = __wt_meta_track_sub_off(session);
+ }
+
+ if (!WT_META_TRACKING(session))
+ WT_TRET(__wt_session_release_btree(session));
+
+ return (ret);
+}
+
+/*
* __wt_conn_dhandle_close_all --
* Close all data handles handles with matching name (including all
* checkpoint handles).
@@ -500,48 +543,22 @@ __wt_conn_dhandle_close_all(
F_ISSET(session, WT_SESSION_LOCKED_HANDLE_LIST_WRITE));
WT_ASSERT(session, session->dhandle == NULL);
+ /*
+ * Lock the live handle first. This ordering is important: we rely on
+ * locking the live handle to fail fast if the tree is busy (e.g., with
+ * cursors open or in a checkpoint).
+ */
+ WT_ERR(__conn_dhandle_close_one(session, uri, NULL, force));
+
bucket = __wt_hash_city64(uri, strlen(uri)) % WT_HASH_ARRAY_SIZE;
TAILQ_FOREACH(dhandle, &conn->dhhash[bucket], hashq) {
if (strcmp(dhandle->name, uri) != 0 ||
+ dhandle->checkpoint == NULL ||
F_ISSET(dhandle, WT_DHANDLE_DEAD))
continue;
- session->dhandle = dhandle;
-
- /*
- * Lock the handle exclusively. If this is part of
- * schema-changing operation (indicated by metadata tracking
- * being enabled), hold the lock for the duration of the
- * operation.
- */
- WT_ERR(__wt_session_get_btree(session,
- dhandle->name, dhandle->checkpoint,
- NULL, WT_DHANDLE_EXCLUSIVE | WT_DHANDLE_LOCK_ONLY));
- if (WT_META_TRACKING(session))
- WT_ERR(__wt_meta_track_handle_lock(session, false));
-
- /*
- * We have an exclusive lock, which means there are no cursors
- * open at this point. Close the handle, if necessary.
- */
- if (F_ISSET(dhandle, WT_DHANDLE_OPEN)) {
- __wt_meta_track_sub_on(session);
- ret = __wt_conn_btree_sync_and_close(
- session, false, force);
-
- /*
- * If the close succeeded, drop any locks it acquired.
- * If there was a failure, this function will fail and
- * the whole transaction will be rolled back.
- */
- if (ret == 0)
- ret = __wt_meta_track_sub_off(session);
- }
-
- if (!WT_META_TRACKING(session))
- WT_TRET(__wt_session_release_btree(session));
-
- WT_ERR(ret);
+ WT_ERR(__conn_dhandle_close_one(
+ session, dhandle->name, dhandle->checkpoint, force));
}
err: session->dhandle = NULL;
diff --git a/src/conn/conn_handle.c b/src/conn/conn_handle.c
index 32a0d80c1f3..2f3f9488b58 100644
--- a/src/conn/conn_handle.c
+++ b/src/conn/conn_handle.c
@@ -62,9 +62,9 @@ __wt_connection_init(WT_CONNECTION_IMPL *conn)
WT_RET(__wt_spin_init(session, &conn->turtle_lock, "turtle file"));
/* Read-write locks */
- WT_RET(__wt_rwlock_init(session, &conn->dhandle_lock));
+ WT_RWLOCK_INIT_TRACKED(session, &conn->dhandle_lock, dhandle);
WT_RET(__wt_rwlock_init(session, &conn->hot_backup_lock));
- WT_RET(__wt_rwlock_init(session, &conn->table_lock));
+ WT_RWLOCK_INIT_TRACKED(session, &conn->table_lock, table);
/* Setup the spin locks for the LSM manager queues. */
WT_RET(__wt_spin_init(session,
diff --git a/src/cursor/cur_table.c b/src/cursor/cur_table.c
index 3959d58476b..000fcae99f2 100644
--- a/src/cursor/cur_table.c
+++ b/src/cursor/cur_table.c
@@ -988,6 +988,12 @@ __wt_curtable_open(WT_SESSION_IMPL *session,
table->cgroups[0]->source, NULL, cfg, cursorp);
__wt_schema_release_table(session, table);
+ if (ret == 0) {
+ /* Fix up the public URI to match what was passed in. */
+ cursor = *cursorp;
+ __wt_free(session, cursor->uri);
+ WT_TRET(__wt_strdup(session, uri, &cursor->uri));
+ }
return (ret);
}
diff --git a/src/docs/backup.dox b/src/docs/backup.dox
index 45edc85d6a5..91b15da9275 100644
--- a/src/docs/backup.dox
+++ b/src/docs/backup.dox
@@ -59,6 +59,11 @@ During the period the backup cursor is open, database checkpoints can
be created, but no checkpoints can be deleted. This may result in
significant file growth.
+Additionally, if a crash occurs during the period the backup cursor is open and
+logging is disabled, then the system will be restored to the most recent
+checkpoint prior to the opening of the backup cursor, even if later database
+checkpoints were created.
+
The following is a programmatic example of creating a backup:
@snippet ex_all.c backup
diff --git a/src/evict/evict_lru.c b/src/evict/evict_lru.c
index b5dd3837531..46291eb63de 100644
--- a/src/evict/evict_lru.c
+++ b/src/evict/evict_lru.c
@@ -31,28 +31,17 @@ static int __evict_walk_file(
static int
__evict_lock_handle_list(WT_SESSION_IMPL *session)
{
- struct timespec enter, leave;
WT_CACHE *cache;
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
WT_RWLOCK *dh_lock;
u_int spins;
- bool dh_stats;
conn = S2C(session);
cache = conn->cache;
dh_lock = &conn->dhandle_lock;
/*
- * Setup tracking of handle lock acquisition wait time if statistics
- * are enabled.
- */
- dh_stats = WT_STAT_ENABLED(session);
-
- if (dh_stats)
- __wt_epoch(session, &enter);
-
- /*
* Use a custom lock acquisition back off loop so the eviction server
* notices any interrupt quickly.
*/
@@ -64,17 +53,7 @@ __evict_lock_handle_list(WT_SESSION_IMPL *session)
else
__wt_sleep(0, WT_THOUSAND);
}
- /*
- * Only record statistics on success.
- */
- WT_RET(ret);
- if (dh_stats) {
- __wt_epoch(session, &leave);
- WT_STAT_CONN_INCRV(
- session, lock_handle_list_wait_eviction,
- (int64_t)WT_TIMEDIFF_US(leave, enter));
- }
- return (0);
+ return (ret);
}
/*
diff --git a/src/include/connection.h b/src/include/connection.h
index bf2f8a2c7e1..56d801cd361 100644
--- a/src/include/connection.h
+++ b/src/include/connection.h
@@ -360,7 +360,15 @@ struct __wt_connection_impl {
bool las_written; /* Lookaside table has been written */
WT_ITEM las_sweep_key; /* Sweep server's saved key */
- int64_t las_record_cnt;/* Count of lookaside records */
+ uint64_t las_record_cnt;/* Count of lookaside records */
+
+ /*
+ * The "lookaside_activity" verbose messages are throttled to once per
+ * checkpoint. To accomplish this we track the checkpoint generation
+ * for the most recent read and write verbose messages.
+ */
+ volatile uint64_t las_verb_gen_read;
+ volatile uint64_t las_verb_gen_write;
/* Locked: collator list */
TAILQ_HEAD(__wt_coll_qh, __wt_named_collator) collqh;
diff --git a/src/include/extern_posix.h b/src/include/extern_posix.h
index c0ed056c7b6..b6b5ac51f73 100644
--- a/src/include/extern_posix.h
+++ b/src/include/extern_posix.h
@@ -25,8 +25,8 @@ extern void __wt_stream_set_line_buffer(FILE *fp) WT_GCC_FUNC_DECL_ATTRIBUTE((vi
extern void __wt_stream_set_no_buffer(FILE *fp) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
extern void __wt_sleep(uint64_t seconds, uint64_t micro_seconds) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
extern int __wt_vsnprintf_len_incr( char *buf, size_t size, size_t *retsizep, const char *fmt, va_list ap) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
-extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern int __wt_thread_id(char *buf, size_t buflen) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
extern void __wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
extern void __wt_yield(void) WT_GCC_FUNC_DECL_ATTRIBUTE((visibility("default")));
diff --git a/src/include/flags.h b/src/include/flags.h
index d7c0e0f9472..919c0dd2f98 100644
--- a/src/include/flags.h
+++ b/src/include/flags.h
@@ -95,25 +95,26 @@
#define WT_VERB_FILEOPS 0x00000080
#define WT_VERB_HANDLEOPS 0x00000100
#define WT_VERB_LOG 0x00000200
-#define WT_VERB_LSM 0x00000400
-#define WT_VERB_LSM_MANAGER 0x00000800
-#define WT_VERB_METADATA 0x00001000
-#define WT_VERB_MUTEX 0x00002000
-#define WT_VERB_OVERFLOW 0x00004000
-#define WT_VERB_READ 0x00008000
-#define WT_VERB_REBALANCE 0x00010000
-#define WT_VERB_RECONCILE 0x00020000
-#define WT_VERB_RECOVERY 0x00040000
-#define WT_VERB_RECOVERY_PROGRESS 0x00080000
-#define WT_VERB_SALVAGE 0x00100000
-#define WT_VERB_SHARED_CACHE 0x00200000
-#define WT_VERB_SPLIT 0x00400000
-#define WT_VERB_TEMPORARY 0x00800000
-#define WT_VERB_THREAD_GROUP 0x01000000
-#define WT_VERB_TRANSACTION 0x02000000
-#define WT_VERB_VERIFY 0x04000000
-#define WT_VERB_VERSION 0x08000000
-#define WT_VERB_WRITE 0x10000000
+#define WT_VERB_LOOKASIDE 0x00000400
+#define WT_VERB_LSM 0x00000800
+#define WT_VERB_LSM_MANAGER 0x00001000
+#define WT_VERB_METADATA 0x00002000
+#define WT_VERB_MUTEX 0x00004000
+#define WT_VERB_OVERFLOW 0x00008000
+#define WT_VERB_READ 0x00010000
+#define WT_VERB_REBALANCE 0x00020000
+#define WT_VERB_RECONCILE 0x00040000
+#define WT_VERB_RECOVERY 0x00080000
+#define WT_VERB_RECOVERY_PROGRESS 0x00100000
+#define WT_VERB_SALVAGE 0x00200000
+#define WT_VERB_SHARED_CACHE 0x00400000
+#define WT_VERB_SPLIT 0x00800000
+#define WT_VERB_TEMPORARY 0x01000000
+#define WT_VERB_THREAD_GROUP 0x02000000
+#define WT_VERB_TRANSACTION 0x04000000
+#define WT_VERB_VERIFY 0x08000000
+#define WT_VERB_VERSION 0x10000000
+#define WT_VERB_WRITE 0x20000000
#define WT_VISIBILITY_ERR 0x00000080
/*
* flags section: END
diff --git a/src/include/mutex.h b/src/include/mutex.h
index 5f814c2799e..7aeb6160f43 100644
--- a/src/include/mutex.h
+++ b/src/include/mutex.h
@@ -50,11 +50,35 @@ struct __wt_rwlock { /* Read/write lock */
} s;
} u;
+ int16_t stat_read_count_off; /* read acquisitions offset */
+ int16_t stat_write_count_off; /* write acquisitions offset */
+ int16_t stat_app_usecs_off; /* waiting application threads offset */
+ int16_t stat_int_usecs_off; /* waiting server threads offset */
+
WT_CONDVAR *cond_readers; /* Blocking readers */
WT_CONDVAR *cond_writers; /* Blocking writers */
};
/*
+ * WT_RWLOCK_INIT_TRACKED --
+ * Read write lock initialization, with tracking.
+ *
+ * Implemented as a macro so we can pass in a statistics field and convert
+ * it into a statistics structure array offset.
+ */
+#define WT_RWLOCK_INIT_TRACKED(session, l, name) do { \
+ WT_RET(__wt_rwlock_init(session, l)); \
+ (l)->stat_read_count_off = (int16_t)WT_STATS_FIELD_TO_OFFSET( \
+ S2C(session)->stats, lock_##name##_read_count); \
+ (l)->stat_write_count_off = (int16_t)WT_STATS_FIELD_TO_OFFSET( \
+ S2C(session)->stats, lock_##name##_write_count); \
+ (l)->stat_app_usecs_off = (int16_t)WT_STATS_FIELD_TO_OFFSET( \
+ S2C(session)->stats, lock_##name##_wait_application); \
+ (l)->stat_int_usecs_off = (int16_t)WT_STATS_FIELD_TO_OFFSET( \
+ S2C(session)->stats, lock_##name##_wait_internal); \
+} while (0)
+
+/*
* Spin locks:
*
* WiredTiger uses spinlocks for fast mutual exclusion (where operations done
diff --git a/src/include/stat.h b/src/include/stat.h
index 7c2529f1746..7d7d701590a 100644
--- a/src/include/stat.h
+++ b/src/include/stat.h
@@ -399,16 +399,20 @@ struct __wt_connection_stats {
int64_t lock_checkpoint_count;
int64_t lock_checkpoint_wait_application;
int64_t lock_checkpoint_wait_internal;
- int64_t lock_handle_list_wait_eviction;
+ int64_t lock_dhandle_wait_application;
+ int64_t lock_dhandle_wait_internal;
+ int64_t lock_dhandle_read_count;
+ int64_t lock_dhandle_write_count;
int64_t lock_metadata_count;
int64_t lock_metadata_wait_application;
int64_t lock_metadata_wait_internal;
int64_t lock_schema_count;
int64_t lock_schema_wait_application;
int64_t lock_schema_wait_internal;
- int64_t lock_table_count;
int64_t lock_table_wait_application;
int64_t lock_table_wait_internal;
+ int64_t lock_table_read_count;
+ int64_t lock_table_write_count;
int64_t log_slot_switch_busy;
int64_t log_bytes_payload;
int64_t log_bytes_written;
@@ -513,6 +517,7 @@ struct __wt_connection_stats {
int64_t txn_sync;
int64_t txn_commit;
int64_t txn_rollback;
+ int64_t txn_update_conflict;
};
/*
diff --git a/src/include/txn.i b/src/include/txn.i
index f7321af5b12..f4f571cb67e 100644
--- a/src/include/txn.i
+++ b/src/include/txn.i
@@ -424,6 +424,8 @@ __wt_txn_update_check(WT_SESSION_IMPL *session, WT_UPDATE *upd)
if (txn->isolation == WT_ISO_SNAPSHOT)
while (upd != NULL && !__wt_txn_visible(session, upd->txnid)) {
if (upd->txnid != WT_TXN_ABORTED) {
+ WT_STAT_CONN_INCR(
+ session, txn_update_conflict);
WT_STAT_DATA_INCR(
session, txn_update_conflict);
return (WT_ROLLBACK);
diff --git a/src/include/wiredtiger.in b/src/include/wiredtiger.in
index 2bbe812d7f7..cf7117376af 100644
--- a/src/include/wiredtiger.in
+++ b/src/include/wiredtiger.in
@@ -2087,12 +2087,12 @@ struct __wt_connection {
* list\, with values chosen from the following options: \c "api"\, \c
* "block"\, \c "checkpoint"\, \c "compact"\, \c "evict"\, \c
* "evict_stuck"\, \c "evictserver"\, \c "fileops"\, \c "handleops"\, \c
- * "log"\, \c "lsm"\, \c "lsm_manager"\, \c "metadata"\, \c "mutex"\, \c
- * "overflow"\, \c "read"\, \c "rebalance"\, \c "reconcile"\, \c
- * "recovery"\, \c "recovery_progress"\, \c "salvage"\, \c
- * "shared_cache"\, \c "split"\, \c "temporary"\, \c "thread_group"\, \c
- * "transaction"\, \c "verify"\, \c "version"\, \c "write"; default
- * empty.}
+ * "log"\, \c "lookaside_activity"\, \c "lsm"\, \c "lsm_manager"\, \c
+ * "metadata"\, \c "mutex"\, \c "overflow"\, \c "read"\, \c
+ * "rebalance"\, \c "reconcile"\, \c "recovery"\, \c
+ * "recovery_progress"\, \c "salvage"\, \c "shared_cache"\, \c "split"\,
+ * \c "temporary"\, \c "thread_group"\, \c "transaction"\, \c "verify"\,
+ * \c "version"\, \c "write"; default empty.}
* @configend
* @errors
*/
@@ -2619,12 +2619,12 @@ struct __wt_connection {
* list\, such as <code>"verbose=[evictserver\,read]"</code>., a list\, with
* values chosen from the following options: \c "api"\, \c "block"\, \c
* "checkpoint"\, \c "compact"\, \c "evict"\, \c "evict_stuck"\, \c
- * "evictserver"\, \c "fileops"\, \c "handleops"\, \c "log"\, \c "lsm"\, \c
- * "lsm_manager"\, \c "metadata"\, \c "mutex"\, \c "overflow"\, \c "read"\, \c
- * "rebalance"\, \c "reconcile"\, \c "recovery"\, \c "recovery_progress"\, \c
- * "salvage"\, \c "shared_cache"\, \c "split"\, \c "temporary"\, \c
- * "thread_group"\, \c "transaction"\, \c "verify"\, \c "version"\, \c "write";
- * default empty.}
+ * "evictserver"\, \c "fileops"\, \c "handleops"\, \c "log"\, \c
+ * "lookaside_activity"\, \c "lsm"\, \c "lsm_manager"\, \c "metadata"\, \c
+ * "mutex"\, \c "overflow"\, \c "read"\, \c "rebalance"\, \c "reconcile"\, \c
+ * "recovery"\, \c "recovery_progress"\, \c "salvage"\, \c "shared_cache"\, \c
+ * "split"\, \c "temporary"\, \c "thread_group"\, \c "transaction"\, \c
+ * "verify"\, \c "version"\, \c "write"; default empty.}
* @config{write_through, Use \c FILE_FLAG_WRITE_THROUGH on Windows to write to
* files. Ignored on non-Windows systems. Options are given as a list\, such
* as <code>"write_through=[data]"</code>. Configuring \c write_through requires
@@ -4740,252 +4740,268 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_APPLICATION 1140
/*! lock: checkpoint lock internal thread wait time (usecs) */
#define WT_STAT_CONN_LOCK_CHECKPOINT_WAIT_INTERNAL 1141
-/*! lock: handle-list lock eviction thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_HANDLE_LIST_WAIT_EVICTION 1142
+/*!
+ * lock: dhandle lock application thread time waiting for the dhandle
+ * lock (usecs)
+ */
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_APPLICATION 1142
+/*!
+ * lock: dhandle lock internal thread time waiting for the dhandle lock
+ * (usecs)
+ */
+#define WT_STAT_CONN_LOCK_DHANDLE_WAIT_INTERNAL 1143
+/*! lock: dhandle read lock acquisitions */
+#define WT_STAT_CONN_LOCK_DHANDLE_READ_COUNT 1144
+/*! lock: dhandle write lock acquisitions */
+#define WT_STAT_CONN_LOCK_DHANDLE_WRITE_COUNT 1145
/*! lock: metadata lock acquisitions */
-#define WT_STAT_CONN_LOCK_METADATA_COUNT 1143
+#define WT_STAT_CONN_LOCK_METADATA_COUNT 1146
/*! lock: metadata lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1144
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_APPLICATION 1147
/*! lock: metadata lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1145
+#define WT_STAT_CONN_LOCK_METADATA_WAIT_INTERNAL 1148
/*! lock: schema lock acquisitions */
-#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1146
+#define WT_STAT_CONN_LOCK_SCHEMA_COUNT 1149
/*! lock: schema lock application thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1147
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_APPLICATION 1150
/*! lock: schema lock internal thread wait time (usecs) */
-#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1148
-/*! lock: table lock acquisitions */
-#define WT_STAT_CONN_LOCK_TABLE_COUNT 1149
+#define WT_STAT_CONN_LOCK_SCHEMA_WAIT_INTERNAL 1151
/*!
* lock: table lock application thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1150
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_APPLICATION 1152
/*!
* lock: table lock internal thread time waiting for the table lock
* (usecs)
*/
-#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1151
+#define WT_STAT_CONN_LOCK_TABLE_WAIT_INTERNAL 1153
+/*! lock: table read lock acquisitions */
+#define WT_STAT_CONN_LOCK_TABLE_READ_COUNT 1154
+/*! lock: table write lock acquisitions */
+#define WT_STAT_CONN_LOCK_TABLE_WRITE_COUNT 1155
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1152
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1156
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1153
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1157
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1154
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1158
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1155
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1159
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1156
+#define WT_STAT_CONN_LOG_FLUSH 1160
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1157
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1161
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1158
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1162
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1159
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1163
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1160
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1164
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1161
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1165
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1162
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1166
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1163
+#define WT_STAT_CONN_LOG_SCANS 1167
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1164
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1168
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1165
+#define WT_STAT_CONN_LOG_WRITE_LSN 1169
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1166
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1170
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1167
+#define WT_STAT_CONN_LOG_SYNC 1171
/*! log: log sync time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DURATION 1168
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1172
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1169
+#define WT_STAT_CONN_LOG_SYNC_DIR 1173
/*! log: log sync_dir time duration (usecs) */
-#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1170
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1174
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1171
+#define WT_STAT_CONN_LOG_WRITES 1175
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1172
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1176
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1173
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1177
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1174
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1178
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1175
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1179
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1176
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1180
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1177
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1181
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1178
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1182
/*! log: slot close lost race */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1179
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_RACE 1183
/*! log: slot close unbuffered waits */
-#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1180
+#define WT_STAT_CONN_LOG_SLOT_CLOSE_UNBUF 1184
/*! log: slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1181
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1185
/*! log: slot join atomic update races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1182
+#define WT_STAT_CONN_LOG_SLOT_RACES 1186
/*! log: slot join calls atomic updates raced */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1183
+#define WT_STAT_CONN_LOG_SLOT_YIELD_RACE 1187
/*! log: slot join calls did not yield */
-#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1184
+#define WT_STAT_CONN_LOG_SLOT_IMMEDIATE 1188
/*! log: slot join calls found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1185
+#define WT_STAT_CONN_LOG_SLOT_YIELD_CLOSE 1189
/*! log: slot join calls slept */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1186
+#define WT_STAT_CONN_LOG_SLOT_YIELD_SLEEP 1190
/*! log: slot join calls yielded */
-#define WT_STAT_CONN_LOG_SLOT_YIELD 1187
+#define WT_STAT_CONN_LOG_SLOT_YIELD 1191
/*! log: slot join found active slot closed */
-#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1188
+#define WT_STAT_CONN_LOG_SLOT_ACTIVE_CLOSED 1192
/*! log: slot joins yield time (usecs) */
-#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1189
+#define WT_STAT_CONN_LOG_SLOT_YIELD_DURATION 1193
/*! log: slot transitions unable to find free slot */
-#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1190
+#define WT_STAT_CONN_LOG_SLOT_NO_FREE_SLOTS 1194
/*! log: slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1191
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1195
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1192
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1196
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1193
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1197
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1194
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1198
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1195
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1199
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1196
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1200
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1197
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1201
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1198
+#define WT_STAT_CONN_REC_PAGES 1202
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1199
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1203
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1200
+#define WT_STAT_CONN_REC_PAGE_DELETE 1204
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1201
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1205
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1202
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1206
/*! session: open cursor count */
-#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1203
+#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1207
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1204
+#define WT_STAT_CONN_SESSION_OPEN 1208
/*! session: table alter failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1205
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_FAIL 1209
/*! session: table alter successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1206
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SUCCESS 1210
/*! session: table alter unchanged and skipped */
-#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1207
+#define WT_STAT_CONN_SESSION_TABLE_ALTER_SKIP 1211
/*! session: table compact failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1208
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_FAIL 1212
/*! session: table compact successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1209
+#define WT_STAT_CONN_SESSION_TABLE_COMPACT_SUCCESS 1213
/*! session: table create failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1210
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_FAIL 1214
/*! session: table create successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1211
+#define WT_STAT_CONN_SESSION_TABLE_CREATE_SUCCESS 1215
/*! session: table drop failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1212
+#define WT_STAT_CONN_SESSION_TABLE_DROP_FAIL 1216
/*! session: table drop successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1213
+#define WT_STAT_CONN_SESSION_TABLE_DROP_SUCCESS 1217
/*! session: table rebalance failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1214
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_FAIL 1218
/*! session: table rebalance successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1215
+#define WT_STAT_CONN_SESSION_TABLE_REBALANCE_SUCCESS 1219
/*! session: table rename failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1216
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_FAIL 1220
/*! session: table rename successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1217
+#define WT_STAT_CONN_SESSION_TABLE_RENAME_SUCCESS 1221
/*! session: table salvage failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1218
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_FAIL 1222
/*! session: table salvage successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1219
+#define WT_STAT_CONN_SESSION_TABLE_SALVAGE_SUCCESS 1223
/*! session: table truncate failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1220
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_FAIL 1224
/*! session: table truncate successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1221
+#define WT_STAT_CONN_SESSION_TABLE_TRUNCATE_SUCCESS 1225
/*! session: table verify failed calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1222
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_FAIL 1226
/*! session: table verify successful calls */
-#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1223
+#define WT_STAT_CONN_SESSION_TABLE_VERIFY_SUCCESS 1227
/*! thread-state: active filesystem fsync calls */
-#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1224
+#define WT_STAT_CONN_THREAD_FSYNC_ACTIVE 1228
/*! thread-state: active filesystem read calls */
-#define WT_STAT_CONN_THREAD_READ_ACTIVE 1225
+#define WT_STAT_CONN_THREAD_READ_ACTIVE 1229
/*! thread-state: active filesystem write calls */
-#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1226
+#define WT_STAT_CONN_THREAD_WRITE_ACTIVE 1230
/*! thread-yield: application thread time evicting (usecs) */
-#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1227
+#define WT_STAT_CONN_APPLICATION_EVICT_TIME 1231
/*! thread-yield: application thread time waiting for cache (usecs) */
-#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1228
+#define WT_STAT_CONN_APPLICATION_CACHE_TIME 1232
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1229
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1233
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1230
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1234
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1231
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1235
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1232
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1236
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1233
+#define WT_STAT_CONN_PAGE_SLEEP 1237
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1234
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1238
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1235
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1239
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1236
+#define WT_STAT_CONN_TXN_BEGIN 1240
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1237
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1241
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1238
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1242
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1239
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1243
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1240
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1244
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1241
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1245
/*! transaction: transaction checkpoint scrub dirty target */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1242
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TARGET 1246
/*! transaction: transaction checkpoint scrub time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1243
+#define WT_STAT_CONN_TXN_CHECKPOINT_SCRUB_TIME 1247
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1244
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1248
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1245
+#define WT_STAT_CONN_TXN_CHECKPOINT 1249
/*!
* transaction: transaction checkpoints skipped because database was
* clean
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1246
+#define WT_STAT_CONN_TXN_CHECKPOINT_SKIPPED 1250
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1247
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1251
/*!
* transaction: transaction fsync calls for checkpoint after allocating
* the transaction ID
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1248
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1252
/*!
* transaction: transaction fsync duration for checkpoint after
* allocating the transaction ID (usecs)
*/
-#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1249
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1253
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1250
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1254
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1251
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1255
/*!
* transaction: transaction range of IDs currently pinned by named
* snapshots
*/
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1252
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1256
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1253
+#define WT_STAT_CONN_TXN_SYNC 1257
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1254
+#define WT_STAT_CONN_TXN_COMMIT 1258
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1255
+#define WT_STAT_CONN_TXN_ROLLBACK 1259
+/*! transaction: update conflicts */
+#define WT_STAT_CONN_TXN_UPDATE_CONFLICT 1260
/*!
* @}
diff --git a/src/lsm/lsm_cursor.c b/src/lsm/lsm_cursor.c
index 99920367600..1d15ed793a2 100644
--- a/src/lsm/lsm_cursor.c
+++ b/src/lsm/lsm_cursor.c
@@ -1725,8 +1725,6 @@ __wt_clsm_close(WT_CURSOR *cursor)
/* In case we were somehow left positioned, clear that. */
__clsm_leave(clsm);
- /* The WT_LSM_TREE owns the URI. */
- cursor->uri = NULL;
if (clsm->lsm_tree != NULL)
__wt_lsm_tree_release(session, clsm->lsm_tree);
WT_TRET(__wt_cursor_close(cursor));
@@ -1810,7 +1808,7 @@ __wt_clsm_open(WT_SESSION_IMPL *session,
cursor = &clsm->iface;
*cursor = iface;
cursor->session = &session->iface;
- cursor->uri = lsm_tree->name;
+ WT_ERR(__wt_strdup(session, lsm_tree->name, &cursor->uri));
cursor->key_format = lsm_tree->key_format;
cursor->value_format = lsm_tree->value_format;
diff --git a/src/os_posix/os_thread.c b/src/os_posix/os_thread.c
index dfcf297c239..8af672dd0d4 100644
--- a/src/os_posix/os_thread.c
+++ b/src/os_posix/os_thread.c
@@ -15,6 +15,7 @@
int
__wt_thread_create(WT_SESSION_IMPL *session,
wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg)
+ WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
{
WT_DECL_RET;
@@ -40,6 +41,7 @@ __wt_thread_create(WT_SESSION_IMPL *session,
*/
int
__wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid)
+ WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
{
WT_DECL_RET;
diff --git a/src/reconcile/rec_write.c b/src/reconcile/rec_write.c
index 8bff4c630c0..f7df73c4ecb 100644
--- a/src/reconcile/rec_write.c
+++ b/src/reconcile/rec_write.c
@@ -351,6 +351,7 @@ static int __rec_dictionary_init(WT_SESSION_IMPL *, WT_RECONCILE *, u_int);
static int __rec_dictionary_lookup(
WT_SESSION_IMPL *, WT_RECONCILE *, WT_KV *, WT_DICTIONARY **);
static void __rec_dictionary_reset(WT_RECONCILE *);
+static void __rec_verbose_lookaside_write(WT_SESSION_IMPL *);
/*
* __wt_reconcile --
@@ -3567,8 +3568,7 @@ __rec_update_las(WT_SESSION_IMPL *session,
WT_PAGE *page;
WT_SAVE_UPD *list;
WT_UPDATE *upd;
- uint64_t las_counter;
- int64_t insert_cnt;
+ uint64_t insert_cnt, las_counter;
uint32_t i, session_flags, slot;
uint8_t *p;
@@ -3683,9 +3683,11 @@ __rec_update_las(WT_SESSION_IMPL *session,
err: WT_TRET(__wt_las_cursor_close(session, &cursor, session_flags));
- if (insert_cnt > 0)
- (void)__wt_atomic_addi64(
+ if (insert_cnt > 0) {
+ (void)__wt_atomic_add64(
&S2C(session)->las_record_cnt, insert_cnt);
+ __rec_verbose_lookaside_write(session);
+ }
__wt_scr_free(session, &key);
return (ret);
@@ -6577,3 +6579,51 @@ __rec_dictionary_lookup(
*dpp = next;
return (0);
}
+
+/*
+ * __rec_verbose_lookaside_write --
+ * Create a verbose message to display once per checkpoint with details
+ * about the cache state when performing a lookaside table write.
+ */
+static void
+__rec_verbose_lookaside_write(WT_SESSION_IMPL *session)
+{
+#ifdef HAVE_VERBOSE
+ WT_CONNECTION_IMPL *conn;
+ uint64_t ckpt_gen_current, ckpt_gen_last;
+ uint32_t pct_dirty, pct_full;
+
+ if (!WT_VERBOSE_ISSET(session, WT_VERB_LOOKASIDE)) return;
+
+ conn = S2C(session);
+ ckpt_gen_current = __wt_gen(session, WT_GEN_CHECKPOINT);
+ ckpt_gen_last = conn->las_verb_gen_write;
+
+ /*
+ * This message is throttled to one per checkpoint. To do this we
+ * track the generation of the last checkpoint for which the message
+ * was printed and check against the current checkpoint generation.
+ */
+ if (ckpt_gen_current > ckpt_gen_last) {
+ /*
+ * Attempt to atomically replace the last checkpoint generation
+ * for which this message was printed. If the atomic swap fails
+ * we have raced and the winning thread will print the message.
+ */
+ if (__wt_atomic_casv64(&conn->las_verb_gen_write,
+ ckpt_gen_last, ckpt_gen_current)) {
+ (void)__wt_eviction_clean_needed(session, &pct_full);
+ (void)__wt_eviction_dirty_needed(session, &pct_dirty);
+
+ __wt_verbose(session, WT_VERB_LOOKASIDE,
+ "Page reconciliation triggered lookaside write. "
+ "Entries now in lookaside file: %" PRIu64 ", "
+ "cache dirty: %" PRIu32 "%% , "
+ "cache use: %" PRIu32 "%%",
+ conn->las_record_cnt, pct_dirty, pct_full);
+ }
+ }
+#else
+ WT_UNUSED(session);
+#endif
+}
diff --git a/src/session/session_dhandle.c b/src/session/session_dhandle.c
index 4565ae71896..dd2b6ef30ff 100644
--- a/src/session/session_dhandle.c
+++ b/src/session/session_dhandle.c
@@ -229,7 +229,8 @@ __wt_session_lock_dhandle(
WT_ASSERT(session, !F_ISSET(dhandle, WT_DHANDLE_DEAD));
return (0);
}
- if (ret != EBUSY || (is_open && want_exclusive))
+ if (ret != EBUSY || (is_open && want_exclusive) ||
+ LF_ISSET(WT_DHANDLE_LOCK_ONLY))
return (ret);
lock_busy = true;
diff --git a/src/support/err.c b/src/support/err.c
index 7f6c835ab29..5ec995d8f65 100644
--- a/src/support/err.c
+++ b/src/support/err.c
@@ -502,8 +502,12 @@ __wt_panic(WT_SESSION_IMPL *session)
#if defined(HAVE_DIAGNOSTIC)
__wt_abort(session); /* Drop core if testing. */
/* NOTREACHED */
-#else
+#endif
+#if !defined(HAVE_DIAGNOSTIC) || defined(_WIN32)
/*
+ * Confusing #ifdef structure because gcc knows we can't get here and
+ * Visual Studio doesn't.
+ *
* Chaos reigns within.
* Reflect, repent, and reboot.
* Order shall return.
@@ -525,12 +529,7 @@ __wt_illegal_value(WT_SESSION_IMPL *session, const char *name)
name == NULL ? "" : name, name == NULL ? "" : ": ",
"encountered an illegal file format or internal value");
-#if defined(HAVE_DIAGNOSTIC)
- __wt_abort(session); /* Drop core if testing. */
- /* NOTREACHED */
-#else
return (__wt_panic(session));
-#endif
}
/*
diff --git a/src/support/mtx_rw.c b/src/support/mtx_rw.c
index 2354ad4f4cc..eeb9c6b72a2 100644
--- a/src/support/mtx_rw.c
+++ b/src/support/mtx_rw.c
@@ -91,6 +91,8 @@ int
__wt_rwlock_init(WT_SESSION_IMPL *session, WT_RWLOCK *l)
{
l->u.v = 0;
+ l->stat_read_count_off = l->stat_write_count_off = -1;
+ l->stat_app_usecs_off = l->stat_int_usecs_off = -1;
WT_RET(__wt_cond_alloc(session, "rwlock wait", &l->cond_readers));
WT_RET(__wt_cond_alloc(session, "rwlock wait", &l->cond_writers));
@@ -118,8 +120,13 @@ int
__wt_try_readlock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
{
WT_RWLOCK new, old;
+ int64_t **stats;
WT_STAT_CONN_INCR(session, rwlock_read);
+ if (l->stat_read_count_off != -1 && WT_STAT_ENABLED(session)) {
+ stats = (int64_t **)S2C(session)->stats;
+ stats[session->stat_bucket][l->stat_read_count_off]++;
+ }
old.u.v = l->u.v;
@@ -159,11 +166,18 @@ void
__wt_readlock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
{
WT_RWLOCK new, old;
+ struct timespec enter, leave;
+ int64_t **stats;
int pause_cnt;
int16_t writers_active;
uint8_t ticket;
+ bool set_stats;
WT_STAT_CONN_INCR(session, rwlock_read);
+ stats = (int64_t **)S2C(session)->stats;
+ set_stats = (l->stat_read_count_off != -1 && WT_STAT_ENABLED(session));
+ if (set_stats)
+ stats[session->stat_bucket][l->stat_read_count_off]++;
WT_DIAGNOSTIC_YIELD;
@@ -221,6 +235,8 @@ stall: __wt_cond_wait(session,
break;
}
+ if (set_stats)
+ __wt_epoch(session, &enter);
/* Wait for our group to start. */
for (pause_cnt = 0; ticket != l->u.s.current; pause_cnt++) {
if (pause_cnt < 1000)
@@ -234,6 +250,15 @@ stall: __wt_cond_wait(session,
l->cond_readers, 10 * WT_THOUSAND, __read_blocked);
}
}
+ if (set_stats) {
+ __wt_epoch(session, &leave);
+ if (F_ISSET(session, WT_SESSION_INTERNAL))
+ stats[session->stat_bucket][l->stat_int_usecs_off] +=
+ (int64_t)WT_TIMEDIFF_US(leave, enter);
+ else
+ stats[session->stat_bucket][l->stat_app_usecs_off] +=
+ (int64_t)WT_TIMEDIFF_US(leave, enter);
+ }
/*
* Applications depend on a barrier here so that operations holding the
@@ -282,8 +307,13 @@ int
__wt_try_writelock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
{
WT_RWLOCK new, old;
+ int64_t **stats;
WT_STAT_CONN_INCR(session, rwlock_write);
+ if (l->stat_write_count_off != -1 && WT_STAT_ENABLED(session)) {
+ stats = (int64_t **)S2C(session)->stats;
+ stats[session->stat_bucket][l->stat_write_count_off]++;
+ }
/*
* This write lock can only be granted if no readers or writers blocked
@@ -333,10 +363,17 @@ void
__wt_writelock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
{
WT_RWLOCK new, old;
+ struct timespec enter, leave;
+ int64_t **stats;
int pause_cnt;
uint8_t ticket;
+ bool set_stats;
WT_STAT_CONN_INCR(session, rwlock_write);
+ stats = (int64_t **)S2C(session)->stats;
+ set_stats = (l->stat_write_count_off != -1 && WT_STAT_ENABLED(session));
+ if (set_stats)
+ stats[session->stat_bucket][l->stat_write_count_off]++;
for (;;) {
old.u.v = l->u.v;
@@ -367,6 +404,8 @@ __wt_writelock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
* could see no readers active from a different batch and decide that
* we have the lock.
*/
+ if (set_stats)
+ __wt_epoch(session, &enter);
for (pause_cnt = 0, old.u.v = l->u.v;
ticket != old.u.s.current || old.u.s.readers_active != 0;
pause_cnt++, old.u.v = l->u.v) {
@@ -381,6 +420,15 @@ __wt_writelock(WT_SESSION_IMPL *session, WT_RWLOCK *l)
l->cond_writers, 10 * WT_THOUSAND, __write_blocked);
}
}
+ if (set_stats) {
+ __wt_epoch(session, &leave);
+ if (F_ISSET(session, WT_SESSION_INTERNAL))
+ stats[session->stat_bucket][l->stat_int_usecs_off] +=
+ (int64_t)WT_TIMEDIFF_US(leave, enter);
+ else
+ stats[session->stat_bucket][l->stat_app_usecs_off] +=
+ (int64_t)WT_TIMEDIFF_US(leave, enter);
+ }
/*
* Applications depend on a barrier here so that operations holding the
diff --git a/src/support/stat.c b/src/support/stat.c
index 061615c0931..2dc006da827 100644
--- a/src/support/stat.c
+++ b/src/support/stat.c
@@ -774,16 +774,20 @@ static const char * const __stats_connection_desc[] = {
"lock: checkpoint lock acquisitions",
"lock: checkpoint lock application thread wait time (usecs)",
"lock: checkpoint lock internal thread wait time (usecs)",
- "lock: handle-list lock eviction thread wait time (usecs)",
+ "lock: dhandle lock application thread time waiting for the dhandle lock (usecs)",
+ "lock: dhandle lock internal thread time waiting for the dhandle lock (usecs)",
+ "lock: dhandle read lock acquisitions",
+ "lock: dhandle write lock acquisitions",
"lock: metadata lock acquisitions",
"lock: metadata lock application thread wait time (usecs)",
"lock: metadata lock internal thread wait time (usecs)",
"lock: schema lock acquisitions",
"lock: schema lock application thread wait time (usecs)",
"lock: schema lock internal thread wait time (usecs)",
- "lock: table lock acquisitions",
"lock: table lock application thread time waiting for the table lock (usecs)",
"lock: table lock internal thread time waiting for the table lock (usecs)",
+ "lock: table read lock acquisitions",
+ "lock: table write lock acquisitions",
"log: busy returns attempting to switch slots",
"log: log bytes of payload data",
"log: log bytes written",
@@ -888,6 +892,7 @@ static const char * const __stats_connection_desc[] = {
"transaction: transaction sync calls",
"transaction: transactions committed",
"transaction: transactions rolled back",
+ "transaction: update conflicts",
};
int
@@ -1072,16 +1077,20 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->lock_checkpoint_count = 0;
stats->lock_checkpoint_wait_application = 0;
stats->lock_checkpoint_wait_internal = 0;
- stats->lock_handle_list_wait_eviction = 0;
+ stats->lock_dhandle_wait_application = 0;
+ stats->lock_dhandle_wait_internal = 0;
+ stats->lock_dhandle_read_count = 0;
+ stats->lock_dhandle_write_count = 0;
stats->lock_metadata_count = 0;
stats->lock_metadata_wait_application = 0;
stats->lock_metadata_wait_internal = 0;
stats->lock_schema_count = 0;
stats->lock_schema_wait_application = 0;
stats->lock_schema_wait_internal = 0;
- stats->lock_table_count = 0;
stats->lock_table_wait_application = 0;
stats->lock_table_wait_internal = 0;
+ stats->lock_table_read_count = 0;
+ stats->lock_table_write_count = 0;
stats->log_slot_switch_busy = 0;
stats->log_bytes_payload = 0;
stats->log_bytes_written = 0;
@@ -1186,6 +1195,7 @@ __wt_stat_connection_clear_single(WT_CONNECTION_STATS *stats)
stats->txn_sync = 0;
stats->txn_commit = 0;
stats->txn_rollback = 0;
+ stats->txn_update_conflict = 0;
}
void
@@ -1396,8 +1406,14 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, lock_checkpoint_wait_application);
to->lock_checkpoint_wait_internal +=
WT_STAT_READ(from, lock_checkpoint_wait_internal);
- to->lock_handle_list_wait_eviction +=
- WT_STAT_READ(from, lock_handle_list_wait_eviction);
+ to->lock_dhandle_wait_application +=
+ WT_STAT_READ(from, lock_dhandle_wait_application);
+ to->lock_dhandle_wait_internal +=
+ WT_STAT_READ(from, lock_dhandle_wait_internal);
+ to->lock_dhandle_read_count +=
+ WT_STAT_READ(from, lock_dhandle_read_count);
+ to->lock_dhandle_write_count +=
+ WT_STAT_READ(from, lock_dhandle_write_count);
to->lock_metadata_count += WT_STAT_READ(from, lock_metadata_count);
to->lock_metadata_wait_application +=
WT_STAT_READ(from, lock_metadata_wait_application);
@@ -1408,11 +1424,14 @@ __wt_stat_connection_aggregate(
WT_STAT_READ(from, lock_schema_wait_application);
to->lock_schema_wait_internal +=
WT_STAT_READ(from, lock_schema_wait_internal);
- to->lock_table_count += WT_STAT_READ(from, lock_table_count);
to->lock_table_wait_application +=
WT_STAT_READ(from, lock_table_wait_application);
to->lock_table_wait_internal +=
WT_STAT_READ(from, lock_table_wait_internal);
+ to->lock_table_read_count +=
+ WT_STAT_READ(from, lock_table_read_count);
+ to->lock_table_write_count +=
+ WT_STAT_READ(from, lock_table_write_count);
to->log_slot_switch_busy += WT_STAT_READ(from, log_slot_switch_busy);
to->log_bytes_payload += WT_STAT_READ(from, log_bytes_payload);
to->log_bytes_written += WT_STAT_READ(from, log_bytes_written);
@@ -1563,6 +1582,7 @@ __wt_stat_connection_aggregate(
to->txn_sync += WT_STAT_READ(from, txn_sync);
to->txn_commit += WT_STAT_READ(from, txn_commit);
to->txn_rollback += WT_STAT_READ(from, txn_rollback);
+ to->txn_update_conflict += WT_STAT_READ(from, txn_update_conflict);
}
static const char * const __stats_join_desc[] = {