summaryrefslogtreecommitdiff
path: root/src/session/session_dhandle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/session/session_dhandle.c')
-rw-r--r--src/session/session_dhandle.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/session/session_dhandle.c b/src/session/session_dhandle.c
index 95fb6a6f90e..dd2b6ef30ff 100644
--- a/src/session/session_dhandle.c
+++ b/src/session/session_dhandle.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2014-2017 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
@@ -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;
@@ -261,8 +262,8 @@ __wt_session_release_btree(WT_SESSION_IMPL *session)
* can get a handle without special flags.
*/
if (F_ISSET(dhandle, WT_DHANDLE_DISCARD | WT_DHANDLE_DISCARD_FORCE)) {
- __session_find_dhandle(session,
- dhandle->name, dhandle->checkpoint, &dhandle_cache);
+ WT_SAVE_DHANDLE(session, __session_find_dhandle(session,
+ dhandle->name, dhandle->checkpoint, &dhandle_cache));
if (dhandle_cache != NULL)
__session_discard_dhandle(session, dhandle_cache);
}
@@ -369,10 +370,12 @@ retry: WT_RET(__wt_meta_checkpoint_last_name(
void
__wt_session_close_cache(WT_SESSION_IMPL *session)
{
- WT_DATA_HANDLE_CACHE *dhandle_cache;
+ WT_DATA_HANDLE_CACHE *dhandle_cache, *dhandle_cache_tmp;
- while ((dhandle_cache = TAILQ_FIRST(&session->dhandles)) != NULL)
+ WT_TAILQ_SAFE_REMOVE_BEGIN(dhandle_cache,
+ &session->dhandles, q, dhandle_cache_tmp) {
__session_discard_dhandle(session, dhandle_cache);
+ } WT_TAILQ_SAFE_REMOVE_END
}
/*
@@ -384,7 +387,7 @@ __session_dhandle_sweep(WT_SESSION_IMPL *session)
{
WT_CONNECTION_IMPL *conn;
WT_DATA_HANDLE *dhandle;
- WT_DATA_HANDLE_CACHE *dhandle_cache, *dhandle_cache_next;
+ WT_DATA_HANDLE_CACHE *dhandle_cache, *dhandle_cache_tmp;
time_t now;
conn = S2C(session);
@@ -400,9 +403,8 @@ __session_dhandle_sweep(WT_SESSION_IMPL *session)
WT_STAT_CONN_INCR(session, dh_session_sweeps);
- dhandle_cache = TAILQ_FIRST(&session->dhandles);
- while (dhandle_cache != NULL) {
- dhandle_cache_next = TAILQ_NEXT(dhandle_cache, q);
+ TAILQ_FOREACH_SAFE(dhandle_cache,
+ &session->dhandles, q, dhandle_cache_tmp) {
dhandle = dhandle_cache->dhandle;
if (dhandle != session->dhandle &&
dhandle->session_inuse == 0 &&
@@ -414,7 +416,6 @@ __session_dhandle_sweep(WT_SESSION_IMPL *session)
WT_ASSERT(session, !WT_IS_METADATA(dhandle));
__session_discard_dhandle(session, dhandle_cache);
}
- dhandle_cache = dhandle_cache_next;
}
}