summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Anderson <dda@mongodb.com>2017-10-31 13:54:10 -0400
committerDon Anderson <dda@mongodb.com>2017-10-31 13:54:10 -0400
commit2a8818d4fd7b833b82997c9996aca9eb14471f09 (patch)
tree208ebf9c6a6507aad3616e4e4ebb767a321ca9b7
parentefd028178dbf938a9f52abf6e9434dea6aa508e3 (diff)
downloadmongo-2a8818d4fd7b833b82997c9996aca9eb14471f09.tar.gz
SERVER-31590 Release unused cursors in the cache before awaiting oplog deletion
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp4
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp7
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h6
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp3
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h8
5 files changed, 24 insertions, 4 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
index 8a81f75b559..eadf2910eb1 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_record_store.cpp
@@ -1034,7 +1034,9 @@ bool WiredTigerRecordStore::yieldAndAwaitOplogDeletionRequest(OperationContext*
// The top-level locks were freed, so also release any potential low-level (storage engine)
// locks that might be held.
- opCtx->recoveryUnit()->abandonSnapshot();
+ WiredTigerRecoveryUnit* recoveryUnit = (WiredTigerRecoveryUnit*)opCtx->recoveryUnit();
+ recoveryUnit->abandonSnapshot();
+ recoveryUnit->beginIdle();
// Wait for an oplog deletion request, or for this record store to have been destroyed.
oplogStones->awaitHasExcessStonesOrDead();
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp
index 8ef94e8ff97..8be67c449a5 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.cpp
@@ -294,6 +294,13 @@ void WiredTigerRecoveryUnit::setIsOplogReader() {
_isOplogReader = true;
}
+void WiredTigerRecoveryUnit::beginIdle() {
+ // Close all cursors, we don't want to keep any old cached cursors around.
+ if (_session) {
+ _session->closeAllCursors("");
+ }
+}
+
// ---------------------
WiredTigerCursor::WiredTigerCursor(const std::string& uri,
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h
index 4b815539e00..397d17a142b 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_recovery_unit.h
@@ -94,6 +94,12 @@ public:
void setIsOplogReader();
/**
+ * Enter a period of wait or computation during which there are no WT calls.
+ * Any non-relevant cached handles can be closed.
+ */
+ void beginIdle();
+
+ /**
* Returns a session without starting a new WT txn on the session. Will not close any already
* running session.
*/
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
index fdffe30c5e2..11cd1594b02 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
@@ -127,9 +127,10 @@ void WiredTigerSession::releaseCursor(uint64_t id, WT_CURSOR* cursor) {
void WiredTigerSession::closeAllCursors(const std::string& uri) {
invariant(_session);
+ bool all = (uri == "");
for (auto i = _cursors.begin(); i != _cursors.end();) {
WT_CURSOR* cursor = i->_cursor;
- if (cursor && uri == cursor->uri) {
+ if (cursor && (all || uri == cursor->uri)) {
invariantWTOK(cursor->close(cursor));
i = _cursors.erase(i);
} else
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h
index 80fa93016c7..5f8045ee2de 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.h
@@ -98,6 +98,10 @@ public:
void closeCursorsForQueuedDrops(WiredTigerKVEngine* engine);
+ /**
+ * Closes all cached cursors matching the uri. If the uri is empty,
+ * all cached cursors are closed.
+ */
void closeAllCursors(const std::string& uri);
int cursorsOut() const {
@@ -173,8 +177,8 @@ public:
void closeCursorsForQueuedDrops();
/**
- * Closes all cached cursors and ensures that previously opened cursors will be closed on
- * release.
+ * Closes all cached cursors matching the uri. If the uri is empty,
+ * all cached cursors are closed.
*/
void closeAllCursors(const std::string& uri);