diff options
author | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2021-01-06 22:25:36 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-01-08 17:45:21 +0000 |
commit | 455bdbb8bcc2166a14fe009d28e71ee6bf4de59e (patch) | |
tree | 6d56213aaf8a43ef504c4e98193cf97f295fdf89 | |
parent | 8a6a9474d76c420f3254cbdb9c1dfa7949098fc8 (diff) | |
download | mongo-455bdbb8bcc2166a14fe009d28e71ee6bf4de59e.tar.gz |
SERVER-52879 Close expired idle sessions outside of the cache mutex
(cherry picked from commit d517928d5b34e5988eea9fc15e1c2db4c3ff8d77)
-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() { |