diff options
author | Henrik Edin <henrik.edin@mongodb.com> | 2020-10-23 10:04:36 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-11-17 22:51:50 +0000 |
commit | 289b22035a4f7ebad120fedda30458bb3b74665b (patch) | |
tree | ab25572e53c44ccefbe1aeef2144739374e079cb /src/mongo/db/db_raii.h | |
parent | 92cc84b0171942375ccbd2312a052bc7e9f159dd (diff) | |
download | mongo-289b22035a4f7ebad120fedda30458bb3b74665b.tar.gz |
SERVER-50870 Establish consistent storage snapshot with the refreshed Collection after yielding
Diffstat (limited to 'src/mongo/db/db_raii.h')
-rw-r--r-- | src/mongo/db/db_raii.h | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/src/mongo/db/db_raii.h b/src/mongo/db/db_raii.h index d8d7a0a3390..57c8d8a1753 100644 --- a/src/mongo/db/db_raii.h +++ b/src/mongo/db/db_raii.h @@ -84,17 +84,18 @@ private: const LogMode _logMode; }; -template <typename AutoGetCollectionType> +/** + * Shared base class for AutoGetCollectionForRead and AutoGetCollectionForReadLockFree. + * Do not use directly. + */ +template <typename AutoGetCollectionType, typename EmplaceAutoGetCollectionFunc> class AutoGetCollectionForReadBase { AutoGetCollectionForReadBase(const AutoGetCollectionForReadBase&) = delete; AutoGetCollectionForReadBase& operator=(const AutoGetCollectionForReadBase&) = delete; public: - AutoGetCollectionForReadBase( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max()); + AutoGetCollectionForReadBase(OperationContext* opCtx, + const EmplaceAutoGetCollectionFunc& emplaceAutoColl); explicit operator bool() const { return static_cast<bool>(getCollection()); @@ -133,6 +134,27 @@ protected: }; /** + * Helper for AutoGetCollectionForRead below. Contains implementation on how contained + * AutoGetCollection is instantiated by AutoGetCollectionForReadBase. + */ +class EmplaceAutoGetCollectionForRead { +public: + EmplaceAutoGetCollectionForRead(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollectionViewMode viewMode, + Date_t deadline); + + void emplace(boost::optional<AutoGetCollection>& autoColl) const; + +private: + OperationContext* _opCtx; + const NamespaceStringOrUUID& _nsOrUUID; + AutoGetCollectionViewMode _viewMode; + Date_t _deadline; + LockMode _collectionLockMode; +}; + +/** * Same as calling AutoGetCollection with MODE_IS, but in addition ensures that the read will be * performed against an appropriately committed snapshot if the operation is using a readConcern of * 'majority'. @@ -144,14 +166,14 @@ protected: * NOTE: Must not be used with any locks held, because it needs to block waiting on the committed * snapshot to become available, and can potentially release and reacquire locks. */ -class AutoGetCollectionForRead : public AutoGetCollectionForReadBase<AutoGetCollection> { +class AutoGetCollectionForRead + : public AutoGetCollectionForReadBase<AutoGetCollection, EmplaceAutoGetCollectionForRead> { public: AutoGetCollectionForRead( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max()) - : AutoGetCollectionForReadBase(opCtx, nsOrUUID, viewMode, deadline) {} + Date_t deadline = Date_t::max()); Database* getDb() const { return _autoColl->getDb(); @@ -196,7 +218,28 @@ public: } private: - boost::optional<AutoGetCollectionForReadBase<AutoGetCollectionLockFree>> + /** + * Helper for how AutoGetCollectionForReadBase instantiates its owned AutoGetCollectionLockFree. + */ + class EmplaceHelper { + public: + EmplaceHelper(OperationContext* opCtx, + CollectionCatalogStasher& catalogStasher, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollectionViewMode viewMode, + Date_t deadline); + + void emplace(boost::optional<AutoGetCollectionLockFree>& autoColl) const; + + private: + OperationContext* _opCtx; + CollectionCatalogStasher& _catalogStasher; + const NamespaceStringOrUUID& _nsOrUUID; + AutoGetCollectionViewMode _viewMode; + Date_t _deadline; + }; + + boost::optional<AutoGetCollectionForReadBase<AutoGetCollectionLockFree, EmplaceHelper>> _autoGetCollectionForReadBase; CollectionCatalogStasher _catalogStash; }; |