summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorDavid Hows <david.hows@mongodb.com>2016-06-24 17:05:13 +1000
committerDavid Hows <david.hows@mongodb.com>2016-06-24 17:05:13 +1000
commitd8fb874fc40989cb9675e56ca80b3b64e6fa2ee3 (patch)
tree6f03ed5cde97aedc762215c14d23ee5305998a2b /src/include
parentfb1663e6fc800be97c0ddc697b6f939dc610e08e (diff)
parent1f4aaa4490a82cf947afdabbb9214ee5b1850d13 (diff)
Merge branch 'develop' of github.com:wiredtiger/wiredtiger into mongodb-3.4mongodb-3.3.9mongodb-3.3.10mongodb-3.0.1
Diffstat (limited to 'src/include')
-rw-r--r--src/include/block.h1
-rw-r--r--src/include/btree_cmp.i20
-rw-r--r--src/include/cache.h23
-rw-r--r--src/include/cell.i26
-rw-r--r--src/include/ctype.i69
-rw-r--r--src/include/extern.h102
-rw-r--r--src/include/extern_posix.h31
-rw-r--r--src/include/extern_win.h32
-rw-r--r--src/include/flags.h27
-rw-r--r--src/include/log.h5
-rw-r--r--src/include/misc.h8
-rw-r--r--src/include/os.h43
-rw-r--r--src/include/os_fhandle.i33
-rw-r--r--src/include/packing.i4
-rw-r--r--src/include/serial.i2
-rw-r--r--src/include/stat.h40
-rw-r--r--src/include/wiredtiger.in323
-rw-r--r--src/include/wiredtiger_ext.h13
-rw-r--r--src/include/wt_internal.h7
19 files changed, 524 insertions, 285 deletions
diff --git a/src/include/block.h b/src/include/block.h
index 9f652ceddb9..a8080c1651c 100644
--- a/src/include/block.h
+++ b/src/include/block.h
@@ -261,6 +261,7 @@ struct __wt_block {
/* Verification support */
bool verify; /* If performing verification */
+ bool verify_layout; /* Print out file layout information */
bool verify_strict; /* Fail hard on any error */
wt_off_t verify_size; /* Checkpoint's file size */
WT_EXTLIST verify_alloc; /* Verification allocation list */
diff --git a/src/include/btree_cmp.i b/src/include/btree_cmp.i
index 1993c1be293..23a462e4e50 100644
--- a/src/include/btree_cmp.i
+++ b/src/include/btree_cmp.i
@@ -52,8 +52,8 @@ __wt_lex_compare(const WT_ITEM *user_item, const WT_ITEM *tree_item)
for (; len > 0;
len -= WT_VECTOR_SIZE,
userp += WT_VECTOR_SIZE, treep += WT_VECTOR_SIZE) {
- u = _mm_load_si128((__m128i *)userp);
- t = _mm_load_si128((__m128i *)treep);
+ u = _mm_load_si128((const __m128i *)userp);
+ t = _mm_load_si128((const __m128i *)treep);
res_eq = _mm_cmpeq_epi8(u, t);
if (_mm_movemask_epi8(res_eq) != 65535)
break;
@@ -62,8 +62,8 @@ __wt_lex_compare(const WT_ITEM *user_item, const WT_ITEM *tree_item)
for (; len > 0;
len -= WT_VECTOR_SIZE,
userp += WT_VECTOR_SIZE, treep += WT_VECTOR_SIZE) {
- u = _mm_loadu_si128((__m128i *)userp);
- t = _mm_loadu_si128((__m128i *)treep);
+ u = _mm_loadu_si128((const __m128i *)userp);
+ t = _mm_loadu_si128((const __m128i *)treep);
res_eq = _mm_cmpeq_epi8(u, t);
if (_mm_movemask_epi8(res_eq) != 65535)
break;
@@ -123,8 +123,8 @@ __wt_lex_compare_skip(
tsz = tree_item->size;
len = WT_MIN(usz, tsz) - *matchp;
- userp = (uint8_t *)user_item->data + *matchp;
- treep = (uint8_t *)tree_item->data + *matchp;
+ userp = (const uint8_t *)user_item->data + *matchp;
+ treep = (const uint8_t *)tree_item->data + *matchp;
#ifdef HAVE_X86INTRIN_H
/* Use vector instructions if we'll execute at least 2 of them. */
@@ -139,8 +139,8 @@ __wt_lex_compare_skip(
len -= WT_VECTOR_SIZE,
userp += WT_VECTOR_SIZE, treep += WT_VECTOR_SIZE,
*matchp += WT_VECTOR_SIZE) {
- u = _mm_load_si128((__m128i *)userp);
- t = _mm_load_si128((__m128i *)treep);
+ u = _mm_load_si128((const __m128i *)userp);
+ t = _mm_load_si128((const __m128i *)treep);
res_eq = _mm_cmpeq_epi8(u, t);
if (_mm_movemask_epi8(res_eq) != 65535)
break;
@@ -150,8 +150,8 @@ __wt_lex_compare_skip(
len -= WT_VECTOR_SIZE,
userp += WT_VECTOR_SIZE, treep += WT_VECTOR_SIZE,
*matchp += WT_VECTOR_SIZE) {
- u = _mm_loadu_si128((__m128i *)userp);
- t = _mm_loadu_si128((__m128i *)treep);
+ u = _mm_loadu_si128((const __m128i *)userp);
+ t = _mm_loadu_si128((const __m128i *)treep);
res_eq = _mm_cmpeq_epi8(u, t);
if (_mm_movemask_epi8(res_eq) != 65535)
break;
diff --git a/src/include/cache.h b/src/include/cache.h
index 4f7981a5df9..f4a35de7201 100644
--- a/src/include/cache.h
+++ b/src/include/cache.h
@@ -76,6 +76,7 @@ struct __wt_cache {
uint64_t bytes_overflow; /* Bytes of overflow pages */
uint64_t bytes_evict; /* Bytes/pages discarded by eviction */
uint64_t pages_evict;
+ uint64_t pages_evicted; /* Pages evicted during a pass */
uint64_t bytes_dirty; /* Bytes/pages currently dirty */
uint64_t pages_dirty;
uint64_t bytes_read; /* Bytes read into memory */
@@ -86,6 +87,9 @@ struct __wt_cache {
uint64_t worker_evicts; /* Pages evicted by worker threads */
uint64_t evict_max_page_size; /* Largest page seen at eviction */
+#ifdef HAVE_DIAGNOSTIC
+ struct timespec stuck_ts; /* Stuck timestamp */
+#endif
/*
* Read information.
@@ -112,6 +116,8 @@ struct __wt_cache {
/*
* LRU eviction list information.
*/
+ WT_SPINLOCK evict_pass_lock; /* Eviction pass lock */
+ WT_SESSION_IMPL *walk_session; /* Eviction pass session */
WT_SPINLOCK evict_queue_lock; /* Eviction current queue lock */
WT_EVICT_QUEUE evict_queues[WT_EVICT_QUEUE_MAX];
WT_EVICT_QUEUE *evict_current_queue;/* LRU current queue in use */
@@ -144,19 +150,28 @@ struct __wt_cache {
#define WT_EVICT_PASS_DIRTY 0x04
#define WT_EVICT_PASS_WOULD_BLOCK 0x08
uint32_t state;
+ /*
+ * Pass interrupt counter.
+ */
+ uint32_t pass_intr; /* Interrupt eviction pass. */
/*
* Flags.
*/
#define WT_CACHE_POOL_MANAGER 0x01 /* The active cache pool manager */
#define WT_CACHE_POOL_RUN 0x02 /* Cache pool thread running */
-#define WT_CACHE_CLEAR_WALKS 0x04 /* Clear eviction walks */
-#define WT_CACHE_STUCK 0x08 /* Eviction server is stuck */
-#define WT_CACHE_WALK_REVERSE 0x10 /* Scan backwards for candidates */
-#define WT_CACHE_WOULD_BLOCK 0x20 /* Pages that would block apps */
+#define WT_CACHE_STUCK 0x04 /* Eviction server is stuck */
+#define WT_CACHE_WALK_REVERSE 0x08 /* Scan backwards for candidates */
+#define WT_CACHE_WOULD_BLOCK 0x10 /* Pages that would block apps */
uint32_t flags;
};
+#define WT_WITH_PASS_LOCK(session, ret, op) do { \
+ WT_ASSERT(session, !F_ISSET(session, WT_SESSION_LOCKED_PASS)); \
+ WT_WITH_LOCK(session, ret, \
+ &cache->evict_pass_lock, WT_SESSION_LOCKED_PASS, op); \
+} while (0)
+
/*
* WT_CACHE_POOL --
* A structure that represents a shared cache.
diff --git a/src/include/cell.i b/src/include/cell.i
index 481d2a29764..c130768e595 100644
--- a/src/include/cell.i
+++ b/src/include/cell.i
@@ -183,9 +183,9 @@ __wt_cell_pack_addr(WT_CELL *cell, u_int cell_type, uint64_t recno, size_t size)
p = cell->__chunk + 1;
if (recno == WT_RECNO_OOB)
- cell->__chunk[0] = cell_type; /* Type */
+ cell->__chunk[0] = (uint8_t)cell_type; /* Type */
else {
- cell->__chunk[0] = cell_type | WT_CELL_64V;
+ cell->__chunk[0] = (uint8_t)(cell_type | WT_CELL_64V);
(void)__wt_vpack_uint(&p, 0, recno); /* Record number */
}
(void)__wt_vpack_uint(&p, 0, (uint64_t)size); /* Length */
@@ -207,8 +207,8 @@ __wt_cell_pack_data(WT_CELL *cell, uint64_t rle, size_t size)
*/
if (rle < 2 && size <= WT_CELL_SHORT_MAX) {
byte = (uint8_t)size; /* Type + length */
- cell->__chunk[0] =
- (byte << WT_CELL_SHORT_SHIFT) | WT_CELL_VALUE_SHORT;
+ cell->__chunk[0] = (uint8_t)
+ ((byte << WT_CELL_SHORT_SHIFT) | WT_CELL_VALUE_SHORT);
return (1);
}
@@ -331,8 +331,8 @@ __wt_cell_pack_int_key(WT_CELL *cell, size_t size)
/* Short keys have 6 bits of data length in the descriptor byte. */
if (size <= WT_CELL_SHORT_MAX) {
byte = (uint8_t)size;
- cell->__chunk[0] =
- (byte << WT_CELL_SHORT_SHIFT) | WT_CELL_KEY_SHORT;
+ cell->__chunk[0] = (uint8_t)
+ ((byte << WT_CELL_SHORT_SHIFT) | WT_CELL_KEY_SHORT);
return (1);
}
@@ -358,14 +358,14 @@ __wt_cell_pack_leaf_key(WT_CELL *cell, uint8_t prefix, size_t size)
if (size <= WT_CELL_SHORT_MAX) {
if (prefix == 0) {
byte = (uint8_t)size; /* Type + length */
- cell->__chunk[0] =
- (byte << WT_CELL_SHORT_SHIFT) | WT_CELL_KEY_SHORT;
+ cell->__chunk[0] = (uint8_t)
+ ((byte << WT_CELL_SHORT_SHIFT) | WT_CELL_KEY_SHORT);
return (1);
} else {
byte = (uint8_t)size; /* Type + length */
- cell->__chunk[0] =
- (byte << WT_CELL_SHORT_SHIFT) |
- WT_CELL_KEY_SHORT_PFX;
+ cell->__chunk[0] = (uint8_t)
+ ((byte << WT_CELL_SHORT_SHIFT) |
+ WT_CELL_KEY_SHORT_PFX);
cell->__chunk[1] = prefix; /* Prefix */
return (2);
}
@@ -585,8 +585,8 @@ restart:
WT_CELL_LEN_CHK(cell, 0);
unpack->cell = cell;
unpack->v = 0;
- unpack->raw = __wt_cell_type_raw(cell);
- unpack->type = __wt_cell_type(cell);
+ unpack->raw = (uint8_t)__wt_cell_type_raw(cell);
+ unpack->type = (uint8_t)__wt_cell_type(cell);
unpack->ovfl = 0;
/*
diff --git a/src/include/ctype.i b/src/include/ctype.i
new file mode 100644
index 00000000000..b4a1ad9f318
--- /dev/null
+++ b/src/include/ctype.i
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2008-2014 WiredTiger, Inc.
+ * All rights reserved.
+ *
+ * See the file LICENSE for redistribution information.
+ */
+
+#include <ctype.h>
+
+/*
+ * __wt_isalnum --
+ * Wrap the ctype function without sign extension.
+ */
+static inline bool
+__wt_isalnum(u_char c)
+{
+ return (isalnum(c) != 0);
+}
+
+/*
+ * __wt_isalpha --
+ * Wrap the ctype function without sign extension.
+ */
+static inline bool
+__wt_isalpha(u_char c)
+{
+ return (isalpha(c) != 0);
+}
+
+/*
+ * __wt_isdigit --
+ * Wrap the ctype function without sign extension.
+ */
+static inline bool
+__wt_isdigit(u_char c)
+{
+ return (isdigit(c) != 0);
+}
+
+/*
+ * __wt_isprint --
+ * Wrap the ctype function without sign extension.
+ */
+static inline bool
+__wt_isprint(u_char c)
+{
+ return (isprint(c) != 0);
+}
+
+/*
+ * __wt_isspace --
+ * Wrap the ctype function without sign extension.
+ */
+static inline bool
+__wt_isspace(u_char c)
+{
+ return (isspace(c) != 0);
+}
+
+/*
+ * __wt_tolower --
+ * Wrap the ctype function without sign extension.
+ */
+static inline u_char
+__wt_tolower(u_char c)
+{
+ return ((u_char)tolower(c));
+}
diff --git a/src/include/extern.h b/src/include/extern.h
index 4ca5c8461a0..b0c0f6eccad 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -144,7 +144,6 @@ extern const char *__wt_page_type_string(u_int type);
extern const char *__wt_cell_type_string(uint8_t type);
extern const char *__wt_page_addr_string(WT_SESSION_IMPL *session, WT_REF *ref, WT_ITEM *buf);
extern const char *__wt_addr_string(WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size, WT_ITEM *buf);
-extern const char *__wt_buf_set_printable( WT_SESSION_IMPL *session, const void *p, size_t size, WT_ITEM *buf);
extern int __wt_ovfl_read(WT_SESSION_IMPL *session, WT_PAGE *page, WT_CELL_UNPACK *unpack, WT_ITEM *store);
extern int __wt_ovfl_cache(WT_SESSION_IMPL *session, WT_PAGE *page, void *cookie, WT_CELL_UNPACK *vpack);
extern int __wt_ovfl_discard(WT_SESSION_IMPL *session, WT_CELL *cell);
@@ -291,7 +290,7 @@ extern int __wt_curjoin_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSO
extern int __wt_curjoin_join(WT_SESSION_IMPL *session, WT_CURSOR_JOIN *cjoin, WT_INDEX *idx, WT_CURSOR *ref_cursor, uint8_t flags, uint8_t range, uint64_t count, uint32_t bloom_bit_count, uint32_t bloom_hash_count);
extern int __wt_json_alloc_unpack(WT_SESSION_IMPL *session, const void *buffer, size_t size, const char *fmt, WT_CURSOR_JSON *json, bool iskey, va_list ap);
extern void __wt_json_close(WT_SESSION_IMPL *session, WT_CURSOR *cursor);
-extern size_t __wt_json_unpack_char(char ch, u_char *buf, size_t bufsz, bool force_unicode);
+extern size_t __wt_json_unpack_char(u_char ch, u_char *buf, size_t bufsz, bool force_unicode);
extern int __wt_json_column_init(WT_CURSOR *cursor, const char *keyformat, const WT_CONFIG_ITEM *idxconf, const WT_CONFIG_ITEM *colconf);
extern int __wt_json_token(WT_SESSION *wt_session, const char *src, int *toktype, const char **tokstart, size_t *toklen);
extern const char *__wt_json_tokname(int toktype);
@@ -484,6 +483,31 @@ extern int __wt_meta_track_destroy(WT_SESSION_IMPL *session);
extern int __wt_turtle_init(WT_SESSION_IMPL *session);
extern int __wt_turtle_read(WT_SESSION_IMPL *session, const char *key, char **valuep);
extern int __wt_turtle_update(WT_SESSION_IMPL *session, const char *key, const char *value);
+extern int __wt_filename(WT_SESSION_IMPL *session, const char *name, char **path);
+extern int __wt_nfilename( WT_SESSION_IMPL *session, const char *name, size_t namelen, char **path);
+extern int __wt_remove_if_exists(WT_SESSION_IMPL *session, const char *name);
+extern int __wt_rename_and_sync_directory( WT_SESSION_IMPL *session, const char *from, const char *to);
+extern int __wt_copy_and_sync(WT_SESSION *wt_session, const char *from, const char *to);
+extern void __wt_abort(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((noreturn));
+extern int __wt_calloc(WT_SESSION_IMPL *session, size_t number, size_t size, void *retp);
+extern int __wt_malloc(WT_SESSION_IMPL *session, size_t bytes_to_allocate, void *retp);
+extern int __wt_realloc(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
+extern int __wt_realloc_noclear(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
+extern int __wt_realloc_aligned(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
+extern int __wt_strndup(WT_SESSION_IMPL *session, const void *str, size_t len, void *retp);
+extern void __wt_free_int(WT_SESSION_IMPL *session, const void *p_arg);
+extern int __wt_errno(void);
+extern const char *__wt_strerror(WT_SESSION_IMPL *session, int error, char *errbuf, size_t errlen);
+extern int __wt_ext_map_windows_error( WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, uint32_t windows_error);
+extern bool __wt_handle_is_open(WT_SESSION_IMPL *session, const char *name);
+extern int __wt_open(WT_SESSION_IMPL *session, const char *name, WT_OPEN_FILE_TYPE file_type, u_int flags, WT_FH **fhp);
+extern int __wt_close(WT_SESSION_IMPL *session, WT_FH **fhp);
+extern int __wt_close_connection_close(WT_SESSION_IMPL *session);
+extern int __wt_os_inmemory(WT_SESSION_IMPL *session);
+extern int __wt_fopen(WT_SESSION_IMPL *session, const char *name, uint32_t open_flags, uint32_t flags, WT_FSTREAM **fstrp);
+extern int __wt_os_stdio(WT_SESSION_IMPL *session);
+extern int __wt_getopt( const char *progname, int nargc, char *const *nargv, const char *ostr);
+extern uint64_t __wt_strtouq(const char *nptr, char **endptr, int base);
extern int __wt_ext_struct_pack(WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, void *buffer, size_t size, const char *fmt, ...);
extern int __wt_ext_struct_size(WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, size_t *sizep, const char *fmt, ...);
extern int __wt_ext_struct_unpack(WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, const void *buffer, size_t size, const char *fmt, ...);
@@ -598,7 +622,14 @@ extern int __wt_msg(WT_SESSION_IMPL *session, const char *fmt, ...) WT_GCC_FUNC_
extern int __wt_ext_msg_printf( WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, const char *fmt, ...) WT_GCC_FUNC_DECL_ATTRIBUTE((format (printf, 3, 4)));
extern const char *__wt_ext_strerror(WT_EXTENSION_API *wt_api, WT_SESSION *wt_session, int error);
extern int __wt_progress(WT_SESSION_IMPL *session, const char *s, uint64_t v);
-extern void __wt_assert(WT_SESSION_IMPL *session, int error, const char *file_name, int line_number, const char *fmt, ...) WT_GCC_FUNC_DECL_ATTRIBUTE((format (printf, 5, 6)));
+extern void
+__wt_assert(WT_SESSION_IMPL *session,
+ int error, const char *file_name, int line_number, const char *fmt, ...)
+ WT_GCC_FUNC_DECL_ATTRIBUTE((format (printf, 5, 6)))
+#ifdef HAVE_DIAGNOSTIC
+ WT_GCC_FUNC_DECL_ATTRIBUTE((noreturn))
+#endif
+;
extern int __wt_panic(WT_SESSION_IMPL *session);
extern int __wt_illegal_value(WT_SESSION_IMPL *session, const char *name);
extern int __wt_object_unsupported(WT_SESSION_IMPL *session, const char *uri);
@@ -647,6 +678,8 @@ extern uint32_t __wt_random(WT_RAND_STATE volatile *rnd_state);
extern int __wt_buf_grow_worker(WT_SESSION_IMPL *session, WT_ITEM *buf, size_t size);
extern int __wt_buf_fmt(WT_SESSION_IMPL *session, WT_ITEM *buf, const char *fmt, ...) WT_GCC_FUNC_DECL_ATTRIBUTE((format (printf, 3, 4)));
extern int __wt_buf_catfmt(WT_SESSION_IMPL *session, WT_ITEM *buf, const char *fmt, ...) WT_GCC_FUNC_DECL_ATTRIBUTE((format (printf, 3, 4)));
+extern const char *__wt_buf_set_printable( WT_SESSION_IMPL *session, const void *p, size_t size, WT_ITEM *buf);
+extern const char *__wt_buf_set_size( WT_SESSION_IMPL *session, uint64_t size, bool exact, WT_ITEM *buf);
extern int
__wt_scr_alloc_func(WT_SESSION_IMPL *session, size_t size, WT_ITEM **scratchp
#ifdef HAVE_DIAGNOSTIC
@@ -676,7 +709,7 @@ extern void __wt_stat_join_clear_all(WT_JOIN_STATS **stats);
extern void __wt_stat_join_aggregate( WT_JOIN_STATS **from, WT_JOIN_STATS *to);
extern void __wt_txn_release_snapshot(WT_SESSION_IMPL *session);
extern int __wt_txn_get_snapshot(WT_SESSION_IMPL *session);
-extern int __wt_txn_update_oldest(WT_SESSION_IMPL *session, bool force);
+extern int __wt_txn_update_oldest(WT_SESSION_IMPL *session, uint32_t flags);
extern int __wt_txn_config(WT_SESSION_IMPL *session, const char *cfg[]);
extern void __wt_txn_release(WT_SESSION_IMPL *session);
extern int __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[]);
@@ -711,64 +744,3 @@ extern int __wt_txn_named_snapshot_get(WT_SESSION_IMPL *session, WT_CONFIG_ITEM
extern int __wt_txn_named_snapshot_config(WT_SESSION_IMPL *session, const char *cfg[], bool *has_create, bool *has_drops);
extern int __wt_txn_named_snapshot_destroy(WT_SESSION_IMPL *session);
extern int __wt_txn_recover(WT_SESSION_IMPL *session);
-extern bool __wt_absolute_path(const char *path);
-extern bool __wt_handle_is_open(WT_SESSION_IMPL *session, const char *name);
-extern bool __wt_has_priv(void);
-extern const char *__wt_path_separator(void);
-extern const char *__wt_strerror(WT_SESSION_IMPL *session, int error, char *errbuf, size_t errlen);
-extern int __wt_calloc(WT_SESSION_IMPL *session, size_t number, size_t size, void *retp);
-extern int __wt_close(WT_SESSION_IMPL *session, WT_FH **fhp);
-extern int __wt_close_connection_close(WT_SESSION_IMPL *session);
-extern int __wt_cond_alloc(WT_SESSION_IMPL *session, const char *name, bool is_signalled, WT_CONDVAR **condp);
-extern int __wt_cond_destroy(WT_SESSION_IMPL *session, WT_CONDVAR **condp);
-extern int __wt_cond_signal(WT_SESSION_IMPL *session, WT_CONDVAR *cond);
-extern int __wt_cond_wait_signal( WT_SESSION_IMPL *session, WT_CONDVAR *cond, uint64_t usecs, bool *signalled);
-extern int __wt_copy_and_sync(WT_SESSION *wt_session, const char *from, const char *to);
-extern int __wt_dlclose(WT_SESSION_IMPL *session, WT_DLH *dlh);
-extern int __wt_dlopen(WT_SESSION_IMPL *session, const char *path, WT_DLH **dlhp);
-extern int __wt_dlsym(WT_SESSION_IMPL *session, WT_DLH *dlh, const char *name, bool fail, void *sym_ret);
-extern int __wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp);
-extern int __wt_errno(void);
-extern int __wt_filename(WT_SESSION_IMPL *session, const char *name, char **path);
-extern int __wt_fopen(WT_SESSION_IMPL *session, const char *name, uint32_t open_flags, uint32_t flags, WT_FSTREAM **fstrp);
-extern int __wt_get_vm_pagesize(void);
-extern int __wt_getenv(WT_SESSION_IMPL *session, const char *variable, const char **envp);
-extern int __wt_getlasterror(void);
-extern int __wt_getopt( const char *progname, int nargc, char *const *nargv, const char *ostr);
-extern int __wt_malloc(WT_SESSION_IMPL *session, size_t bytes_to_allocate, void *retp);
-extern int __wt_map_error_rdonly(int error);
-extern int __wt_nfilename( WT_SESSION_IMPL *session, const char *name, size_t namelen, char **path);
-extern int __wt_once(void (*init_routine)(void));
-extern int __wt_open(WT_SESSION_IMPL *session, const char *name, WT_OPEN_FILE_TYPE file_type, u_int flags, WT_FH **fhp);
-extern int __wt_os_inmemory(WT_SESSION_IMPL *session);
-extern int __wt_os_posix(WT_SESSION_IMPL *session);
-extern int __wt_os_stdio(WT_SESSION_IMPL *session);
-extern int __wt_os_win(WT_SESSION_IMPL *session);
-extern int __wt_posix_directory_list(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *directory, const char *prefix, char ***dirlistp, uint32_t *countp);
-extern int __wt_posix_directory_list_free(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, char **dirlist, uint32_t count);
-extern int __wt_posix_file_fallocate(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, wt_off_t offset, wt_off_t len);
-extern int __wt_posix_map(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_regionp, size_t *lenp, void *mapped_cookiep);
-extern int __wt_posix_map_discard(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *map, size_t length, void *mapped_cookie);
-extern int __wt_posix_map_preload(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, const void *map, size_t length, void *mapped_cookie);
-extern int __wt_posix_unmap(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_region, size_t len, void *mapped_cookie);
-extern int __wt_realloc(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
-extern int __wt_realloc_aligned(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
-extern int __wt_realloc_noclear(WT_SESSION_IMPL *session, size_t *bytes_allocated_ret, size_t bytes_to_allocate, void *retp);
-extern int __wt_remove_if_exists(WT_SESSION_IMPL *session, const char *name);
-extern int __wt_rename_and_sync_directory( WT_SESSION_IMPL *session, const char *from, const char *to);
-extern int __wt_strndup(WT_SESSION_IMPL *session, const void *str, size_t len, void *retp);
-extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg);
-extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid);
-extern int __wt_win_directory_list(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *directory, const char *prefix, char ***dirlistp, uint32_t *countp);
-extern int __wt_win_directory_list_free(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, char **dirlist, uint32_t count);
-extern int __wt_win_fs_size(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *name, wt_off_t *sizep);
-extern int __wt_win_map(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, void *mapped_regionp, size_t *lenp, void *mapped_cookiep);
-extern int __wt_win_unmap(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, void *mapped_region, size_t length, void *mapped_cookie);
-extern uint64_t __wt_strtouq(const char *nptr, char **endptr, int base);
-extern void __wt_abort(WT_SESSION_IMPL *session) WT_GCC_FUNC_DECL_ATTRIBUTE((noreturn));
-extern void __wt_free_int(WT_SESSION_IMPL *session, const void *p_arg);
-extern void __wt_sleep(uint64_t seconds, uint64_t micro_seconds);
-extern void __wt_stream_set_line_buffer(FILE *fp);
-extern void __wt_stream_set_no_buffer(FILE *fp);
-extern void __wt_thread_id(char *buf, size_t buflen);
-extern void __wt_yield(void);
diff --git a/src/include/extern_posix.h b/src/include/extern_posix.h
new file mode 100644
index 00000000000..6fde537f36b
--- /dev/null
+++ b/src/include/extern_posix.h
@@ -0,0 +1,31 @@
+/* DO NOT EDIT: automatically built by dist/s_prototypes. */
+
+extern int __wt_posix_directory_list(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *directory, const char *prefix, char ***dirlistp, uint32_t *countp);
+extern int __wt_posix_directory_list_free(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, char **dirlist, uint32_t count);
+extern int __wt_dlopen(WT_SESSION_IMPL *session, const char *path, WT_DLH **dlhp);
+extern int __wt_dlsym(WT_SESSION_IMPL *session, WT_DLH *dlh, const char *name, bool fail, void *sym_ret);
+extern int __wt_dlclose(WT_SESSION_IMPL *session, WT_DLH *dlh);
+extern int __wt_posix_file_fallocate(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, wt_off_t offset, wt_off_t len);
+extern int __wt_os_posix(WT_SESSION_IMPL *session);
+extern int __wt_getenv(WT_SESSION_IMPL *session, const char *variable, const char **envp);
+extern int __wt_posix_map(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_regionp, size_t *lenp, void *mapped_cookiep);
+extern int __wt_posix_map_preload(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, const void *map, size_t length, void *mapped_cookie);
+extern int __wt_posix_map_discard(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *map, size_t length, void *mapped_cookie);
+extern int __wt_posix_unmap(WT_FILE_HANDLE *fh, WT_SESSION *wt_session, void *mapped_region, size_t len, void *mapped_cookie);
+extern int __wt_cond_alloc(WT_SESSION_IMPL *session, const char *name, bool is_signalled, WT_CONDVAR **condp);
+extern int __wt_cond_wait_signal( WT_SESSION_IMPL *session, WT_CONDVAR *cond, uint64_t usecs, bool *signalled);
+extern int __wt_cond_signal(WT_SESSION_IMPL *session, WT_CONDVAR *cond);
+extern int __wt_cond_destroy(WT_SESSION_IMPL *session, WT_CONDVAR **condp);
+extern int __wt_once(void (*init_routine)(void));
+extern int __wt_get_vm_pagesize(void);
+extern bool __wt_absolute_path(const char *path);
+extern const char *__wt_path_separator(void);
+extern bool __wt_has_priv(void);
+extern void __wt_stream_set_line_buffer(FILE *fp);
+extern void __wt_stream_set_no_buffer(FILE *fp);
+extern void __wt_sleep(uint64_t seconds, uint64_t micro_seconds);
+extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg);
+extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid);
+extern void __wt_thread_id(char *buf, size_t buflen);
+extern int __wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp);
+extern void __wt_yield(void);
diff --git a/src/include/extern_win.h b/src/include/extern_win.h
new file mode 100644
index 00000000000..c5c2624db2c
--- /dev/null
+++ b/src/include/extern_win.h
@@ -0,0 +1,32 @@
+/* DO NOT EDIT: automatically built by dist/s_prototypes. */
+
+extern int __wt_win_directory_list(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *directory, const char *prefix, char ***dirlistp, uint32_t *countp);
+extern int __wt_win_directory_list_free(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, char **dirlist, uint32_t count);
+extern int __wt_dlopen(WT_SESSION_IMPL *session, const char *path, WT_DLH **dlhp);
+extern int __wt_dlsym(WT_SESSION_IMPL *session, WT_DLH *dlh, const char *name, bool fail, void *sym_ret);
+extern int __wt_dlclose(WT_SESSION_IMPL *session, WT_DLH *dlh);
+extern int __wt_win_fs_size(WT_FILE_SYSTEM *file_system, WT_SESSION *wt_session, const char *name, wt_off_t *sizep);
+extern int __wt_os_win(WT_SESSION_IMPL *session);
+extern int __wt_getenv(WT_SESSION_IMPL *session, const char *variable, const char **envp);
+extern int __wt_win_map(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, void *mapped_regionp, size_t *lenp, void *mapped_cookiep);
+extern int __wt_win_unmap(WT_FILE_HANDLE *file_handle, WT_SESSION *wt_session, void *mapped_region, size_t length, void *mapped_cookie);
+extern int __wt_cond_alloc(WT_SESSION_IMPL *session, const char *name, bool is_signalled, WT_CONDVAR **condp);
+extern int __wt_cond_wait_signal( WT_SESSION_IMPL *session, WT_CONDVAR *cond, uint64_t usecs, bool *signalled);
+extern int __wt_cond_signal(WT_SESSION_IMPL *session, WT_CONDVAR *cond);
+extern int __wt_cond_destroy(WT_SESSION_IMPL *session, WT_CONDVAR **condp);
+extern int __wt_once(void (*init_routine)(void));
+extern int __wt_get_vm_pagesize(void);
+extern bool __wt_absolute_path(const char *path);
+extern const char *__wt_path_separator(void);
+extern bool __wt_has_priv(void);
+extern void __wt_stream_set_line_buffer(FILE *fp);
+extern void __wt_stream_set_no_buffer(FILE *fp);
+extern void __wt_sleep(uint64_t seconds, uint64_t micro_seconds);
+extern int __wt_thread_create(WT_SESSION_IMPL *session, wt_thread_t *tidret, WT_THREAD_CALLBACK(*func)(void *), void *arg);
+extern int __wt_thread_join(WT_SESSION_IMPL *session, wt_thread_t tid);
+extern void __wt_thread_id(char *buf, size_t buflen);
+extern int __wt_epoch(WT_SESSION_IMPL *session, struct timespec *tsp);
+extern DWORD __wt_getlasterror(void);
+extern int __wt_map_windows_error(DWORD windows_error);
+extern const char *__wt_formatmessage(WT_SESSION_IMPL *session, DWORD windows_error);
+extern void __wt_yield(void);
diff --git a/src/include/flags.h b/src/include/flags.h
index da7aee7b059..f134af69d29 100644
--- a/src/include/flags.h
+++ b/src/include/flags.h
@@ -13,13 +13,14 @@
#define WT_CONN_LSM_MERGE 0x00000100
#define WT_CONN_PANIC 0x00000200
#define WT_CONN_READONLY 0x00000400
-#define WT_CONN_SERVER_ASYNC 0x00000800
-#define WT_CONN_SERVER_CHECKPOINT 0x00001000
-#define WT_CONN_SERVER_LSM 0x00002000
-#define WT_CONN_SERVER_RUN 0x00004000
-#define WT_CONN_SERVER_STATISTICS 0x00008000
-#define WT_CONN_SERVER_SWEEP 0x00010000
-#define WT_CONN_WAS_BACKUP 0x00020000
+#define WT_CONN_RECOVERING 0x00000800
+#define WT_CONN_SERVER_ASYNC 0x00001000
+#define WT_CONN_SERVER_CHECKPOINT 0x00002000
+#define WT_CONN_SERVER_LSM 0x00004000
+#define WT_CONN_SERVER_RUN 0x00008000
+#define WT_CONN_SERVER_STATISTICS 0x00010000
+#define WT_CONN_SERVER_SWEEP 0x00020000
+#define WT_CONN_WAS_BACKUP 0x00040000
#define WT_EVICTING 0x00000001
#define WT_EVICT_IN_MEMORY 0x00000002
#define WT_EVICT_LOOKASIDE 0x00000004
@@ -47,11 +48,11 @@
#define WT_READ_TRUNCATE 0x00000800
#define WT_READ_WONT_NEED 0x00001000
#define WT_SESSION_CAN_WAIT 0x00000001
-#define WT_SESSION_CLEAR_EVICT_WALK 0x00000002
-#define WT_SESSION_INTERNAL 0x00000004
-#define WT_SESSION_LOCKED_CHECKPOINT 0x00000008
-#define WT_SESSION_LOCKED_HANDLE_LIST 0x00000010
-#define WT_SESSION_LOCKED_METADATA 0x00000020
+#define WT_SESSION_INTERNAL 0x00000002
+#define WT_SESSION_LOCKED_CHECKPOINT 0x00000004
+#define WT_SESSION_LOCKED_HANDLE_LIST 0x00000008
+#define WT_SESSION_LOCKED_METADATA 0x00000010
+#define WT_SESSION_LOCKED_PASS 0x00000020
#define WT_SESSION_LOCKED_SCHEMA 0x00000040
#define WT_SESSION_LOCKED_SLOT 0x00000080
#define WT_SESSION_LOCKED_TABLE 0x00000100
@@ -71,6 +72,8 @@
#define WT_TXN_LOG_CKPT_START 0x00000004
#define WT_TXN_LOG_CKPT_STOP 0x00000008
#define WT_TXN_LOG_CKPT_SYNC 0x00000010
+#define WT_TXN_OLDEST_STRICT 0x00000001
+#define WT_TXN_OLDEST_WAIT 0x00000002
#define WT_VERB_API 0x00000001
#define WT_VERB_BLOCK 0x00000002
#define WT_VERB_CHECKPOINT 0x00000004
diff --git a/src/include/log.h b/src/include/log.h
index 7655cfbb3e9..870c046252c 100644
--- a/src/include/log.h
+++ b/src/include/log.h
@@ -256,9 +256,8 @@ struct __wt_log {
#ifdef HAVE_DIAGNOSTIC
uint64_t write_calls; /* Calls to log_write */
#endif
-
-#define WT_LOG_NOT_VERIFIED 0x1 /* Log just started */
- uint32_t flags;
+#define WT_LOG_OPENED 0x01 /* Log subsystem successfully open */
+ uint32_t flags;
};
struct __wt_log_record {
diff --git a/src/include/misc.h b/src/include/misc.h
index 4c7c9572905..1121b7dfa75 100644
--- a/src/include/misc.h
+++ b/src/include/misc.h
@@ -12,6 +12,8 @@
*/
#define WT_UNUSED(var) (void)(var)
+#define WT_DIVIDER "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="
+
/* Basic constants. */
#define WT_THOUSAND (1000)
#define WT_MILLION (1000000)
@@ -31,12 +33,12 @@
*/
#define WT_STORE_SIZE(s) ((uint32_t)(s))
#define WT_PTRDIFF(end, begin) \
- ((size_t)((uint8_t *)(end) - (uint8_t *)(begin)))
+ ((size_t)((const uint8_t *)(end) - (const uint8_t *)(begin)))
#define WT_PTRDIFF32(end, begin) \
WT_STORE_SIZE(WT_PTRDIFF((end), (begin)))
#define WT_BLOCK_FITS(p, len, begin, maxlen) \
- ((uint8_t *)(p) >= (uint8_t *)(begin) && \
- ((uint8_t *)(p) + (len) <= (uint8_t *)(begin) + (maxlen)))
+ ((const uint8_t *)(p) >= (const uint8_t *)(begin) && \
+ ((const uint8_t *)(p) + (len) <= (const uint8_t *)(begin) + (maxlen)))
#define WT_PTR_IN_RANGE(p, begin, maxlen) \
WT_BLOCK_FITS((p), 1, (begin), (maxlen))
diff --git a/src/include/os.h b/src/include/os.h
index dd9b96f73a8..7a8e47ed81f 100644
--- a/src/include/os.h
+++ b/src/include/os.h
@@ -6,28 +6,32 @@
* See the file LICENSE for redistribution information.
*/
+#define WT_SYSCALL(call, ret) do { \
+ /* \
+ * A call returning 0 indicates success; any call where \
+ * 0 is not the only successful return must provide an \
+ * expression evaluating to 0 in all successful cases. \
+ */ \
+ if (((ret) = (call)) == 0) \
+ break; \
+ /* \
+ * The call's error was either returned by the call or \
+ * is in errno, and there are cases where it depends on \
+ * the software release as to which it is (for example, \
+ * posix_fadvise on FreeBSD and OS X). Failing calls \
+ * must either return a non-zero error value, or -1 if \
+ * the error value is in errno. (The WiredTiger errno \
+ * function returns WT_ERROR if errno is 0, which isn't \
+ * ideal but won't discard the failure.) \
+ */ \
+ if ((ret) == -1) \
+ (ret) = __wt_errno(); \
+} while (0)
+
#define WT_SYSCALL_RETRY(call, ret) do { \
int __retry; \
for (__retry = 0; __retry < 10; ++__retry) { \
- /* \
- * A call returning 0 indicates success; any call where \
- * 0 is not the only successful return must provide an \
- * expression evaluating to 0 in all successful cases. \
- */ \
- if (((ret) = (call)) == 0) \
- break; \
- /* \
- * The call's error was either returned by the call or \
- * is in errno, and there are cases where it depends on \
- * the software release as to which it is (for example, \
- * posix_fadvise on FreeBSD and OS X). Failing calls \
- * must either return a non-zero error value, or -1 if \
- * the error value is in errno. (The WiredTiger errno \
- * function returns WT_ERROR if errno is 0, which isn't \
- * ideal but won't discard the failure.) \
- */ \
- if ((ret) == -1) \
- (ret) = __wt_errno(); \
+ WT_SYSCALL(call, ret); \
switch (ret) { \
case EAGAIN: \
case EBUSY: \
@@ -132,7 +136,6 @@ struct __wt_file_handle_inmem {
TAILQ_ENTRY(__wt_file_handle_inmem) q; /* internal queue, hash queue */
TAILQ_ENTRY(__wt_file_handle_inmem) hashq;
- size_t off; /* Read/write offset */
WT_ITEM buf; /* Data */
u_int ref; /* Reference count */
};
diff --git a/src/include/os_fhandle.i b/src/include/os_fhandle.i
index cf790d6bc4d..313bf8eca3f 100644
--- a/src/include/os_fhandle.i
+++ b/src/include/os_fhandle.i
@@ -13,6 +13,7 @@
static inline int
__wt_fsync(WT_SESSION_IMPL *session, WT_FH *fh, bool block)
{
+ WT_DECL_RET;
WT_FILE_HANDLE *handle;
WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_READONLY));
@@ -21,12 +22,20 @@ __wt_fsync(WT_SESSION_IMPL *session, WT_FH *fh, bool block)
session, WT_VERB_HANDLEOPS, "%s: handle-sync", fh->handle->name));
handle = fh->handle;
+ /*
+ * There is no way to check when the non-blocking sync-file-range is
+ * complete, but we track the time taken in the call for completeness.
+ */
+ WT_STAT_FAST_CONN_INCR_ATOMIC(session, fsync_active);
+ WT_STAT_FAST_CONN_INCR(session, fsync_io);
if (block)
- return (handle->fh_sync == NULL ? 0 :
+ ret = (handle->fh_sync == NULL ? 0 :
handle->fh_sync(handle, (WT_SESSION *)session));
else
- return (handle->fh_sync_nowait == NULL ? 0 :
+ ret = (handle->fh_sync_nowait == NULL ? 0 :
handle->fh_sync_nowait(handle, (WT_SESSION *)session));
+ WT_STAT_FAST_CONN_DECR_ATOMIC(session, fsync_active);
+ return (ret);
}
/*
@@ -92,14 +101,20 @@ static inline int
__wt_read(
WT_SESSION_IMPL *session, WT_FH *fh, wt_off_t offset, size_t len, void *buf)
{
+ WT_DECL_RET;
+
WT_RET(__wt_verbose(session, WT_VERB_HANDLEOPS,
"%s: handle-read: %" WT_SIZET_FMT " at %" PRIuMAX,
fh->handle->name, len, (uintmax_t)offset));
+ WT_STAT_FAST_CONN_INCR_ATOMIC(session, read_active);
WT_STAT_FAST_CONN_INCR(session, read_io);
- return (fh->handle->fh_read(
- fh->handle, (WT_SESSION *)session, offset, len, buf));
+ ret = fh->handle->fh_read(
+ fh->handle, (WT_SESSION *)session, offset, len, buf);
+
+ WT_STAT_FAST_CONN_DECR_ATOMIC(session, read_active);
+ return (ret);
}
/*
@@ -140,6 +155,8 @@ static inline int
__wt_write(WT_SESSION_IMPL *session,
WT_FH *fh, wt_off_t offset, size_t len, const void *buf)
{
+ WT_DECL_RET;
+
WT_ASSERT(session, !F_ISSET(S2C(session), WT_CONN_READONLY) ||
WT_STRING_MATCH(fh->name,
WT_SINGLETHREAD, strlen(WT_SINGLETHREAD)));
@@ -148,8 +165,12 @@ __wt_write(WT_SESSION_IMPL *session,
"%s: handle-write: %" WT_SIZET_FMT " at %" PRIuMAX,
fh->handle->name, len, (uintmax_t)offset));
+ WT_STAT_FAST_CONN_INCR_ATOMIC(session, write_active);
WT_STAT_FAST_CONN_INCR(session, write_io);
- return (fh->handle->fh_write(
- fh->handle, (WT_SESSION *)session, offset, len, buf));
+ ret = fh->handle->fh_write(
+ fh->handle, (WT_SESSION *)session, offset, len, buf);
+
+ WT_STAT_FAST_CONN_DECR_ATOMIC(session, write_active);
+ return (ret);
}
diff --git a/src/include/packing.i b/src/include/packing.i
index 9d5971ed99f..d662c60d221 100644
--- a/src/include/packing.i
+++ b/src/include/packing.i
@@ -138,7 +138,7 @@ __pack_next(WT_PACK *pack, WT_PACK_VALUE *pv)
next: if (pack->cur == pack->end)
return (WT_NOTFOUND);
- if (isdigit(*pack->cur)) {
+ if (__wt_isdigit((u_char)*pack->cur)) {
pv->havesize = 1;
pv->size = WT_STORE_SIZE(strtoul(pack->cur, &endsize, 10));
pack->cur = endsize;
@@ -540,7 +540,7 @@ __unpack_read(WT_SESSION_IMPL *session,
break;
case 'R':
WT_SIZE_CHECK_UNPACK(sizeof(uint64_t), maxlen);
- pv->u.u = *(uint64_t *)*pp;
+ pv->u.u = *(const uint64_t *)*pp;
*pp += sizeof(uint64_t);
break;
default:
diff --git a/src/include/serial.i b/src/include/serial.i
index c0cd9c85ee9..67edc1c9ce1 100644
--- a/src/include/serial.i
+++ b/src/include/serial.i
@@ -306,7 +306,7 @@ __wt_update_serial(WT_SESSION_IMPL *session, WT_PAGE *page,
if ((txn = page->modify->obsolete_check_txn) != WT_TXN_NONE) {
if (!__wt_txn_visible_all(session, txn)) {
/* Try to move the oldest ID forward and re-check. */
- WT_RET(__wt_txn_update_oldest(session, false));
+ WT_RET(__wt_txn_update_oldest(session, 0));
if (!__wt_txn_visible_all(session, txn))
return (0);
diff --git a/src/include/stat.h b/src/include/stat.h
index a71e0fa208e..57126af8aa4 100644
--- a/src/include/stat.h
+++ b/src/include/stat.h
@@ -144,10 +144,16 @@ __wt_stats_clear(void *stats_arg, int slot)
#define WT_STAT_DECRV(session, stats, fld, value) \
(stats)[WT_STATS_SLOT_ID(session)]->fld -= (int64_t)(value)
+#define WT_STAT_DECRV_ATOMIC(session, stats, fld, value) \
+ __wt_atomic_addi64( \
+ &(stats)[WT_STATS_SLOT_ID(session)]->fld, (int64_t)(value))
#define WT_STAT_DECR(session, stats, fld) \
WT_STAT_DECRV(session, stats, fld, 1)
#define WT_STAT_INCRV(session, stats, fld, value) \
(stats)[WT_STATS_SLOT_ID(session)]->fld += (int64_t)(value)
+#define WT_STAT_INCRV_ATOMIC(session, stats, fld, value) \
+ __wt_atomic_subi64( \
+ &(stats)[WT_STATS_SLOT_ID(session)]->fld, (int64_t)(value))
#define WT_STAT_INCR(session, stats, fld) \
WT_STAT_INCRV(session, stats, fld, 1)
#define WT_STAT_SET(session, stats, fld, value) do { \
@@ -164,12 +170,20 @@ __wt_stats_clear(void *stats_arg, int slot)
} while (0)
#define WT_STAT_FAST_DECR(session, stats, fld) \
WT_STAT_FAST_DECRV(session, stats, fld, 1)
+#define WT_STAT_FAST_DECRV_ATOMIC(session, stats, fld, value) do { \
+ if (FLD_ISSET(S2C(session)->stat_flags, WT_CONN_STAT_FAST)) \
+ WT_STAT_DECRV_ATOMIC(session, stats, fld, value); \
+} while (0)
#define WT_STAT_FAST_INCRV(session, stats, fld, value) do { \
if (FLD_ISSET(S2C(session)->stat_flags, WT_CONN_STAT_FAST)) \
WT_STAT_INCRV(session, stats, fld, value); \
} while (0)
#define WT_STAT_FAST_INCR(session, stats, fld) \
WT_STAT_FAST_INCRV(session, stats, fld, 1)
+#define WT_STAT_FAST_INCRV_ATOMIC(session, stats, fld, value) do { \
+ if (FLD_ISSET(S2C(session)->stat_flags, WT_CONN_STAT_FAST)) \
+ WT_STAT_INCRV_ATOMIC(session, stats, fld, value); \
+} while (0)
#define WT_STAT_FAST_SET(session, stats, fld, value) do { \
if (FLD_ISSET(S2C(session)->stat_flags, WT_CONN_STAT_FAST)) \
WT_STAT_SET(session, stats, fld, value); \
@@ -180,10 +194,14 @@ __wt_stats_clear(void *stats_arg, int slot)
*/
#define WT_STAT_FAST_CONN_DECR(session, fld) \
WT_STAT_FAST_DECR(session, S2C(session)->stats, fld)
+#define WT_STAT_FAST_CONN_DECR_ATOMIC(session, fld) \
+ WT_STAT_FAST_DECRV_ATOMIC(session, S2C(session)->stats, fld, 1)
#define WT_STAT_FAST_CONN_DECRV(session, fld, value) \
WT_STAT_FAST_DECRV(session, S2C(session)->stats, fld, value)
#define WT_STAT_FAST_CONN_INCR(session, fld) \
WT_STAT_FAST_INCR(session, S2C(session)->stats, fld)
+#define WT_STAT_FAST_CONN_INCR_ATOMIC(session, fld) \
+ WT_STAT_FAST_INCRV_ATOMIC(session, S2C(session)->stats, fld, 1)
#define WT_STAT_FAST_CONN_INCRV(session, fld, value) \
WT_STAT_FAST_INCRV(session, S2C(session)->stats, fld, value)
#define WT_STAT_FAST_CONN_SET(session, fld, value) \
@@ -274,6 +292,8 @@ struct __wt_connection_stats {
int64_t cache_eviction_slow;
int64_t cache_eviction_worker_evicting;
int64_t cache_eviction_force_fail;
+ int64_t cache_eviction_walks_active;
+ int64_t cache_eviction_walks_started;
int64_t cache_eviction_hazard;
int64_t cache_hazard_checks;
int64_t cache_hazard_walks;
@@ -288,15 +308,19 @@ struct __wt_connection_stats {
int64_t cache_bytes_max;
int64_t cache_eviction_maximum_page_size;
int64_t cache_eviction_dirty;
+ int64_t cache_eviction_app_dirty;
int64_t cache_eviction_deepen;
int64_t cache_write_lookaside;
int64_t cache_pages_inuse;
int64_t cache_eviction_force;
int64_t cache_eviction_force_delete;
int64_t cache_eviction_app;
+ int64_t cache_eviction_pages_queued;
+ int64_t cache_eviction_pages_queued_oldest;
int64_t cache_read;
int64_t cache_read_lookaside;
int64_t cache_pages_requested;
+ int64_t cache_eviction_pages_seen;
int64_t cache_eviction_fail;
int64_t cache_eviction_walk;
int64_t cache_write;
@@ -317,6 +341,7 @@ struct __wt_connection_stats {
int64_t cond_wait;
int64_t rwlock_read;
int64_t rwlock_write;
+ int64_t fsync_io;
int64_t read_io;
int64_t write_io;
int64_t cursor_create;
@@ -359,7 +384,9 @@ struct __wt_connection_stats {
int64_t log_write_lsn;
int64_t log_write_lsn_skip;
int64_t log_sync;
+ int64_t log_sync_duration;
int64_t log_sync_dir;
+ int64_t log_sync_dir_duration;
int64_t log_writes;
int64_t log_slot_consolidated;
int64_t log_max_filesize;
@@ -381,6 +408,9 @@ struct __wt_connection_stats {
int64_t rec_split_stashed_objects;
int64_t session_cursor_open;
int64_t session_open;
+ int64_t fsync_active;
+ int64_t read_active;
+ int64_t write_active;
int64_t page_busy_blocked;
int64_t page_forcible_evict_blocked;
int64_t page_locked_blocked;
@@ -397,6 +427,10 @@ struct __wt_connection_stats {
int64_t txn_checkpoint_time_total;
int64_t txn_checkpoint;
int64_t txn_fail_cache;
+ int64_t txn_checkpoint_fsync_post;
+ int64_t txn_checkpoint_fsync_pre;
+ int64_t txn_checkpoint_fsync_post_duration;
+ int64_t txn_checkpoint_fsync_pre_duration;
int64_t txn_pinned_range;
int64_t txn_pinned_checkpoint_range;
int64_t txn_pinned_snapshot_range;
@@ -517,9 +551,11 @@ struct __wt_dsrc_stats {
*/
#define WT_JOIN_STATS_BASE 3000
struct __wt_join_stats {
- int64_t accesses;
- int64_t actual_count;
+ int64_t main_access;
int64_t bloom_false_positive;
+ int64_t membership_check;
+ int64_t bloom_insert;
+ int64_t iterated;
};
/* Statistics section: END */
diff --git a/src/include/wiredtiger.in b/src/include/wiredtiger.in
index 6de92b72051..f578f4e6c08 100644
--- a/src/include/wiredtiger.in
+++ b/src/include/wiredtiger.in
@@ -1466,15 +1466,16 @@ struct __wt_session {
* @config{dump_blocks, Display the contents of on-disk blocks as they
* are verified\, using the application's message handler\, intended for
* debugging., a boolean flag; default \c false.}
+ * @config{dump_layout, Display the layout of the files as they are
+ * verified\, using the application's message handler\, intended for
+ * debugging; requires optional support from the block manager., a
+ * boolean flag; default \c false.}
* @config{dump_offsets, Display the contents of specific on-disk
* blocks\, using the application's message handler\, intended for
* debugging., a list of strings; default empty.}
* @config{dump_pages, Display the contents of in-memory pages as they
* are verified\, using the application's message handler\, intended for
* debugging., a boolean flag; default \c false.}
- * @config{dump_shape, Display the shape of the tree after
- * verification\, using the application's message handler\, intended for
- * debugging., a boolean flag; default \c false.}
* @config{strict, Treat any verification problem as an error; by
* default\, verify will warn\, but not fail\, in the case of errors
* that won't affect future behavior (for example\, a leaked block)., a
@@ -1848,7 +1849,7 @@ struct __wt_connection {
* @config{&nbsp;&nbsp;&nbsp;&nbsp;path, the path to a directory into
* which the log files are written. If the value is not an absolute
* path name\, the files are created relative to the database home., a
- * string; default empty.}
+ * string; default \c ".".}
* @config{&nbsp;&nbsp;&nbsp;&nbsp;prealloc,
* pre-allocate log files., a boolean flag; default \c true.}
* @config{&nbsp;&nbsp;&nbsp;&nbsp;recover, run recovery or error if
@@ -2344,7 +2345,7 @@ struct __wt_connection {
* integer between 100KB and 2GB; default \c 100MB.}
* @config{&nbsp;&nbsp;&nbsp;&nbsp;path, the path to a directory into which the
* log files are written. If the value is not an absolute path name\, the files
- * are created relative to the database home., a string; default empty.}
+ * are created relative to the database home., a string; default \c ".".}
* @config{&nbsp;&nbsp;&nbsp;&nbsp;prealloc, pre-allocate log files., a boolean
* flag; default \c true.}
* @config{&nbsp;&nbsp;&nbsp;&nbsp;recover, run recovery
@@ -3050,10 +3051,6 @@ const char *wiredtiger_version(int *majorp, int *minorp, int *patchp);
* transaction.
*/
#define WT_CACHE_FULL -31807
-/*! @cond internal */
-/*! Permission denied (internal). */
-#define WT_PERM_DENIED -31808
-/*! @endcond */
/*
* Error return section: END
* DO NOT EDIT: automatically built by dist/api_err.py.
@@ -4298,265 +4295,301 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
#define WT_STAT_CONN_CACHE_EVICTION_WORKER_EVICTING 1045
/*! cache: failed eviction of pages that exceeded the in-memory maximum */
#define WT_STAT_CONN_CACHE_EVICTION_FORCE_FAIL 1046
+/*! cache: files with active eviction walks */
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_ACTIVE 1047
+/*! cache: files with new eviction walks started */
+#define WT_STAT_CONN_CACHE_EVICTION_WALKS_STARTED 1048
/*! cache: hazard pointer blocked page eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1047
+#define WT_STAT_CONN_CACHE_EVICTION_HAZARD 1049
/*! cache: hazard pointer check calls */
-#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1048
+#define WT_STAT_CONN_CACHE_HAZARD_CHECKS 1050
/*! cache: hazard pointer check entries walked */
-#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1049
+#define WT_STAT_CONN_CACHE_HAZARD_WALKS 1051
/*! cache: hazard pointer maximum array length */
-#define WT_STAT_CONN_CACHE_HAZARD_MAX 1050
+#define WT_STAT_CONN_CACHE_HAZARD_MAX 1052
/*! cache: in-memory page passed criteria to be split */
-#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1051
+#define WT_STAT_CONN_CACHE_INMEM_SPLITTABLE 1053
/*! cache: in-memory page splits */
-#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1052
+#define WT_STAT_CONN_CACHE_INMEM_SPLIT 1054
/*! cache: internal pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1053
+#define WT_STAT_CONN_CACHE_EVICTION_INTERNAL 1055
/*! cache: internal pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1054
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_INTERNAL 1056
/*! cache: leaf pages split during eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1055
+#define WT_STAT_CONN_CACHE_EVICTION_SPLIT_LEAF 1057
/*! cache: lookaside table insert calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1056
+#define WT_STAT_CONN_CACHE_LOOKASIDE_INSERT 1058
/*! cache: lookaside table remove calls */
-#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1057
+#define WT_STAT_CONN_CACHE_LOOKASIDE_REMOVE 1059
/*! cache: maximum bytes configured */
-#define WT_STAT_CONN_CACHE_BYTES_MAX 1058
+#define WT_STAT_CONN_CACHE_BYTES_MAX 1060
/*! cache: maximum page size at eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1059
+#define WT_STAT_CONN_CACHE_EVICTION_MAXIMUM_PAGE_SIZE 1061
/*! cache: modified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1060
+#define WT_STAT_CONN_CACHE_EVICTION_DIRTY 1062
+/*! cache: modified pages evicted by application threads */
+#define WT_STAT_CONN_CACHE_EVICTION_APP_DIRTY 1063
/*! cache: page split during eviction deepened the tree */
-#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1061
+#define WT_STAT_CONN_CACHE_EVICTION_DEEPEN 1064
/*! cache: page written requiring lookaside records */
-#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1062
+#define WT_STAT_CONN_CACHE_WRITE_LOOKASIDE 1065
/*! cache: pages currently held in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_INUSE 1063
+#define WT_STAT_CONN_CACHE_PAGES_INUSE 1066
/*! cache: pages evicted because they exceeded the in-memory maximum */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1064
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE 1067
/*! cache: pages evicted because they had chains of deleted items */
-#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1065
+#define WT_STAT_CONN_CACHE_EVICTION_FORCE_DELETE 1068
/*! cache: pages evicted by application threads */
-#define WT_STAT_CONN_CACHE_EVICTION_APP 1066
+#define WT_STAT_CONN_CACHE_EVICTION_APP 1069
+/*! cache: pages queued for eviction */
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED 1070
+/*! cache: pages queued for urgent eviction */
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_QUEUED_OLDEST 1071
/*! cache: pages read into cache */
-#define WT_STAT_CONN_CACHE_READ 1067
+#define WT_STAT_CONN_CACHE_READ 1072
/*! cache: pages read into cache requiring lookaside entries */
-#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1068
+#define WT_STAT_CONN_CACHE_READ_LOOKASIDE 1073
/*! cache: pages requested from the cache */
-#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1069
+#define WT_STAT_CONN_CACHE_PAGES_REQUESTED 1074
+/*! cache: pages seen by eviction walk */
+#define WT_STAT_CONN_CACHE_EVICTION_PAGES_SEEN 1075
/*! cache: pages selected for eviction unable to be evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1070
+#define WT_STAT_CONN_CACHE_EVICTION_FAIL 1076
/*! cache: pages walked for eviction */
-#define WT_STAT_CONN_CACHE_EVICTION_WALK 1071
+#define WT_STAT_CONN_CACHE_EVICTION_WALK 1077
/*! cache: pages written from cache */
-#define WT_STAT_CONN_CACHE_WRITE 1072
+#define WT_STAT_CONN_CACHE_WRITE 1078
/*! cache: pages written requiring in-memory restoration */
-#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1073
+#define WT_STAT_CONN_CACHE_WRITE_RESTORE 1079
/*! cache: percentage overhead */
-#define WT_STAT_CONN_CACHE_OVERHEAD 1074
+#define WT_STAT_CONN_CACHE_OVERHEAD 1080
/*! cache: tracked bytes belonging to internal pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1075
+#define WT_STAT_CONN_CACHE_BYTES_INTERNAL 1081
/*! cache: tracked bytes belonging to leaf pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_LEAF 1076
+#define WT_STAT_CONN_CACHE_BYTES_LEAF 1082
/*! cache: tracked bytes belonging to overflow pages in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_OVERFLOW 1077
+#define WT_STAT_CONN_CACHE_BYTES_OVERFLOW 1083
/*! cache: tracked dirty bytes in the cache */
-#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1078
+#define WT_STAT_CONN_CACHE_BYTES_DIRTY 1084
/*! cache: tracked dirty pages in the cache */
-#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1079
+#define WT_STAT_CONN_CACHE_PAGES_DIRTY 1085
/*! cache: unmodified pages evicted */
-#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1080
+#define WT_STAT_CONN_CACHE_EVICTION_CLEAN 1086
/*! connection: auto adjusting condition resets */
-#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1081
+#define WT_STAT_CONN_COND_AUTO_WAIT_RESET 1087
/*! connection: auto adjusting condition wait calls */
-#define WT_STAT_CONN_COND_AUTO_WAIT 1082
+#define WT_STAT_CONN_COND_AUTO_WAIT 1088
/*! connection: files currently open */
-#define WT_STAT_CONN_FILE_OPEN 1083
+#define WT_STAT_CONN_FILE_OPEN 1089
/*! connection: memory allocations */
-#define WT_STAT_CONN_MEMORY_ALLOCATION 1084
+#define WT_STAT_CONN_MEMORY_ALLOCATION 1090
/*! connection: memory frees */
-#define WT_STAT_CONN_MEMORY_FREE 1085
+#define WT_STAT_CONN_MEMORY_FREE 1091
/*! connection: memory re-allocations */
-#define WT_STAT_CONN_MEMORY_GROW 1086
+#define WT_STAT_CONN_MEMORY_GROW 1092
/*! connection: pthread mutex condition wait calls */
-#define WT_STAT_CONN_COND_WAIT 1087
+#define WT_STAT_CONN_COND_WAIT 1093
/*! connection: pthread mutex shared lock read-lock calls */
-#define WT_STAT_CONN_RWLOCK_READ 1088
+#define WT_STAT_CONN_RWLOCK_READ 1094
/*! connection: pthread mutex shared lock write-lock calls */
-#define WT_STAT_CONN_RWLOCK_WRITE 1089
+#define WT_STAT_CONN_RWLOCK_WRITE 1095
+/*! connection: total fsync I/Os */
+#define WT_STAT_CONN_FSYNC_IO 1096
/*! connection: total read I/Os */
-#define WT_STAT_CONN_READ_IO 1090
+#define WT_STAT_CONN_READ_IO 1097
/*! connection: total write I/Os */
-#define WT_STAT_CONN_WRITE_IO 1091
+#define WT_STAT_CONN_WRITE_IO 1098
/*! cursor: cursor create calls */
-#define WT_STAT_CONN_CURSOR_CREATE 1092
+#define WT_STAT_CONN_CURSOR_CREATE 1099
/*! cursor: cursor insert calls */
-#define WT_STAT_CONN_CURSOR_INSERT 1093
+#define WT_STAT_CONN_CURSOR_INSERT 1100
/*! cursor: cursor next calls */
-#define WT_STAT_CONN_CURSOR_NEXT 1094
+#define WT_STAT_CONN_CURSOR_NEXT 1101
/*! cursor: cursor prev calls */
-#define WT_STAT_CONN_CURSOR_PREV 1095
+#define WT_STAT_CONN_CURSOR_PREV 1102
/*! cursor: cursor remove calls */
-#define WT_STAT_CONN_CURSOR_REMOVE 1096
+#define WT_STAT_CONN_CURSOR_REMOVE 1103
/*! cursor: cursor reset calls */
-#define WT_STAT_CONN_CURSOR_RESET 1097
+#define WT_STAT_CONN_CURSOR_RESET 1104
/*! cursor: cursor restarted searches */
-#define WT_STAT_CONN_CURSOR_RESTART 1098
+#define WT_STAT_CONN_CURSOR_RESTART 1105
/*! cursor: cursor search calls */
-#define WT_STAT_CONN_CURSOR_SEARCH 1099
+#define WT_STAT_CONN_CURSOR_SEARCH 1106
/*! cursor: cursor search near calls */
-#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1100
+#define WT_STAT_CONN_CURSOR_SEARCH_NEAR 1107
/*! cursor: cursor update calls */
-#define WT_STAT_CONN_CURSOR_UPDATE 1101
+#define WT_STAT_CONN_CURSOR_UPDATE 1108
/*! cursor: truncate calls */
-#define WT_STAT_CONN_CURSOR_TRUNCATE 1102
+#define WT_STAT_CONN_CURSOR_TRUNCATE 1109
/*! data-handle: connection data handles currently active */
-#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1103
+#define WT_STAT_CONN_DH_CONN_HANDLE_COUNT 1110
/*! data-handle: connection sweep candidate became referenced */
-#define WT_STAT_CONN_DH_SWEEP_REF 1104
+#define WT_STAT_CONN_DH_SWEEP_REF 1111
/*! data-handle: connection sweep dhandles closed */
-#define WT_STAT_CONN_DH_SWEEP_CLOSE 1105
+#define WT_STAT_CONN_DH_SWEEP_CLOSE 1112
/*! data-handle: connection sweep dhandles removed from hash list */
-#define WT_STAT_CONN_DH_SWEEP_REMOVE 1106
+#define WT_STAT_CONN_DH_SWEEP_REMOVE 1113
/*! data-handle: connection sweep time-of-death sets */
-#define WT_STAT_CONN_DH_SWEEP_TOD 1107
+#define WT_STAT_CONN_DH_SWEEP_TOD 1114
/*! data-handle: connection sweeps */
-#define WT_STAT_CONN_DH_SWEEPS 1108
+#define WT_STAT_CONN_DH_SWEEPS 1115
/*! data-handle: session dhandles swept */
-#define WT_STAT_CONN_DH_SESSION_HANDLES 1109
+#define WT_STAT_CONN_DH_SESSION_HANDLES 1116
/*! data-handle: session sweep attempts */
-#define WT_STAT_CONN_DH_SESSION_SWEEPS 1110
+#define WT_STAT_CONN_DH_SESSION_SWEEPS 1117
/*! log: busy returns attempting to switch slots */
-#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1111
+#define WT_STAT_CONN_LOG_SLOT_SWITCH_BUSY 1118
/*! log: consolidated slot closures */
-#define WT_STAT_CONN_LOG_SLOT_CLOSES 1112
+#define WT_STAT_CONN_LOG_SLOT_CLOSES 1119
/*! log: consolidated slot join races */
-#define WT_STAT_CONN_LOG_SLOT_RACES 1113
+#define WT_STAT_CONN_LOG_SLOT_RACES 1120
/*! log: consolidated slot join transitions */
-#define WT_STAT_CONN_LOG_SLOT_TRANSITIONS 1114
+#define WT_STAT_CONN_LOG_SLOT_TRANSITIONS 1121
/*! log: consolidated slot joins */
-#define WT_STAT_CONN_LOG_SLOT_JOINS 1115
+#define WT_STAT_CONN_LOG_SLOT_JOINS 1122
/*! log: consolidated slot unbuffered writes */
-#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1116
+#define WT_STAT_CONN_LOG_SLOT_UNBUFFERED 1123
/*! log: log bytes of payload data */
-#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1117
+#define WT_STAT_CONN_LOG_BYTES_PAYLOAD 1124
/*! log: log bytes written */
-#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1118
+#define WT_STAT_CONN_LOG_BYTES_WRITTEN 1125
/*! log: log files manually zero-filled */
-#define WT_STAT_CONN_LOG_ZERO_FILLS 1119
+#define WT_STAT_CONN_LOG_ZERO_FILLS 1126
/*! log: log flush operations */
-#define WT_STAT_CONN_LOG_FLUSH 1120
+#define WT_STAT_CONN_LOG_FLUSH 1127
/*! log: log force write operations */
-#define WT_STAT_CONN_LOG_FORCE_WRITE 1121
+#define WT_STAT_CONN_LOG_FORCE_WRITE 1128
/*! log: log force write operations skipped */
-#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1122
+#define WT_STAT_CONN_LOG_FORCE_WRITE_SKIP 1129
/*! log: log records compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1123
+#define WT_STAT_CONN_LOG_COMPRESS_WRITES 1130
/*! log: log records not compressed */
-#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1124
+#define WT_STAT_CONN_LOG_COMPRESS_WRITE_FAILS 1131
/*! log: log records too small to compress */
-#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1125
+#define WT_STAT_CONN_LOG_COMPRESS_SMALL 1132
/*! log: log release advances write LSN */
-#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1126
+#define WT_STAT_CONN_LOG_RELEASE_WRITE_LSN 1133
/*! log: log scan operations */
-#define WT_STAT_CONN_LOG_SCANS 1127
+#define WT_STAT_CONN_LOG_SCANS 1134
/*! log: log scan records requiring two reads */
-#define WT_STAT_CONN_LOG_SCAN_REREADS 1128
+#define WT_STAT_CONN_LOG_SCAN_REREADS 1135
/*! log: log server thread advances write LSN */
-#define WT_STAT_CONN_LOG_WRITE_LSN 1129
+#define WT_STAT_CONN_LOG_WRITE_LSN 1136
/*! log: log server thread write LSN walk skipped */
-#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1130
+#define WT_STAT_CONN_LOG_WRITE_LSN_SKIP 1137
/*! log: log sync operations */
-#define WT_STAT_CONN_LOG_SYNC 1131
+#define WT_STAT_CONN_LOG_SYNC 1138
+/*! log: log sync time duration (usecs) */
+#define WT_STAT_CONN_LOG_SYNC_DURATION 1139
/*! log: log sync_dir operations */
-#define WT_STAT_CONN_LOG_SYNC_DIR 1132
+#define WT_STAT_CONN_LOG_SYNC_DIR 1140
+/*! log: log sync_dir time duration (usecs) */
+#define WT_STAT_CONN_LOG_SYNC_DIR_DURATION 1141
/*! log: log write operations */
-#define WT_STAT_CONN_LOG_WRITES 1133
+#define WT_STAT_CONN_LOG_WRITES 1142
/*! log: logging bytes consolidated */
-#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1134
+#define WT_STAT_CONN_LOG_SLOT_CONSOLIDATED 1143
/*! log: maximum log file size */
-#define WT_STAT_CONN_LOG_MAX_FILESIZE 1135
+#define WT_STAT_CONN_LOG_MAX_FILESIZE 1144
/*! log: number of pre-allocated log files to create */
-#define WT_STAT_CONN_LOG_PREALLOC_MAX 1136
+#define WT_STAT_CONN_LOG_PREALLOC_MAX 1145
/*! log: pre-allocated log files not ready and missed */
-#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1137
+#define WT_STAT_CONN_LOG_PREALLOC_MISSED 1146
/*! log: pre-allocated log files prepared */
-#define WT_STAT_CONN_LOG_PREALLOC_FILES 1138
+#define WT_STAT_CONN_LOG_PREALLOC_FILES 1147
/*! log: pre-allocated log files used */
-#define WT_STAT_CONN_LOG_PREALLOC_USED 1139
+#define WT_STAT_CONN_LOG_PREALLOC_USED 1148
/*! log: records processed by log scan */
-#define WT_STAT_CONN_LOG_SCAN_RECORDS 1140
+#define WT_STAT_CONN_LOG_SCAN_RECORDS 1149
/*! log: total in-memory size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_MEM 1141
+#define WT_STAT_CONN_LOG_COMPRESS_MEM 1150
/*! log: total log buffer size */
-#define WT_STAT_CONN_LOG_BUFFER_SIZE 1142
+#define WT_STAT_CONN_LOG_BUFFER_SIZE 1151
/*! log: total size of compressed records */
-#define WT_STAT_CONN_LOG_COMPRESS_LEN 1143
+#define WT_STAT_CONN_LOG_COMPRESS_LEN 1152
/*! log: written slots coalesced */
-#define WT_STAT_CONN_LOG_SLOT_COALESCED 1144
+#define WT_STAT_CONN_LOG_SLOT_COALESCED 1153
/*! log: yields waiting for previous log file close */
-#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1145
+#define WT_STAT_CONN_LOG_CLOSE_YIELDS 1154
/*! reconciliation: fast-path pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1146
+#define WT_STAT_CONN_REC_PAGE_DELETE_FAST 1155
/*! reconciliation: page reconciliation calls */
-#define WT_STAT_CONN_REC_PAGES 1147
+#define WT_STAT_CONN_REC_PAGES 1156
/*! reconciliation: page reconciliation calls for eviction */
-#define WT_STAT_CONN_REC_PAGES_EVICTION 1148
+#define WT_STAT_CONN_REC_PAGES_EVICTION 1157
/*! reconciliation: pages deleted */
-#define WT_STAT_CONN_REC_PAGE_DELETE 1149
+#define WT_STAT_CONN_REC_PAGE_DELETE 1158
/*! reconciliation: split bytes currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1150
+#define WT_STAT_CONN_REC_SPLIT_STASHED_BYTES 1159
/*! reconciliation: split objects currently awaiting free */
-#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1151
+#define WT_STAT_CONN_REC_SPLIT_STASHED_OBJECTS 1160
/*! session: open cursor count */
-#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1152
+#define WT_STAT_CONN_SESSION_CURSOR_OPEN 1161
/*! session: open session count */
-#define WT_STAT_CONN_SESSION_OPEN 1153
+#define WT_STAT_CONN_SESSION_OPEN 1162
+/*! thread-state: active filesystem fsync calls */
+#define WT_STAT_CONN_FSYNC_ACTIVE 1163
+/*! thread-state: active filesystem read calls */
+#define WT_STAT_CONN_READ_ACTIVE 1164
+/*! thread-state: active filesystem write calls */
+#define WT_STAT_CONN_WRITE_ACTIVE 1165
/*! thread-yield: page acquire busy blocked */
-#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1154
+#define WT_STAT_CONN_PAGE_BUSY_BLOCKED 1166
/*! thread-yield: page acquire eviction blocked */
-#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1155
+#define WT_STAT_CONN_PAGE_FORCIBLE_EVICT_BLOCKED 1167
/*! thread-yield: page acquire locked blocked */
-#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1156
+#define WT_STAT_CONN_PAGE_LOCKED_BLOCKED 1168
/*! thread-yield: page acquire read blocked */
-#define WT_STAT_CONN_PAGE_READ_BLOCKED 1157
+#define WT_STAT_CONN_PAGE_READ_BLOCKED 1169
/*! thread-yield: page acquire time sleeping (usecs) */
-#define WT_STAT_CONN_PAGE_SLEEP 1158
+#define WT_STAT_CONN_PAGE_SLEEP 1170
/*! transaction: number of named snapshots created */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1159
+#define WT_STAT_CONN_TXN_SNAPSHOTS_CREATED 1171
/*! transaction: number of named snapshots dropped */
-#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1160
+#define WT_STAT_CONN_TXN_SNAPSHOTS_DROPPED 1172
/*! transaction: transaction begins */
-#define WT_STAT_CONN_TXN_BEGIN 1161
+#define WT_STAT_CONN_TXN_BEGIN 1173
/*! transaction: transaction checkpoint currently running */
-#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1162
+#define WT_STAT_CONN_TXN_CHECKPOINT_RUNNING 1174
/*! transaction: transaction checkpoint generation */
-#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1163
+#define WT_STAT_CONN_TXN_CHECKPOINT_GENERATION 1175
/*! transaction: transaction checkpoint max time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1164
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MAX 1176
/*! transaction: transaction checkpoint min time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1165
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_MIN 1177
/*! transaction: transaction checkpoint most recent time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1166
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_RECENT 1178
/*! transaction: transaction checkpoint total time (msecs) */
-#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1167
+#define WT_STAT_CONN_TXN_CHECKPOINT_TIME_TOTAL 1179
/*! transaction: transaction checkpoints */
-#define WT_STAT_CONN_TXN_CHECKPOINT 1168
+#define WT_STAT_CONN_TXN_CHECKPOINT 1180
/*! transaction: transaction failures due to cache overflow */
-#define WT_STAT_CONN_TXN_FAIL_CACHE 1169
+#define WT_STAT_CONN_TXN_FAIL_CACHE 1181
+/*! transaction: transaction fsync calls for checkpoint after allocating
+ * the transaction ID */
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST 1182
+/*! transaction: transaction fsync calls for checkpoint before allocating
+ * the transaction ID */
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_PRE 1183
+/*! transaction: transaction fsync duration for checkpoint after
+ * allocating the transaction ID (usecs) */
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_POST_DURATION 1184
+/*! transaction: transaction fsync duration for checkpoint before
+ * allocating the transaction ID (usecs) */
+#define WT_STAT_CONN_TXN_CHECKPOINT_FSYNC_PRE_DURATION 1185
/*! transaction: transaction range of IDs currently pinned */
-#define WT_STAT_CONN_TXN_PINNED_RANGE 1170
+#define WT_STAT_CONN_TXN_PINNED_RANGE 1186
/*! transaction: transaction range of IDs currently pinned by a checkpoint */
-#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1171
+#define WT_STAT_CONN_TXN_PINNED_CHECKPOINT_RANGE 1187
/*! transaction: transaction range of IDs currently pinned by named
* snapshots */
-#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1172
+#define WT_STAT_CONN_TXN_PINNED_SNAPSHOT_RANGE 1188
/*! transaction: transaction sync calls */
-#define WT_STAT_CONN_TXN_SYNC 1173
+#define WT_STAT_CONN_TXN_SYNC 1189
/*! transaction: transactions committed */
-#define WT_STAT_CONN_TXN_COMMIT 1174
+#define WT_STAT_CONN_TXN_COMMIT 1190
/*! transaction: transactions rolled back */
-#define WT_STAT_CONN_TXN_ROLLBACK 1175
+#define WT_STAT_CONN_TXN_ROLLBACK 1191
/*!
* @}
@@ -4773,12 +4806,16 @@ extern int wiredtiger_extension_terminate(WT_CONNECTION *connection);
* @anchor statistics_join
* @{
*/
-/*! : accesses */
-#define WT_STAT_JOIN_ACCESSES 3000
-/*! : actual count of items */
-#define WT_STAT_JOIN_ACTUAL_COUNT 3001
+/*! : accesses to the main table */
+#define WT_STAT_JOIN_MAIN_ACCESS 3000
/*! : bloom filter false positives */
-#define WT_STAT_JOIN_BLOOM_FALSE_POSITIVE 3002
+#define WT_STAT_JOIN_BLOOM_FALSE_POSITIVE 3001
+/*! : checks that conditions of membership are satisfied */
+#define WT_STAT_JOIN_MEMBERSHIP_CHECK 3002
+/*! : items inserted into a bloom filter */
+#define WT_STAT_JOIN_BLOOM_INSERT 3003
+/*! : items iterated */
+#define WT_STAT_JOIN_ITERATED 3004
/*! @} */
/*
* Statistics section: END
diff --git a/src/include/wiredtiger_ext.h b/src/include/wiredtiger_ext.h
index 7d97d97dcf5..3d65cd1fc24 100644
--- a/src/include/wiredtiger_ext.h
+++ b/src/include/wiredtiger_ext.h
@@ -131,6 +131,19 @@ struct __wt_extension_api {
WT_EXTENSION_API *, WT_SESSION *session, int error);
/*!
+ * Map a Windows system error code to a POSIX 1003.1/ANSI C error.
+ *
+ * @param wt_api the extension handle
+ * @param session the session handle (or NULL if none available)
+ * @param windows_error a Windows system error code
+ * @returns a string representation of the error
+ *
+ * @snippet ex_data_source.c WT_EXTENSION_API map_windows_error
+ */
+ int (*map_windows_error)(WT_EXTENSION_API *wt_api,
+ WT_SESSION *session, uint32_t windows_error);
+
+ /*!
* Allocate short-term use scratch memory.
*
* @param wt_api the extension handle
diff --git a/src/include/wt_internal.h b/src/include/wt_internal.h
index 0c8abf36cfe..c5337967f22 100644
--- a/src/include/wt_internal.h
+++ b/src/include/wt_internal.h
@@ -28,7 +28,6 @@ extern "C" {
#include <sys/time.h>
#include <sys/uio.h>
#endif
-#include <ctype.h>
#ifndef _WIN32
#include <dlfcn.h>
#endif
@@ -357,8 +356,14 @@ union __wt_rand_state;
#include "connection.h"
#include "extern.h"
+#ifdef _WIN32
+#include "extern_win.h"
+#else
+#include "extern_posix.h"
+#endif
#include "verify_build.h"
+#include "ctype.i" /* required by packing.i */
#include "intpack.i" /* required by cell.i, packing.i */
#include "buf.i" /* required by cell.i */