summaryrefslogtreecommitdiff
path: root/src/conn
diff options
context:
space:
mode:
Diffstat (limited to 'src/conn')
-rw-r--r--src/conn/api_strerror.c2
-rw-r--r--src/conn/conn_api.c32
-rw-r--r--src/conn/conn_cache.c18
-rw-r--r--src/conn/conn_cache_pool.c1
-rw-r--r--src/conn/conn_dhandle.c10
-rw-r--r--src/conn/conn_log.c2
-rw-r--r--src/conn/conn_open.c3
7 files changed, 43 insertions, 25 deletions
diff --git a/src/conn/api_strerror.c b/src/conn/api_strerror.c
index 87864f7f4b0..edb11957556 100644
--- a/src/conn/api_strerror.c
+++ b/src/conn/api_strerror.c
@@ -40,8 +40,6 @@ __wt_wiredtiger_error(int error)
return ("WT_RUN_RECOVERY: recovery must be run to continue");
case WT_CACHE_FULL:
return ("WT_CACHE_FULL: operation would overflow cache");
- case WT_PERM_DENIED:
- return ("WT_PERM_DENIED: permission denied (internal)");
}
/*
diff --git a/src/conn/conn_api.c b/src/conn/conn_api.c
index dde3fb6930e..98267eeeb2c 100644
--- a/src/conn/conn_api.c
+++ b/src/conn/conn_api.c
@@ -751,6 +751,7 @@ __conn_get_extension_api(WT_CONNECTION *wt_conn)
conn->extension_api.err_printf = __wt_ext_err_printf;
conn->extension_api.msg_printf = __wt_ext_msg_printf;
conn->extension_api.strerror = __wt_ext_strerror;
+ conn->extension_api.map_windows_error = __wt_ext_map_windows_error;
conn->extension_api.scr_alloc = __wt_ext_scr_alloc;
conn->extension_api.scr_free = __wt_ext_scr_free;
conn->extension_api.collator_config = ext_collator_config;
@@ -1298,7 +1299,8 @@ __conn_config_file(WT_SESSION_IMPL *session,
* the next character is a hash mark, skip to the next newline.
*/
for (;;) {
- for (*t++ = ','; --len > 0 && isspace(*++p);)
+ for (*t++ = ',';
+ --len > 0 && __wt_isspace((u_char)*++p);)
;
if (len == 0)
break;
@@ -1517,17 +1519,14 @@ __conn_single(WT_SESSION_IMPL *session, const char *cfg[])
* if the file does not exist. If so, then ignore the error.
* XXX Ignoring the error does allow multiple read-only
* connections to exist at the same time on a read-only directory.
+ *
+ * If we got an expected permission or non-existence error then skip
+ * the byte lock.
*/
- if (F_ISSET(conn, WT_CONN_READONLY)) {
- /*
- * If we got an expected permission or non-existence error
- * then skip the byte lock.
- */
- ret = __wt_map_error_rdonly(ret);
- if (ret == WT_NOTFOUND || ret == WT_PERM_DENIED) {
- bytelock = false;
- ret = 0;
- }
+ if (F_ISSET(conn, WT_CONN_READONLY) &&
+ (ret == EACCES || ret == ENOENT)) {
+ bytelock = false;
+ ret = 0;
}
WT_ERR(ret);
if (bytelock) {
@@ -1567,19 +1566,16 @@ __conn_single(WT_SESSION_IMPL *session, const char *cfg[])
WT_OPEN_FILE_TYPE_REGULAR, is_create ? WT_OPEN_CREATE : 0, &fh);
/*
- * If we're read-only, check for success as well as handled errors.
- * Even if we're able to open the WiredTiger file successfully, we
- * do not try to lock it. The lock file test above is the only
- * one we do for read-only.
+ * If we're read-only, check for handled errors. Even if able to open
+ * the WiredTiger file successfully, we do not try to lock it. The
+ * lock file test above is the only one we do for read-only.
*/
if (F_ISSET(conn, WT_CONN_READONLY)) {
- ret = __wt_map_error_rdonly(ret);
- if (ret == 0 || ret == WT_NOTFOUND || ret == WT_PERM_DENIED)
+ if (ret == EACCES || ret == ENOENT)
ret = 0;
WT_ERR(ret);
} else {
WT_ERR(ret);
-
/*
* Lock the WiredTiger file (for backward compatibility reasons
* as described above). Immediately release the lock, it's
diff --git a/src/conn/conn_cache.c b/src/conn/conn_cache.c
index 4d33ac608bb..9f15db5382b 100644
--- a/src/conn/conn_cache.c
+++ b/src/conn/conn_cache.c
@@ -158,9 +158,14 @@ __wt_cache_create(WT_SESSION_IMPL *session, const char *cfg[])
false, 10000, WT_MILLION, &cache->evict_cond));
WT_ERR(__wt_cond_alloc(session,
"eviction waiters", false, &cache->evict_waiter_cond));
+ WT_ERR(__wt_spin_init(session, &cache->evict_pass_lock, "evict pass"));
WT_ERR(__wt_spin_init(session,
&cache->evict_queue_lock, "cache eviction queue"));
WT_ERR(__wt_spin_init(session, &cache->evict_walk_lock, "cache walk"));
+ if ((ret = __wt_open_internal_session(conn, "evict pass",
+ false, WT_SESSION_NO_DATA_HANDLES, &cache->walk_session)) != 0)
+ WT_ERR_MSG(NULL, ret,
+ "Failed to create session for eviction walks");
/* Allocate the LRU eviction queue. */
cache->evict_slots = WT_EVICT_WALK_BASE + WT_EVICT_WALK_INCR;
@@ -223,6 +228,14 @@ __wt_cache_stats_update(WT_SESSION_IMPL *session)
WT_STAT_SET(
session, stats, cache_bytes_overflow, cache->bytes_overflow);
WT_STAT_SET(session, stats, cache_bytes_leaf, leaf);
+
+ /*
+ * The number of files with active walks ~= number of hazard pointers
+ * in the walk session. Note: reading without locking.
+ */
+ if (conn->evict_session != NULL)
+ WT_STAT_SET(session, stats, cache_eviction_walks_active,
+ conn->evict_session->nhazard);
}
/*
@@ -235,6 +248,7 @@ __wt_cache_destroy(WT_SESSION_IMPL *session)
WT_CACHE *cache;
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
+ WT_SESSION *wt_session;
int i;
conn = S2C(session);
@@ -261,8 +275,12 @@ __wt_cache_destroy(WT_SESSION_IMPL *session)
WT_TRET(__wt_cond_auto_destroy(session, &cache->evict_cond));
WT_TRET(__wt_cond_destroy(session, &cache->evict_waiter_cond));
+ __wt_spin_destroy(session, &cache->evict_pass_lock);
__wt_spin_destroy(session, &cache->evict_queue_lock);
__wt_spin_destroy(session, &cache->evict_walk_lock);
+ wt_session = &cache->walk_session->iface;
+ if (wt_session != NULL)
+ WT_TRET(wt_session->close(wt_session, NULL));
for (i = 0; i < WT_EVICT_QUEUE_MAX; ++i) {
__wt_spin_destroy(session, &cache->evict_queues[i].evict_lock);
diff --git a/src/conn/conn_cache_pool.c b/src/conn/conn_cache_pool.c
index 898bd09ece9..75ecb6b3b4a 100644
--- a/src/conn/conn_cache_pool.c
+++ b/src/conn/conn_cache_pool.c
@@ -309,6 +309,7 @@ __wt_conn_cache_pool_destroy(WT_SESSION_IMPL *session)
if (!F_ISSET(conn, WT_CONN_CACHE_POOL))
return (0);
+ F_CLR(conn, WT_CONN_CACHE_POOL);
__wt_spin_lock(session, &cp->cache_pool_lock);
cp_locked = true;
diff --git a/src/conn/conn_dhandle.c b/src/conn/conn_dhandle.c
index 4c2cf9a8dc2..08fb2b24468 100644
--- a/src/conn/conn_dhandle.c
+++ b/src/conn/conn_dhandle.c
@@ -544,6 +544,7 @@ __wt_conn_dhandle_discard_single(
WT_DATA_HANDLE *dhandle;
WT_DECL_RET;
int tret;
+ bool set_pass_intr;
dhandle = session->dhandle;
@@ -562,12 +563,17 @@ __wt_conn_dhandle_discard_single(
* Kludge: interrupt the eviction server in case it is holding the
* handle list lock.
*/
- if (!F_ISSET(session, WT_SESSION_LOCKED_HANDLE_LIST))
- F_SET(S2C(session)->cache, WT_CACHE_CLEAR_WALKS);
+ set_pass_intr = false;
+ if (!F_ISSET(session, WT_SESSION_LOCKED_HANDLE_LIST)) {
+ set_pass_intr = true;
+ (void)__wt_atomic_add32(&S2C(session)->cache->pass_intr, 1);
+ }
/* Try to remove the handle, protected by the data handle lock. */
WT_WITH_HANDLE_LIST_LOCK(session,
tret = __conn_dhandle_remove(session, final));
+ if (set_pass_intr)
+ (void)__wt_atomic_sub32(&S2C(session)->cache->pass_intr, 1);
WT_TRET(tret);
/*
diff --git a/src/conn/conn_log.c b/src/conn/conn_log.c
index 5397962bc4f..1ae370ef2fa 100644
--- a/src/conn/conn_log.c
+++ b/src/conn/conn_log.c
@@ -544,8 +544,6 @@ restart:
while (i < WT_SLOT_POOL) {
save_i = i;
slot = &log->slot_pool[i++];
- WT_ASSERT(session, slot->slot_state != 0 ||
- slot->slot_release_lsn.l.file >= log->write_lsn.l.file);
if (slot->slot_state != WT_LOG_SLOT_WRITTEN)
continue;
written[written_i].slot_index = save_i;
diff --git a/src/conn/conn_open.c b/src/conn/conn_open.c
index f5722d343f7..9c978fed843 100644
--- a/src/conn/conn_open.c
+++ b/src/conn/conn_open.c
@@ -93,7 +93,8 @@ __wt_connection_close(WT_CONNECTION_IMPL *conn)
* transaction ID will catch up with the current ID.
*/
for (;;) {
- WT_TRET(__wt_txn_update_oldest(session, true));
+ WT_TRET(__wt_txn_update_oldest(session,
+ WT_TXN_OLDEST_STRICT | WT_TXN_OLDEST_WAIT));
if (txn_global->oldest_id == txn_global->current)
break;
__wt_yield();