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-19 03:35:51 +0000
commit71b0968070ba18cb59f285f3e0c007e935599d59 (patch)
tree270935640e4141256b22b18075566f4ed21ce7d2
parent11447c14258fe449777b918ae6622e04ed34362e (diff)
downloadmongo-71b0968070ba18cb59f285f3e0c007e935599d59.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 a627dd65d5b..dec3ca6a29e 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
@@ -135,6 +135,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--;
@@ -473,7 +478,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 a894d189afb..a71110a7cdd 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