summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2021-01-06 22:25:36 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-01-08 17:45:21 +0000
commit455bdbb8bcc2166a14fe009d28e71ee6bf4de59e (patch)
tree6d56213aaf8a43ef504c4e98193cf97f295fdf89
parent8a6a9474d76c420f3254cbdb9c1dfa7949098fc8 (diff)
downloadmongo-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.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() {