summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuhong Zhang <yuhong.zhang@mongodb.com>2022-03-28 13:20:31 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-15 20:57:30 +0000
commit1359075515532b245d0b77717b6ee13cbc268d97 (patch)
tree35f5827b56e7fd9951a47707d53f46a0fd978311
parent8892b1ffdf09c07f70dec3d71d3770f6cd53e8b2 (diff)
downloadmongo-1359075515532b245d0b77717b6ee13cbc268d97.tar.gz
SERVER-55173 Skip releasing cursors during shutdown to avoid segmentation fault
(cherry picked from commit bc940d6b0adc9254b62e9daf9c92d2c92f8b083d)
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp8
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache_test.cpp15
2 files changed, 22 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 b7bd5322766..d7997dee2c5 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
@@ -137,6 +137,11 @@ WT_CURSOR* WiredTigerSession::getNewCursor(const std::string& uri, const char* c
}
void WiredTigerSession::releaseCursor(uint64_t id, WT_CURSOR* cursor, const std::string& config) {
+ // Avoids the cursor already being destroyed during the shutdown.
+ if (_cache->isShuttingDown()) {
+ return;
+ }
+
invariant(_session);
invariant(cursor);
_cursorsOut--;
@@ -478,7 +483,8 @@ UniqueWiredTigerSession WiredTigerSessionCache::getSession() {
void WiredTigerSessionCache::releaseSession(WiredTigerSession* session) {
invariant(session);
- invariant(session->cursorsOut() == 0);
+ // We might have skipped releasing some cursors during the shutdown.
+ invariant(session->cursorsOut() == 0 || isShuttingDown());
const int shuttingDown = _shuttingDown.fetchAndAdd(1);
ON_BLOCK_EXIT([this] { _shuttingDown.fetchAndSubtract(1); });
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache_test.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache_test.cpp
index d85f5056d07..de95fcce0e7 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache_test.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache_test.cpp
@@ -114,4 +114,19 @@ TEST(WiredTigerSessionCacheTest, CheckSessionCacheCleanup) {
ASSERT_EQUALS(sessionCache->getIdleSessionsCount(), 0U);
}
+TEST(WiredTigerSessionCacheTest, ReleaseCursorDuringShutdown) {
+ WiredTigerSessionCacheHarnessHelper harnessHelper("");
+ WiredTigerSessionCache* sessionCache = harnessHelper.getSessionCache();
+ UniqueWiredTigerSession session = sessionCache->getSession();
+ // Simulates the cursor already being deleted during shutdown.
+ WT_CURSOR* cursor = nullptr;
+
+ sessionCache->shuttingDown();
+ ASSERT(sessionCache->isShuttingDown());
+
+ auto tableIdWeDontCareAbout = WiredTigerSession::genTableId();
+ // Skips actually trying to release the cursor to avoid the segmentation fault.
+ session->releaseCursor(tableIdWeDontCareAbout, cursor, "");
+}
+
} // namespace mongo