diff options
author | Louis Williams <louis.williams@mongodb.com> | 2021-04-07 10:51:30 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-04-07 15:34:27 +0000 |
commit | 4a3fb620ac72e380c42e215c74045bee60e16066 (patch) | |
tree | ba6df3f59eeabbeb727cd6f45820c3ff26a87b53 /src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp | |
parent | a1379caecbce080899d6524f7bf4d596379d0e70 (diff) | |
download | mongo-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.cpp | 11 |
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()); |