summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2021-04-07 10:51:30 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-04-07 15:34:27 +0000
commit4a3fb620ac72e380c42e215c74045bee60e16066 (patch)
treeba6df3f59eeabbeb727cd6f45820c3ff26a87b53 /src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
parenta1379caecbce080899d6524f7bf4d596379d0e70 (diff)
downloadmongo-4a3fb620ac72e380c42e215c74045bee60e16066.tar.gz
SERVER-55681 Clustered collections should reject duplicate _id values
The WiredTigerSessionCache should not mix cursors with different overwrite settings.
Diffstat (limited to 'src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp')
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
index 2f280c159c0..a627dd65d5b 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp
@@ -111,10 +111,13 @@ void _openCursor(WT_SESSION* session,
}
} // namespace
-WT_CURSOR* WiredTigerSession::getCachedCursor(const std::string& uri, uint64_t id) {
+WT_CURSOR* WiredTigerSession::getCachedCursor(uint64_t id, const std::string& config) {
// Find the most recently used cursor
for (CursorCache::iterator i = _cursors.begin(); i != _cursors.end(); ++i) {
- if (i->_id == id) {
+ // Ensure that all properties of this cursor are identical to avoid mixing cursor
+ // configurations. Note that this uses an exact string match, so cursor configurations with
+ // parameters in different orders will not be considered equivalent.
+ if (i->_id == id && i->_config == config) {
WT_CURSOR* c = i->_cursor;
_cursors.erase(i);
_cursorsOut++;
@@ -131,7 +134,7 @@ WT_CURSOR* WiredTigerSession::getNewCursor(const std::string& uri, const char* c
return cursor;
}
-void WiredTigerSession::releaseCursor(uint64_t id, WT_CURSOR* cursor) {
+void WiredTigerSession::releaseCursor(uint64_t id, WT_CURSOR* cursor, const std::string& config) {
invariant(_session);
invariant(cursor);
_cursorsOut--;
@@ -139,7 +142,7 @@ void WiredTigerSession::releaseCursor(uint64_t id, WT_CURSOR* cursor) {
invariantWTOK(cursor->reset(cursor));
// Cursors are pushed to the front of the list and removed from the back
- _cursors.push_front(WiredTigerCachedCursor(id, _cursorGen++, cursor));
+ _cursors.push_front(WiredTigerCachedCursor(id, _cursorGen++, cursor, config));
// A negative value for wiredTigercursorCacheSize means to use hybrid caching.
std::uint32_t cacheSize = abs(gWiredTigerCursorCacheSize.load());