summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
index b86748b09f1..c80ac13d70b 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
@@ -348,6 +348,8 @@ void WiredTigerSessionCache::closeExpiredIdleSessions(int64_t idleTimeMillis) {
}
auto cutoffTime = _clockSource->now() - Milliseconds(idleTimeMillis);
+ SessionCache sessionsToClose;
+
{
stdx::lock_guard<Latch> lock(_cacheLock);
// Discard all sessions that became idle before the cutoff time
@@ -356,12 +358,18 @@ void WiredTigerSessionCache::closeExpiredIdleSessions(int64_t idleTimeMillis) {
invariant(session->getIdleExpireTime() != Date_t::min());
if (session->getIdleExpireTime() < cutoffTime) {
it = _sessions.erase(it);
- delete (session);
+ sessionsToClose.push_back(session);
} else {
++it;
}
}
}
+
+ // Closing expired idle sessions is expensive, so do it outside of the cache mutex. This helps
+ // to avoid periodic operation latency spikes as seen in SERVER-52879.
+ for (auto session : sessionsToClose) {
+ delete session;
+ }
}
void WiredTigerSessionCache::closeAll() {