diff options
-rw-r--r-- | src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp | 10 |
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() { |