diff options
author | Faustoleyva54 <fausto.leyva@mongodb.com> | 2022-09-15 15:43:58 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-09-15 18:38:41 +0000 |
commit | 881ad6801b77be9529baf34f421d05f5a7ccaca4 (patch) | |
tree | 2c19b1d8d7f85f50cf8d399e461af5f51e3c56b2 /src/mongo/db | |
parent | d1a117a1abc9ead34fc6399697055a46ca0c1df4 (diff) | |
download | mongo-881ad6801b77be9529baf34f421d05f5a7ccaca4.tar.gz |
SERVER-68336 Add version of AutoGetCollection which takes a struct for its optional parameters
Diffstat (limited to 'src/mongo/db')
37 files changed, 351 insertions, 300 deletions
diff --git a/src/mongo/db/catalog/coll_mod.cpp b/src/mongo/db/catalog/coll_mod.cpp index a0e073bb098..92dce59316a 100644 --- a/src/mongo/db/catalog/coll_mod.cpp +++ b/src/mongo/db/catalog/coll_mod.cpp @@ -700,7 +700,11 @@ Status _collModInternal(OperationContext* opCtx, return cmd.getIndex() && cmd.getIndex()->getUnique().value_or(false) && !mode; }); - AutoGetCollection coll(opCtx, nsOrUUID, MODE_X, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection coll( + opCtx, + nsOrUUID, + MODE_X, + AutoGetCollection::Options{}.viewMode(auto_get_collection::ViewMode::kViewsPermitted)); auto nss = coll.getNss(); StringData dbName = nss.db(); Lock::CollectionLock systemViewsLock( diff --git a/src/mongo/db/catalog/create_collection.cpp b/src/mongo/db/catalog/create_collection.cpp index f157f2e62c6..3fe61d50d3f 100644 --- a/src/mongo/db/catalog/create_collection.cpp +++ b/src/mongo/db/catalog/create_collection.cpp @@ -416,7 +416,11 @@ Status _createTimeseries(OperationContext* opCtx, return ret; ret = writeConflictRetry(opCtx, "create", ns.ns(), [&]() -> Status { - AutoGetCollection autoColl(opCtx, ns, MODE_IX, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection autoColl( + opCtx, + ns, + MODE_IX, + AutoGetCollection::Options{}.viewMode(auto_get_collection::ViewMode::kViewsPermitted)); Lock::CollectionLock systemDotViewsLock( opCtx, NamespaceString(ns.db(), NamespaceString::kSystemDotViewsCollectionName), diff --git a/src/mongo/db/catalog/database_test.cpp b/src/mongo/db/catalog/database_test.cpp index 0b0200a7bf9..4a2d94e8935 100644 --- a/src/mongo/db/catalog/database_test.cpp +++ b/src/mongo/db/catalog/database_test.cpp @@ -443,7 +443,7 @@ TEST_F(DatabaseTest, AutoGetCollectionForReadCommandSucceedsWithDeadlineNow) { ASSERT(_opCtx.get()->lockState()->isCollectionLockedForMode(nss, MODE_X)); try { AutoGetCollectionForReadCommand db( - _opCtx.get(), nss, AutoGetCollectionViewMode::kViewsForbidden, Date_t::now()); + _opCtx.get(), nss, auto_get_collection::ViewMode::kViewsForbidden, Date_t::now()); } catch (const ExceptionFor<ErrorCodes::LockTimeout>&) { FAIL("Should get the db within the timeout"); } @@ -457,7 +457,7 @@ TEST_F(DatabaseTest, AutoGetCollectionForReadCommandSucceedsWithDeadlineMin) { ASSERT(_opCtx.get()->lockState()->isCollectionLockedForMode(nss, MODE_X)); try { AutoGetCollectionForReadCommand db( - _opCtx.get(), nss, AutoGetCollectionViewMode::kViewsForbidden, Date_t()); + _opCtx.get(), nss, auto_get_collection::ViewMode::kViewsForbidden, Date_t()); } catch (const ExceptionFor<ErrorCodes::LockTimeout>&) { FAIL("Should get the db within the timeout"); } diff --git a/src/mongo/db/catalog/rename_collection.cpp b/src/mongo/db/catalog/rename_collection.cpp index 8d7e315cb25..eaeca865775 100644 --- a/src/mongo/db/catalog/rename_collection.cpp +++ b/src/mongo/db/catalog/rename_collection.cpp @@ -958,7 +958,9 @@ Status renameCollectionForApplyOps(OperationContext* opCtx, // Take global IX lock explicitly to avoid upgrading from IS later Lock::GlobalLock globalLock(opCtx, MODE_IX); AutoGetCollectionForRead sourceColl( - opCtx, sourceNss, AutoGetCollectionViewMode::kViewsPermitted); + opCtx, + sourceNss, + AutoGetCollection::Options{}.viewMode(auto_get_collection::ViewMode::kViewsPermitted)); if (sourceNss.isDropPendingNamespace() || !sourceColl) { boost::optional<NamespaceString> dropTargetNss; diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp index a02ae9838cc..3197c370cea 100644 --- a/src/mongo/db/catalog_raii.cpp +++ b/src/mongo/db/catalog_raii.cpp @@ -195,13 +195,15 @@ Database* AutoGetDb::ensureDbExists(OperationContext* opCtx) { return _db; } -AutoGetCollection::AutoGetCollection( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - LockMode modeColl, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) { +AutoGetCollection::AutoGetCollection(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + LockMode modeColl, + Options options) { + + auto& viewMode = options._viewMode; + auto& deadline = options._deadline; + auto& secondaryNssOrUUIDs = options._secondaryNssOrUUIDs; + invariant(!opCtx->isLockFreeReadsOp()); // Acquire the global/RSTL and all the database locks (may or may not be multiple @@ -284,12 +286,12 @@ AutoGetCollection::AutoGetCollection( uassert(ErrorCodes::CommandNotSupportedOnView, str::stream() << "Taking " << _resolvedNss.ns() << " lock for timeseries is not allowed", - viewMode == AutoGetCollectionViewMode::kViewsPermitted || !_view->timeseries()); + viewMode == auto_get_collection::ViewMode::kViewsPermitted || !_view->timeseries()); uassert(ErrorCodes::CommandNotSupportedOnView, str::stream() << "Namespace " << _resolvedNss.ns() << " is a view, not a collection", - viewMode == AutoGetCollectionViewMode::kViewsPermitted); + viewMode == auto_get_collection::ViewMode::kViewsPermitted); uassert(StaleConfigInfo(_resolvedNss, *receivedShardVersion, @@ -357,11 +359,15 @@ Collection* AutoGetCollection::getWritableCollection(OperationContext* opCtx) { AutoGetCollectionLockFree::AutoGetCollectionLockFree(OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, RestoreFromYieldFn restoreFromYield, - AutoGetCollectionViewMode viewMode, - Date_t deadline) + Options options) : _lockFreeReadsBlock(opCtx), - _globalLock( - opCtx, MODE_IS, deadline, Lock::InterruptBehavior::kThrow, true /* skipRSTLLock */) { + _globalLock(opCtx, + MODE_IS, + options._deadline, + Lock::InterruptBehavior::kThrow, + true /* skipRSTLLock */) { + + auto& viewMode = options._viewMode; // Wait for a configured amount of time after acquiring locks if the failpoint is enabled setAutoGetCollectionWait.execute( @@ -409,13 +415,14 @@ AutoGetCollectionLockFree::AutoGetCollectionLockFree(OperationContext* opCtx, } _view = catalog->lookupView(opCtx, _resolvedNss); - uassert( - ErrorCodes::CommandNotSupportedOnView, - str::stream() << "Taking " << _resolvedNss.ns() << " lock for timeseries is not allowed", - !_view || viewMode == AutoGetCollectionViewMode::kViewsPermitted || !_view->timeseries()); + uassert(ErrorCodes::CommandNotSupportedOnView, + str::stream() << "Taking " << _resolvedNss.ns() + << " lock for timeseries is not allowed", + !_view || viewMode == auto_get_collection::ViewMode::kViewsPermitted || + !_view->timeseries()); uassert(ErrorCodes::CommandNotSupportedOnView, str::stream() << "Namespace " << _resolvedNss.ns() << " is a view, not a collection", - !_view || viewMode == AutoGetCollectionViewMode::kViewsPermitted); + !_view || viewMode == auto_get_collection::ViewMode::kViewsPermitted); if (_view) { // We are about to succeed setup as a view. No LockFree state was setup so do not mark the // OperationContext as LFR. @@ -427,7 +434,7 @@ AutoGetCollectionMaybeLockFree::AutoGetCollectionMaybeLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, LockMode modeColl, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline) { if (opCtx->isLockFreeReadsOp()) { _autoGetLockFree.emplace( @@ -438,10 +445,12 @@ AutoGetCollectionMaybeLockFree::AutoGetCollectionMaybeLockFree( "This is a nested lock helper and there was an attempt to " "yield locks, which should be impossible"); }, - viewMode, - deadline); + AutoGetCollectionLockFree::Options{}.viewMode(viewMode).deadline(deadline)); } else { - _autoGet.emplace(opCtx, nsOrUUID, modeColl, viewMode, deadline); + _autoGet.emplace(opCtx, + nsOrUUID, + modeColl, + AutoGetCollection::Options{}.viewMode(viewMode).deadline(deadline)); } } @@ -591,8 +600,7 @@ AutoGetChangeCollection::AutoGetChangeCollection(OperationContext* opCtx, _coll.emplace(opCtx, NamespaceString::makeChangeCollectionNSS(tenantId), mode == AccessMode::kRead ? MODE_IS : MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - deadline); + AutoGetCollection::Options{}.deadline(deadline)); } const Collection* AutoGetChangeCollection::operator->() const { diff --git a/src/mongo/db/catalog_raii.h b/src/mongo/db/catalog_raii.h index 3535cb1adc2..6eed6afd845 100644 --- a/src/mongo/db/catalog_raii.h +++ b/src/mongo/db/catalog_raii.h @@ -90,7 +90,36 @@ private: std::vector<Lock::DBLock> _secondaryDbLocks; }; -enum class AutoGetCollectionViewMode { kViewsPermitted, kViewsForbidden }; +namespace auto_get_collection { +enum class ViewMode { kViewsPermitted, kViewsForbidden }; + +template <typename T> +struct OptionsBase { + T viewMode(ViewMode viewMode) { + _viewMode = viewMode; + return std::move(*static_cast<T*>(this)); + } + + T deadline(Date_t deadline) { + _deadline = std::move(deadline); + return std::move(*static_cast<T*>(this)); + } + + ViewMode _viewMode = ViewMode::kViewsForbidden; + Date_t _deadline = Date_t::max(); +}; + +struct Options : OptionsBase<Options> {}; +struct OptionsWithSecondaryCollections : OptionsBase<OptionsWithSecondaryCollections> { + OptionsWithSecondaryCollections secondaryNssOrUUIDs( + std::vector<NamespaceStringOrUUID> secondaryNssOrUUIDs) { + _secondaryNssOrUUIDs = std::move(secondaryNssOrUUIDs); + return std::move(*this); + } + + std::vector<NamespaceStringOrUUID> _secondaryNssOrUUIDs; +}; +} // namespace auto_get_collection /** * RAII-style class, which acquires global, database, and collection locks according to the chart @@ -113,6 +142,8 @@ class AutoGetCollection { AutoGetCollection& operator=(const AutoGetCollection&) = delete; public: + using Options = auto_get_collection::OptionsWithSecondaryCollections; + /** * Collection locks are also acquired for any 'secondaryNssOrUUIDs' namespaces provided. * Collection locks are acquired in ascending ResourceId(RESOURCE_COLLECTION, nss) order to @@ -123,13 +154,10 @@ public: * 'nsOrUUID' to be duplicated in 'secondaryNssOrUUIDs', or 'secondaryNssOrUUIDs' to contain * duplicates. */ - AutoGetCollection( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - LockMode modeColl, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max(), - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); + AutoGetCollection(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + LockMode modeColl, + Options options = {}); explicit operator bool() const { return static_cast<bool>(getCollection()); @@ -233,16 +261,16 @@ public: using RestoreFromYieldFn = std::function<void(std::shared_ptr<const Collection>&, OperationContext*, UUID)>; + using Options = auto_get_collection::Options; + /** * Used by AutoGetCollectionForReadLockFree where it provides implementation for restore after * yield. */ - AutoGetCollectionLockFree( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - RestoreFromYieldFn restoreFromYield, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max()); + AutoGetCollectionLockFree(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + RestoreFromYieldFn restoreFromYield, + Options options = {}); explicit operator bool() const { // Use the CollectionPtr because it is updated if it yields whereas _collection is not until @@ -324,7 +352,7 @@ public: OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, LockMode modeColl, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode viewMode = auto_get_collection::ViewMode::kViewsForbidden, Date_t deadline = Date_t::max()); private: diff --git a/src/mongo/db/catalog_raii_test.cpp b/src/mongo/db/catalog_raii_test.cpp index 645aa903837..c909488b192 100644 --- a/src/mongo/db/catalog_raii_test.cpp +++ b/src/mongo/db/catalog_raii_test.cpp @@ -130,11 +130,11 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionCollLockDeadline) { ASSERT(client1.second->lockState()->isCollectionLockedForMode(nss, MODE_X)); failsWithLockTimeout( [&] { - AutoGetCollection coll(client2.second.get(), - nss, - MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollection coll( + client2.second.get(), + nss, + MODE_X, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -144,11 +144,11 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDBLockDeadline) { ASSERT(client1.second->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); failsWithLockTimeout( [&] { - AutoGetCollection coll(client2.second.get(), - nss, - MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollection coll( + client2.second.get(), + nss, + MODE_X, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -158,11 +158,11 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionGlobalLockDeadline) { ASSERT(client1.second->lockState()->isLocked()); failsWithLockTimeout( [&] { - AutoGetCollection coll(client2.second.get(), - nss, - MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollection coll( + client2.second.get(), + nss, + MODE_X, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -178,8 +178,7 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineNow) { AutoGetCollection coll(client2.second.get(), nss, MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now()); + AutoGetCollection::Options{}.deadline(Date_t::now())); }, Milliseconds(0)); } @@ -192,11 +191,8 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineMin) { failsWithLockTimeout( [&] { - AutoGetCollection coll(client2.second.get(), - nss, - MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t()); + AutoGetCollection coll( + client2.second.get(), nss, MODE_X, AutoGetCollection::Options{}.deadline(Date_t())); }, Milliseconds(0)); } @@ -207,11 +203,11 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionNotCompatibleWithRSTLExclusiveLo failsWithLockTimeout( [&] { - AutoGetCollection coll(client2.second.get(), - nss, - MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollection coll( + client2.second.get(), + nss, + MODE_IX, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -234,9 +230,7 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionSecondaryNamespacesSingleDb) { autoGetColl.emplace(opCtx1, nss, MODE_IS, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNamespaces); + AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNamespaces)); ASSERT(opCtx1->lockState()->isRSTLLocked()); ASSERT(opCtx1->lockState()->isReadLocked()); // Global lock check @@ -272,9 +266,7 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionMultiNamespacesMODEIX) { autoGetColl.emplace(opCtx1, nss, MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNamespaces); + AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNamespaces)); ASSERT(opCtx1->lockState()->isRSTLLocked()); ASSERT(opCtx1->lockState()->isWriteLocked()); // Global lock check @@ -337,9 +329,9 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionMultiNssCollLockDeadline) { AutoGetCollection coll(client2.second.get(), nss, MODE_IS, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs, - secondaryNamespacesConflict); + AutoGetCollection::Options{} + .deadline(Date_t::now() + timeoutMs) + .secondaryNssOrUUIDs(secondaryNamespacesConflict)); }, timeoutMs); @@ -350,19 +342,18 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionMultiNssCollLockDeadline) { AutoGetCollection collNoConflict(client2.second.get(), nss, MODE_IS, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs, - secondaryNamespacesNoConflict); + AutoGetCollection::Options{} + .deadline(Date_t::now() + timeoutMs) + .secondaryNssOrUUIDs(secondaryNamespacesNoConflict)); } // Now without the MODE_X lock on kSecondaryNss1, should work fine. autoGetCollWithXLock.reset(); - AutoGetCollection coll(client2.second.get(), - nss, - MODE_IS, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNamespacesConflict); + AutoGetCollection coll( + client2.second.get(), + nss, + MODE_IS, + AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNamespacesConflict)); } TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeGlobalLockDeadline) { @@ -374,8 +365,7 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionLockFreeGlobalLockDeadline) { client2.second.get(), nss, [](std::shared_ptr<const Collection>&, OperationContext*, UUID) {}, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollectionLockFree::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } diff --git a/src/mongo/db/commands/count_cmd.cpp b/src/mongo/db/commands/count_cmd.cpp index 5eeffc217b4..522df5047e6 100644 --- a/src/mongo/db/commands/count_cmd.cpp +++ b/src/mongo/db/commands/count_cmd.cpp @@ -156,7 +156,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsCollectionRequired(dbName, cmdObj), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto nss = ctx->getNss(); CountCommandRequest request(NamespaceStringOrUUID(NamespaceString{})); @@ -237,7 +237,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsOrUUID(dbName, cmdObj), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto& nss = ctx->getNss(); CurOpFailpointHelpers::waitWhileFailPointEnabled( diff --git a/src/mongo/db/commands/dbcheck.cpp b/src/mongo/db/commands/dbcheck.cpp index a27c4e6a141..9eaa51fe1b6 100644 --- a/src/mongo/db/commands/dbcheck.cpp +++ b/src/mongo/db/commands/dbcheck.cpp @@ -509,11 +509,8 @@ private: auto const lockDeadline = Date_t::now() + timeoutMs; timeoutMs *= 2; - AutoGetCollection agc(opCtx, - info.nss, - lockMode, - AutoGetCollectionViewMode::kViewsForbidden, - lockDeadline); + AutoGetCollection agc( + opCtx, info.nss, lockMode, AutoGetCollection::Options{}.deadline(lockDeadline)); if (_stepdownHasOccurred(opCtx, info.nss)) { _done = true; diff --git a/src/mongo/db/commands/distinct.cpp b/src/mongo/db/commands/distinct.cpp index 542f4e773b6..1895281af59 100644 --- a/src/mongo/db/commands/distinct.cpp +++ b/src/mongo/db/commands/distinct.cpp @@ -154,7 +154,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsCollectionRequired(dbName, cmdObj), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto nss = ctx->getNss(); const ExtensionsCallbackReal extensionsCallback(opCtx, &nss); @@ -208,7 +208,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsOrUUID(dbName, cmdObj), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto& nss = ctx->getNss(); if (!ctx->getView()) { diff --git a/src/mongo/db/commands/find_cmd.cpp b/src/mongo/db/commands/find_cmd.cpp index ba45ad6b615..c3d62936a84 100644 --- a/src/mongo/db/commands/find_cmd.cpp +++ b/src/mongo/db/commands/find_cmd.cpp @@ -288,7 +288,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsCollectionRequired(_dbName, _request.body), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto nss = ctx->getNss(); // Going forward this operation must never ignore interrupt signals while waiting for @@ -473,7 +473,7 @@ public: boost::optional<AutoGetCollectionForReadCommandMaybeLockFree> ctx; ctx.emplace(opCtx, CommandHelpers::parseNsOrUUID(_dbName, _request.body), - AutoGetCollectionViewMode::kViewsPermitted); + auto_get_collection::ViewMode::kViewsPermitted); const auto& nss = ctx->getNss(); // Going forward this operation must never ignore interrupt signals while waiting for diff --git a/src/mongo/db/commands/getmore_cmd.cpp b/src/mongo/db/commands/getmore_cmd.cpp index 7ea168e4ade..17edcdd837c 100644 --- a/src/mongo/db/commands/getmore_cmd.cpp +++ b/src/mongo/db/commands/getmore_cmd.cpp @@ -517,9 +517,8 @@ public: // cursor's executor when constructing 'readLock'. readLock.emplace(opCtx, cursorPin->getExecutor()->nss(), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - cursorPin->getExecutor()->getSecondaryNamespaces()); + AutoGetCollection::Options{}.secondaryNssOrUUIDs( + cursorPin->getExecutor()->getSecondaryNamespaces())); statsTracker.emplace( opCtx, diff --git a/src/mongo/db/commands/map_reduce_agg.cpp b/src/mongo/db/commands/map_reduce_agg.cpp index 1f31ec3c78f..73560f2b1c3 100644 --- a/src/mongo/db/commands/map_reduce_agg.cpp +++ b/src/mongo/db/commands/map_reduce_agg.cpp @@ -69,7 +69,7 @@ auto makeExpressionContext(OperationContext* opCtx, // AutoGetCollectionForReadCommand will throw if the sharding version for this connection is // out of date. AutoGetCollectionForReadCommandMaybeLockFree ctx( - opCtx, parsedMr.getNamespace(), AutoGetCollectionViewMode::kViewsPermitted); + opCtx, parsedMr.getNamespace(), auto_get_collection::ViewMode::kViewsPermitted); uassert(ErrorCodes::CommandNotSupportedOnView, "mapReduce on a view is not supported", !ctx.getView()); diff --git a/src/mongo/db/commands/run_aggregate.cpp b/src/mongo/db/commands/run_aggregate.cpp index b7bd221ec61..273611a4327 100644 --- a/src/mongo/db/commands/run_aggregate.cpp +++ b/src/mongo/db/commands/run_aggregate.cpp @@ -709,7 +709,7 @@ Status runAggregate(OperationContext* opCtx, // must never hold open storage cursors while ignoring interrupt. InterruptibleLockGuard interruptibleLockAcquisition(opCtx->lockState()); - auto initContext = [&](AutoGetCollectionViewMode m) -> void { + auto initContext = [&](auto_get_collection::ViewMode m) -> void { ctx.emplace(opCtx, nss, m, @@ -822,7 +822,7 @@ Status runAggregate(OperationContext* opCtx, collatorToUseMatchesDefault = match; // Obtain collection locks on the execution namespace; that is, the oplog. - initContext(AutoGetCollectionViewMode::kViewsForbidden); + initContext(auto_get_collection::ViewMode::kViewsForbidden); } else if (nss.isCollectionlessAggregateNS() && pipelineInvolvedNamespaces.empty()) { uassert(4928901, str::stream() << AggregateCommandRequest::kCollectionUUIDFieldName @@ -844,7 +844,7 @@ Status runAggregate(OperationContext* opCtx, ctx == boost::none); } else { // This is a regular aggregation. Lock the collection or view. - initContext(AutoGetCollectionViewMode::kViewsPermitted); + initContext(auto_get_collection::ViewMode::kViewsPermitted); auto [collator, match] = PipelineD::resolveCollator(opCtx, request.getCollation().get_value_or(BSONObj()), diff --git a/src/mongo/db/commands/validate_db_metadata_cmd.cpp b/src/mongo/db/commands/validate_db_metadata_cmd.cpp index 3ffeae5e66d..ff51cd3b2d2 100644 --- a/src/mongo/db/commands/validate_db_metadata_cmd.cpp +++ b/src/mongo/db/commands/validate_db_metadata_cmd.cpp @@ -191,8 +191,11 @@ public: auto apiVersion = APIParameters::get(opCtx).getAPIVersion().value_or(""); // We permit views here so that user requested views can be allowed. - AutoGetCollection collection( - opCtx, coll, LockMode::MODE_IS, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection collection(opCtx, + coll, + LockMode::MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); // If it view, just do the validations for view. if (auto viewDef = collection.getView()) { diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp index 1ae023eccbd..1b6585ca0d7 100644 --- a/src/mongo/db/db_raii.cpp +++ b/src/mongo/db/db_raii.cpp @@ -617,32 +617,32 @@ AutoGetCollectionForReadBase<AutoGetCollectionType, EmplaceAutoCollFunc>:: EmplaceAutoGetCollectionForRead::EmplaceAutoGetCollectionForRead( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) + AutoGetCollection::Options options) : _opCtx(opCtx), _nsOrUUID(nsOrUUID), - _viewMode(viewMode), - _deadline(deadline), - _secondaryNssOrUUIDs(secondaryNssOrUUIDs) { + _viewMode(options._viewMode), + _deadline(options._deadline), + _secondaryNssOrUUIDs(std::move(options._secondaryNssOrUUIDs)) { // Multi-document transactions need MODE_IX locks, otherwise MODE_IS. _collectionLockMode = getLockModeForQuery(opCtx, nsOrUUID.nss()); } void EmplaceAutoGetCollectionForRead::emplace(boost::optional<AutoGetCollection>& autoColl) const { autoColl.emplace( - _opCtx, _nsOrUUID, _collectionLockMode, _viewMode, _deadline, _secondaryNssOrUUIDs); + _opCtx, + _nsOrUUID, + _collectionLockMode, + AutoGetCollection::Options{}.viewMode(_viewMode).deadline(_deadline).secondaryNssOrUUIDs( + _secondaryNssOrUUIDs)); } -AutoGetCollectionForRead::AutoGetCollectionForRead( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) +AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollection::Options options) : AutoGetCollectionForReadBase(opCtx, - EmplaceAutoGetCollectionForRead( - opCtx, nsOrUUID, viewMode, deadline, secondaryNssOrUUIDs)) { + EmplaceAutoGetCollectionForRead(opCtx, nsOrUUID, options)) { + auto& secondaryNssOrUUIDs = options._secondaryNssOrUUIDs; + // All relevant locks are held. Check secondary collections and verify they are valid for // use. if (getCollection() && !secondaryNssOrUUIDs.empty()) { @@ -658,7 +658,7 @@ AutoGetCollectionForReadLockFree::EmplaceHelper::EmplaceHelper( OperationContext* opCtx, CollectionCatalogStasher& catalogStasher, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline, bool isLockFreeReadSubOperation) : _opCtx(opCtx), @@ -718,16 +718,13 @@ void AutoGetCollectionForReadLockFree::EmplaceHelper::emplace( // behavior for the primary collection. }); }, - _viewMode, - _deadline); + AutoGetCollectionLockFree::Options{}.viewMode(_viewMode).deadline(_deadline)); } AutoGetCollectionForReadLockFree::AutoGetCollectionForReadLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) + AutoGetCollection::Options options) : _catalogStash(opCtx) { bool isLockFreeReadSubOperation = opCtx->isLockFreeReadsOp(); @@ -737,6 +734,10 @@ AutoGetCollectionForReadLockFree::AutoGetCollectionForReadLockFree( invariant(supportsLockFreeRead(opCtx) && (!opCtx->recoveryUnit()->isActive() || isLockFreeReadSubOperation)); + auto& viewMode = options._viewMode; + auto& deadline = options._deadline; + auto& secondaryNssOrUUIDs = options._secondaryNssOrUUIDs; + EmplaceHelper emplaceFunc( opCtx, _catalogStash, nsOrUUID, viewMode, deadline, isLockFreeReadSubOperation); acquireCollectionAndConsistentSnapshot( @@ -764,13 +765,12 @@ AutoGetCollectionForReadLockFree::AutoGetCollectionForReadLockFree( AutoGetCollectionForReadMaybeLockFree::AutoGetCollectionForReadMaybeLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) { + AutoGetCollection::Options options) { + if (supportsLockFreeRead(opCtx)) { - _autoGetLockFree.emplace(opCtx, nsOrUUID, viewMode, deadline, secondaryNssOrUUIDs); + _autoGetLockFree.emplace(opCtx, nsOrUUID, std::move(options)); } else { - _autoGet.emplace(opCtx, nsOrUUID, viewMode, deadline, secondaryNssOrUUIDs); + _autoGet.emplace(opCtx, nsOrUUID, std::move(options)); } } @@ -811,11 +811,15 @@ AutoGetCollectionForReadCommandBase<AutoGetCollectionForReadType>:: AutoGetCollectionForReadCommandBase( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline, AutoStatsTracker::LogMode logMode, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) - : _autoCollForRead(opCtx, nsOrUUID, viewMode, deadline, secondaryNssOrUUIDs), + : _autoCollForRead( + opCtx, + nsOrUUID, + AutoGetCollection::Options{}.viewMode(viewMode).deadline(deadline).secondaryNssOrUUIDs( + secondaryNssOrUUIDs)), _statsTracker(opCtx, _autoCollForRead.getNss(), Top::LockType::ReadLocked, @@ -842,7 +846,7 @@ AutoGetCollectionForReadCommandBase<AutoGetCollectionForReadType>:: AutoGetCollectionForReadCommandLockFree::AutoGetCollectionForReadCommandLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline, AutoStatsTracker::LogMode logMode, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) { @@ -912,7 +916,7 @@ OldClientContext::OldClientContext(OperationContext* opCtx, AutoGetCollectionForReadCommandMaybeLockFree::AutoGetCollectionForReadCommandMaybeLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline, AutoStatsTracker::LogMode logMode, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs) { diff --git a/src/mongo/db/db_raii.h b/src/mongo/db/db_raii.h index cd3bfa635ee..948a7271823 100644 --- a/src/mongo/db/db_raii.h +++ b/src/mongo/db/db_raii.h @@ -143,16 +143,14 @@ class EmplaceAutoGetCollectionForRead { public: EmplaceAutoGetCollectionForRead(OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, - Date_t deadline, - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs); + AutoGetCollection::Options options = {}); void emplace(boost::optional<AutoGetCollection>& autoColl) const; private: OperationContext* _opCtx; const NamespaceStringOrUUID& _nsOrUUID; - AutoGetCollectionViewMode _viewMode; + auto_get_collection::ViewMode _viewMode; Date_t _deadline; LockMode _collectionLockMode; const std::vector<NamespaceStringOrUUID> _secondaryNssOrUUIDs; @@ -177,12 +175,9 @@ private: class AutoGetCollectionForRead : public AutoGetCollectionForReadBase<AutoGetCollection, EmplaceAutoGetCollectionForRead> { public: - AutoGetCollectionForRead( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max(), - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); + AutoGetCollectionForRead(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollection::Options = {}); /** * Indicates whether any namespace in 'secondaryNssOrUUIDs' is a view or sharded. @@ -205,12 +200,9 @@ private: */ class AutoGetCollectionForReadLockFree { public: - AutoGetCollectionForReadLockFree( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max(), - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); + AutoGetCollectionForReadLockFree(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollection::Options = {}); explicit operator bool() const { return static_cast<bool>(getCollection()); @@ -254,7 +246,7 @@ private: EmplaceHelper(OperationContext* opCtx, CollectionCatalogStasher& catalogStasher, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode, + auto_get_collection::ViewMode viewMode, Date_t deadline, bool isLockFreeReadSubOperation); @@ -264,7 +256,7 @@ private: OperationContext* _opCtx; CollectionCatalogStasher& _catalogStasher; const NamespaceStringOrUUID& _nsOrUUID; - AutoGetCollectionViewMode _viewMode; + auto_get_collection::ViewMode _viewMode; Date_t _deadline; // Set to true if the lock helper using this EmplaceHelper is nested under another lock-free @@ -289,12 +281,9 @@ private: */ class AutoGetCollectionForReadMaybeLockFree { public: - AutoGetCollectionForReadMaybeLockFree( - OperationContext* opCtx, - const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, - Date_t deadline = Date_t::max(), - const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); + AutoGetCollectionForReadMaybeLockFree(OperationContext* opCtx, + const NamespaceStringOrUUID& nsOrUUID, + AutoGetCollection::Options options = {}); /** * Passthrough functions to either _autoGet or _autoGetLockFree. @@ -332,7 +321,7 @@ public: AutoGetCollectionForReadCommandBase( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode viewMode = auto_get_collection::ViewMode::kViewsForbidden, Date_t deadline = Date_t::max(), AutoStatsTracker::LogMode logMode = AutoStatsTracker::LogMode::kUpdateTopAndCurOp, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); @@ -380,7 +369,7 @@ public: AutoGetCollectionForReadCommand( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode viewMode = auto_get_collection::ViewMode::kViewsForbidden, Date_t deadline = Date_t::max(), AutoStatsTracker::LogMode logMode = AutoStatsTracker::LogMode::kUpdateTopAndCurOp, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}) @@ -396,7 +385,7 @@ public: AutoGetCollectionForReadCommandLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode viewMode = auto_get_collection::ViewMode::kViewsForbidden, Date_t deadline = Date_t::max(), AutoStatsTracker::LogMode logMode = AutoStatsTracker::LogMode::kUpdateTopAndCurOp, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); @@ -444,7 +433,7 @@ public: AutoGetCollectionForReadCommandMaybeLockFree( OperationContext* opCtx, const NamespaceStringOrUUID& nsOrUUID, - AutoGetCollectionViewMode viewMode = AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode viewMode = auto_get_collection::ViewMode::kViewsForbidden, Date_t deadline = Date_t::max(), AutoStatsTracker::LogMode logMode = AutoStatsTracker::LogMode::kUpdateTopAndCurOp, const std::vector<NamespaceStringOrUUID>& secondaryNssOrUUIDs = {}); diff --git a/src/mongo/db/db_raii_multi_collection_test.cpp b/src/mongo/db/db_raii_multi_collection_test.cpp index 9fa5b4e9a30..8f3e4820c37 100644 --- a/src/mongo/db/db_raii_multi_collection_test.cpp +++ b/src/mongo/db/db_raii_multi_collection_test.cpp @@ -119,11 +119,10 @@ TEST_F(AutoGetCollectionMultiTest, SecondaryNssMinimumVisibleError) { // Create the AutoGet* instance on multiple collections with _secondaryNss2 and it should throw. std::vector<NamespaceStringOrUUID> secondaryNamespaces{NamespaceStringOrUUID(_secondaryNss2)}; - ASSERT_THROWS_CODE(AutoGetCollectionForRead(opCtx1, - _primaryNss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNamespaces), + ASSERT_THROWS_CODE(AutoGetCollectionForRead( + opCtx1, + _primaryNss, + AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNamespaces)), AssertionException, ErrorCodes::SnapshotUnavailable); @@ -133,11 +132,8 @@ TEST_F(AutoGetCollectionMultiTest, SecondaryNssMinimumVisibleError) { AutoGetCollection secondaryCollection1(opCtx1, _secondaryNss2, MODE_IS); return secondaryCollection1->getMinimumVisibleSnapshot(); }()); - AutoGetCollectionForRead(opCtx1, - _primaryNss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNamespaces); + AutoGetCollectionForRead( + opCtx1, _primaryNss, AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNamespaces)); } TEST_F(AutoGetCollectionMultiTest, LockFreeMultiCollectionSingleDB) { @@ -147,11 +143,10 @@ TEST_F(AutoGetCollectionMultiTest, LockFreeMultiCollectionSingleDB) { invariant(!opCtx1->lockState()->isCollectionLockedForMode(_primaryNss, MODE_IS)); - AutoGetCollectionForReadLockFree autoGet(opCtx1, - NamespaceStringOrUUID(_primaryNss), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - _secondaryNssOrUUIDVec); + AutoGetCollectionForReadLockFree autoGet( + opCtx1, + NamespaceStringOrUUID(_primaryNss), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(_secondaryNssOrUUIDVec)); auto locker = opCtx1->lockState(); locker->dump(); @@ -181,11 +176,10 @@ TEST_F(AutoGetCollectionMultiTest, LockedDuplicateNamespaces) { invariant(!opCtx1->lockState()->isCollectionLockedForMode(_primaryNss, MODE_IS)); - AutoGetCollectionForRead autoGet(opCtx1, - NamespaceStringOrUUID(_primaryNss), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - duplicateNssVector); + AutoGetCollectionForRead autoGet( + opCtx1, + NamespaceStringOrUUID(_primaryNss), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(duplicateNssVector)); auto locker = opCtx1->lockState(); locker->dump(); @@ -208,11 +202,10 @@ TEST_F(AutoGetCollectionMultiTest, LockFreeMultiDBs) { createCollections(opCtx1); - AutoGetCollectionForReadLockFree autoGet(opCtx1, - NamespaceStringOrUUID(_primaryNss), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - _secondaryNssOtherDbNssVec); + AutoGetCollectionForReadLockFree autoGet( + opCtx1, + NamespaceStringOrUUID(_primaryNss), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(_secondaryNssOtherDbNssVec)); auto locker = opCtx1->lockState(); locker->dump(); @@ -235,11 +228,10 @@ TEST_F(AutoGetCollectionMultiTest, LockFreeSecondaryNamespaceNotFoundIsOK) { createCollectionsExceptOneSecondary(opCtx1); - AutoGetCollectionForReadLockFree autoGet(opCtx1, - NamespaceStringOrUUID(_primaryNss), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - _secondaryNssOrUUIDAllVec); + AutoGetCollectionForReadLockFree autoGet( + opCtx1, + NamespaceStringOrUUID(_primaryNss), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(_secondaryNssOrUUIDAllVec)); invariant(opCtx1->lockState()->isLocked()); ASSERT(!CollectionCatalog::get(opCtx1)->lookupCollectionByNamespace(opCtx1, _secondaryNss2)); @@ -250,11 +242,10 @@ TEST_F(AutoGetCollectionMultiTest, LockedSecondaryNamespaceNotFound) { createCollectionsExceptOneSecondary(opCtx1); - AutoGetCollectionForRead autoGet(opCtx1, - NamespaceStringOrUUID(_primaryNss), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - _secondaryNssOrUUIDVec); + AutoGetCollectionForRead autoGet( + opCtx1, + NamespaceStringOrUUID(_primaryNss), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(_secondaryNssOrUUIDVec)); auto locker = opCtx1->lockState(); diff --git a/src/mongo/db/db_raii_test.cpp b/src/mongo/db/db_raii_test.cpp index 5a60b752977..776afdfa0aa 100644 --- a/src/mongo/db/db_raii_test.cpp +++ b/src/mongo/db/db_raii_test.cpp @@ -116,10 +116,10 @@ TEST_F(DBRAIITestFixture, AutoGetCollectionForReadCollLockDeadline) { ASSERT(client1.second->lockState()->isCollectionLockedForMode(nss, MODE_X)); failsWithLockTimeout( [&] { - AutoGetCollectionForRead acfr(client2.second.get(), - nss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollectionForRead acfr( + client2.second.get(), + nss, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -129,10 +129,10 @@ TEST_F(DBRAIITestFixture, AutoGetCollectionForReadDBLockDeadline) { ASSERT(client1.second->lockState()->isDbLockedForMode(nss.dbName(), MODE_X)); failsWithLockTimeout( [&] { - AutoGetCollectionForRead coll(client2.second.get(), - nss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollectionForRead coll( + client2.second.get(), + nss, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -142,10 +142,10 @@ TEST_F(DBRAIITestFixture, AutoGetCollectionForReadGlobalLockDeadline) { ASSERT(client1.second->lockState()->isLocked()); failsWithLockTimeout( [&] { - AutoGetCollectionForRead coll(client2.second.get(), - nss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now() + timeoutMs); + AutoGetCollectionForRead coll( + client2.second.get(), + nss, + AutoGetCollection::Options{}.deadline(Date_t::now() + timeoutMs)); }, timeoutMs); } @@ -158,10 +158,8 @@ TEST_F(DBRAIITestFixture, AutoGetCollectionForReadDeadlineNow) { failsWithLockTimeout( [&] { - AutoGetCollectionForRead coll(client2.second.get(), - nss, - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::now()); + AutoGetCollectionForRead coll( + client2.second.get(), nss, AutoGetCollection::Options{}.deadline(Date_t::now())); }, Milliseconds(0)); } @@ -175,7 +173,7 @@ TEST_F(DBRAIITestFixture, AutoGetCollectionForReadDeadlineMin) { failsWithLockTimeout( [&] { AutoGetCollectionForRead coll( - client2.second.get(), nss, AutoGetCollectionViewMode::kViewsForbidden, Date_t()); + client2.second.get(), nss, AutoGetCollection::Options{}.deadline(Date_t())); }, Milliseconds(0)); } diff --git a/src/mongo/db/pipeline/document_source_cursor.cpp b/src/mongo/db/pipeline/document_source_cursor.cpp index 084274467d9..81e023837b9 100644 --- a/src/mongo/db/pipeline/document_source_cursor.cpp +++ b/src/mongo/db/pipeline/document_source_cursor.cpp @@ -144,11 +144,10 @@ void DocumentSourceCursor::loadBatch() { tassert(5565800, "Expected PlanExecutor to use an external lock policy", _exec->lockPolicy() == PlanExecutor::LockPolicy::kLockExternally); - autoColl.emplace(pExpCtx->opCtx, - _exec->nss(), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - _exec->getSecondaryNamespaces()); + autoColl.emplace( + pExpCtx->opCtx, + _exec->nss(), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(_exec->getSecondaryNamespaces())); uassertStatusOK(repl::ReplicationCoordinator::get(pExpCtx->opCtx) ->checkCanServeReadsFor(pExpCtx->opCtx, _exec->nss(), true)); @@ -227,11 +226,10 @@ Value DocumentSourceCursor::serialize(boost::optional<ExplainOptions::Verbosity> { auto opCtx = pExpCtx->opCtx; auto secondaryNssList = _exec->getSecondaryNamespaces(); - AutoGetCollectionForReadMaybeLockFree readLock(opCtx, - _exec->nss(), - AutoGetCollectionViewMode::kViewsForbidden, - Date_t::max(), - secondaryNssList); + AutoGetCollectionForReadMaybeLockFree readLock( + opCtx, + _exec->nss(), + AutoGetCollection::Options{}.secondaryNssOrUUIDs(secondaryNssList)); MultipleCollectionAccessor collections(opCtx, &readLock.getCollection(), readLock.getNss(), diff --git a/src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp b/src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp index c341101d893..4e72fa27af3 100644 --- a/src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp +++ b/src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp @@ -251,7 +251,7 @@ std::deque<BSONObj> CommonMongodProcessInterface::listCatalog(OperationContext* AutoGetCollectionForReadCommandMaybeLockFree collLock( opCtx, systemViewsNamespaces.front(), - AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode::kViewsForbidden, Date_t::max(), AutoStatsTracker::LogMode::kUpdateTopAndCurOp, {++systemViewsNamespaces.cbegin(), systemViewsNamespaces.cend()}); @@ -434,7 +434,7 @@ CommonMongodProcessInterface::attachCursorSourceToPipelineForLocalRead(Pipeline* autoColl.emplace(expCtx->opCtx, nsOrUUID, - AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode::kViewsForbidden, Date_t::max(), AutoStatsTracker::LogMode::kUpdateTop, secondaryNamespaces); diff --git a/src/mongo/db/query/cqf_get_executor.cpp b/src/mongo/db/query/cqf_get_executor.cpp index 2d99062273c..1884e4956cd 100644 --- a/src/mongo/db/query/cqf_get_executor.cpp +++ b/src/mongo/db/query/cqf_get_executor.cpp @@ -353,7 +353,7 @@ static void populateAdditionalScanDefs( for (const auto& involvedNss : involvedCollections) { // TODO handle views? AutoGetCollectionForReadCommandMaybeLockFree ctx( - opCtx, involvedNss, AutoGetCollectionViewMode::kViewsForbidden); + opCtx, involvedNss, auto_get_collection::ViewMode::kViewsForbidden); const CollectionPtr& collection = ctx ? ctx.getCollection() : CollectionPtr::null; const bool collectionExists = collection != nullptr; const std::string uuidStr = diff --git a/src/mongo/db/s/collection_sharding_runtime.cpp b/src/mongo/db/s/collection_sharding_runtime.cpp index 664542076c5..54369d0aa5b 100644 --- a/src/mongo/db/s/collection_sharding_runtime.cpp +++ b/src/mongo/db/s/collection_sharding_runtime.cpp @@ -507,9 +507,9 @@ CollectionCriticalSection::CollectionCriticalSection(OperationContext* opCtx, AutoGetCollection autoColl(_opCtx, _nss, MODE_S, - AutoGetCollectionViewMode::kViewsForbidden, - _opCtx->getServiceContext()->getPreciseClockSource()->now() + - Milliseconds(migrationLockAcquisitionMaxWaitMS.load())); + AutoGetCollection::Options{}.deadline( + _opCtx->getServiceContext()->getPreciseClockSource()->now() + + Milliseconds(migrationLockAcquisitionMaxWaitMS.load()))); auto* const csr = CollectionShardingRuntime::get(_opCtx, _nss); auto csrLock = CollectionShardingRuntime::CSRLock::lockExclusive(opCtx, csr); invariant(csr->getCurrentMetadataIfKnown()); @@ -528,9 +528,9 @@ void CollectionCriticalSection::enterCommitPhase() { AutoGetCollection autoColl(_opCtx, _nss, MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - _opCtx->getServiceContext()->getPreciseClockSource()->now() + - Milliseconds(migrationLockAcquisitionMaxWaitMS.load())); + AutoGetCollection::Options{}.deadline( + _opCtx->getServiceContext()->getPreciseClockSource()->now() + + Milliseconds(migrationLockAcquisitionMaxWaitMS.load()))); auto* const csr = CollectionShardingRuntime::get(_opCtx, _nss); auto csrLock = CollectionShardingRuntime::CSRLock::lockExclusive(_opCtx, csr); invariant(csr->getCurrentMetadataIfKnown()); diff --git a/src/mongo/db/s/collmod_coordinator.cpp b/src/mongo/db/s/collmod_coordinator.cpp index 3e5abedde21..9c6d352393f 100644 --- a/src/mongo/db/s/collmod_coordinator.cpp +++ b/src/mongo/db/s/collmod_coordinator.cpp @@ -159,8 +159,11 @@ ExecutorFuture<void> CollModCoordinator::_runImpl( } { - AutoGetCollection coll{ - opCtx, nss(), MODE_IS, AutoGetCollectionViewMode::kViewsPermitted}; + AutoGetCollection coll{opCtx, + nss(), + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)}; checkCollectionUUIDMismatch(opCtx, nss(), *coll, _request.getCollectionUUID()); } diff --git a/src/mongo/db/s/create_collection_coordinator.cpp b/src/mongo/db/s/create_collection_coordinator.cpp index e49fc035752..ff58d129036 100644 --- a/src/mongo/db/s/create_collection_coordinator.cpp +++ b/src/mongo/db/s/create_collection_coordinator.cpp @@ -126,7 +126,7 @@ BSONObj resolveCollationForUserQueries(OperationContext* opCtx, !requestedCollator); } - AutoGetCollection autoColl(opCtx, nss, MODE_IS, AutoGetCollectionViewMode::kViewsForbidden); + AutoGetCollection autoColl(opCtx, nss, MODE_IS); const auto actualCollator = [&]() -> const CollatorInterface* { const auto& coll = autoColl.getCollection(); @@ -926,8 +926,11 @@ void CreateCollectionCoordinator::_createCollectionAndIndexes( ShardingRecoveryService::get(opCtx)->releaseRecoverableCriticalSection( opCtx, originalNss(), _critSecReason, ShardingCatalogClient::kMajorityWriteConcern); _doc.setDisregardCriticalSectionOnOriginalNss(true); - viewLock.emplace( - opCtx, originalNss(), LockMode::MODE_X, AutoGetCollectionViewMode::kViewsPermitted); + viewLock.emplace(opCtx, + originalNss(), + LockMode::MODE_X, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); // Once the exclusive access has been reacquired, ensure that no data race occurred. auto catalog = CollectionCatalog::get(opCtx); if (catalog->lookupView(opCtx, originalNss()) || diff --git a/src/mongo/db/s/drop_collection_coordinator.cpp b/src/mongo/db/s/drop_collection_coordinator.cpp index 332d1bebf17..2a658d16066 100644 --- a/src/mongo/db/s/drop_collection_coordinator.cpp +++ b/src/mongo/db/s/drop_collection_coordinator.cpp @@ -87,8 +87,11 @@ ExecutorFuture<void> DropCollectionCoordinator::_runImpl( } { - AutoGetCollection coll{ - opCtx, nss(), MODE_IS, AutoGetCollectionViewMode::kViewsPermitted}; + AutoGetCollection coll{opCtx, + nss(), + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)}; checkCollectionUUIDMismatch(opCtx, nss(), *coll, _doc.getCollectionUUID()); } diff --git a/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp b/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp index f85f73c0ef4..5ddda7894a8 100644 --- a/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp +++ b/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp @@ -117,8 +117,11 @@ public: boost::optional<SharedSemiFuture<void>> criticalSectionSignal; { - AutoGetCollection autoColl( - opCtx, ns(), MODE_IS, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection autoColl(opCtx, + ns(), + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); // If the primary is in the critical section, secondaries must wait for the commit // to finish on the primary in case a secondary's caller has an afterClusterTime diff --git a/src/mongo/db/s/get_shard_version_command.cpp b/src/mongo/db/s/get_shard_version_command.cpp index 858e1be224f..391d9d2ca71 100644 --- a/src/mongo/db/s/get_shard_version_command.cpp +++ b/src/mongo/db/s/get_shard_version_command.cpp @@ -92,7 +92,11 @@ public: "configServer", Grid::get(opCtx)->shardRegistry()->getConfigServerConnectionString().toString()); - AutoGetCollection autoColl(opCtx, nss, MODE_IS, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection autoColl( + opCtx, + nss, + MODE_IS, + AutoGetCollection::Options{}.viewMode(auto_get_collection::ViewMode::kViewsPermitted)); auto* const csr = CollectionShardingRuntime::get(opCtx, nss); const auto optMetadata = csr->getCurrentMetadataIfKnown(); diff --git a/src/mongo/db/s/migration_source_manager.cpp b/src/mongo/db/s/migration_source_manager.cpp index 164af14539b..5dd023e176f 100644 --- a/src/mongo/db/s/migration_source_manager.cpp +++ b/src/mongo/db/s/migration_source_manager.cpp @@ -276,9 +276,9 @@ void MigrationSourceManager::startClone() { AutoGetCollection autoColl(_opCtx, nss(), replEnabled ? MODE_IX : MODE_X, - AutoGetCollectionViewMode::kViewsForbidden, - _opCtx->getServiceContext()->getPreciseClockSource()->now() + - Milliseconds(migrationLockAcquisitionMaxWaitMS.load())); + AutoGetCollection::Options{}.deadline( + _opCtx->getServiceContext()->getPreciseClockSource()->now() + + Milliseconds(migrationLockAcquisitionMaxWaitMS.load()))); auto* const csr = CollectionShardingRuntime::get(_opCtx, nss()); const auto csrLock = CollectionShardingRuntime::CSRLock::lockExclusive(_opCtx, csr); diff --git a/src/mongo/db/s/refine_collection_shard_key_coordinator.cpp b/src/mongo/db/s/refine_collection_shard_key_coordinator.cpp index 0a617517986..42ba6cbfb15 100644 --- a/src/mongo/db/s/refine_collection_shard_key_coordinator.cpp +++ b/src/mongo/db/s/refine_collection_shard_key_coordinator.cpp @@ -118,8 +118,11 @@ ExecutorFuture<void> RefineCollectionShardKeyCoordinator::_runImpl( getForwardableOpMetadata().setOn(opCtx); { - AutoGetCollection coll{ - opCtx, nss(), MODE_IS, AutoGetCollectionViewMode::kViewsPermitted}; + AutoGetCollection coll{opCtx, + nss(), + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)}; checkCollectionUUIDMismatch(opCtx, nss(), *coll, _request.getCollectionUUID()); } diff --git a/src/mongo/db/s/rename_collection_coordinator.cpp b/src/mongo/db/s/rename_collection_coordinator.cpp index e1dc8fea867..9f0c978d321 100644 --- a/src/mongo/db/s/rename_collection_coordinator.cpp +++ b/src/mongo/db/s/rename_collection_coordinator.cpp @@ -147,8 +147,11 @@ ExecutorFuture<void> RenameCollectionCoordinator::_runImpl( (!_doc.getExpectedSourceUUID() && !_doc.getExpectedTargetUUID())); { - AutoGetCollection coll{ - opCtx, fromNss, MODE_IS, AutoGetCollectionViewMode::kViewsPermitted}; + AutoGetCollection coll{opCtx, + fromNss, + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)}; checkCollectionUUIDMismatch( opCtx, fromNss, *coll, _doc.getExpectedSourceUUID()); diff --git a/src/mongo/db/s/reshard_collection_coordinator.cpp b/src/mongo/db/s/reshard_collection_coordinator.cpp index 28872ee8268..7f4d5ce9095 100644 --- a/src/mongo/db/s/reshard_collection_coordinator.cpp +++ b/src/mongo/db/s/reshard_collection_coordinator.cpp @@ -137,8 +137,11 @@ ExecutorFuture<void> ReshardCollectionCoordinator::_runImpl( getForwardableOpMetadata().setOn(opCtx); { - AutoGetCollection coll{ - opCtx, nss(), MODE_IS, AutoGetCollectionViewMode::kViewsPermitted}; + AutoGetCollection coll{opCtx, + nss(), + MODE_IS, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)}; checkCollectionUUIDMismatch(opCtx, nss(), *coll, _doc.getCollectionUUID()); } diff --git a/src/mongo/db/s/resharding/resharding_oplog_application.cpp b/src/mongo/db/s/resharding/resharding_oplog_application.cpp index 775ec10d37a..89da093dda5 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_application.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_application.cpp @@ -145,22 +145,22 @@ Status ReshardingOplogApplicationRules::applyOperation(OperationContext* opCtx, try { WriteUnitOfWork wuow(opCtx); - AutoGetCollection autoCollOutput(opCtx, - _outputNss, - MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - getDeadline(opCtx)); + AutoGetCollection autoCollOutput( + opCtx, + _outputNss, + MODE_IX, + AutoGetCollection::Options{}.deadline(getDeadline(opCtx))); uassert( ErrorCodes::NamespaceNotFound, str::stream() << "Failed to apply op during resharding due to missing collection " << _outputNss.ns(), autoCollOutput); - AutoGetCollection autoCollStash(opCtx, - _myStashNss, - MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - getDeadline(opCtx)); + AutoGetCollection autoCollStash( + opCtx, + _myStashNss, + MODE_IX, + AutoGetCollection::Options{}.deadline(getDeadline(opCtx))); uassert( ErrorCodes::NamespaceNotFound, str::stream() << "Failed to apply op during resharding due to missing collection " @@ -451,11 +451,8 @@ void ReshardingOplogApplicationRules::_applyDelete_inlock(OperationContext* opCt // single replica set transaction that is executed if we apply rule #4, so we therefore must run // 'findByIdAndNoopUpdate' as a part of the single replica set transaction. runWithTransaction(opCtx, _outputNss, [this, idQuery](OperationContext* opCtx) { - AutoGetCollection autoCollOutput(opCtx, - _outputNss, - MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - getDeadline(opCtx)); + AutoGetCollection autoCollOutput( + opCtx, _outputNss, MODE_IX, AutoGetCollection::Options{}.deadline(getDeadline(opCtx))); uassert(ErrorCodes::NamespaceNotFound, str::stream() << "Failed to apply op during resharding due to missing collection " << _outputNss.ns(), @@ -500,11 +497,8 @@ void ReshardingOplogApplicationRules::_applyDelete_inlock(OperationContext* opCt continue; } - AutoGetCollection autoCollStash(opCtx, - coll, - MODE_IX, - AutoGetCollectionViewMode::kViewsForbidden, - getDeadline(opCtx)); + AutoGetCollection autoCollStash( + opCtx, coll, MODE_IX, AutoGetCollection::Options{}.deadline(getDeadline(opCtx))); uassert( ErrorCodes::NamespaceNotFound, str::stream() << "Failed to apply op during resharding due to missing collection " diff --git a/src/mongo/db/s/shard_key_util.cpp b/src/mongo/db/s/shard_key_util.cpp index 95283ba0049..33f597cee8b 100644 --- a/src/mongo/db/s/shard_key_util.cpp +++ b/src/mongo/db/s/shard_key_util.cpp @@ -235,7 +235,11 @@ bool validateShardKeyIndexExistsOrCreateIfPossible(OperationContext* opCtx, void validateShardKeyIsNotEncrypted(OperationContext* opCtx, const NamespaceString& nss, const ShardKeyPattern& shardKeyPattern) { - AutoGetCollection collection(opCtx, nss, MODE_IS, AutoGetCollectionViewMode::kViewsPermitted); + AutoGetCollection collection( + opCtx, + nss, + MODE_IS, + AutoGetCollection::Options{}.viewMode(auto_get_collection::ViewMode::kViewsPermitted)); if (!collection || collection.getView()) { return; } diff --git a/src/mongo/db/s/shard_server_op_observer.cpp b/src/mongo/db/s/shard_server_op_observer.cpp index 0e138e333ec..a148115c004 100644 --- a/src/mongo/db/s/shard_server_op_observer.cpp +++ b/src/mongo/db/s/shard_server_op_observer.cpp @@ -294,21 +294,25 @@ void ShardServerOpObserver::onInserts(OperationContext* opCtx, !recoverable_critical_section_util::inRecoveryMode(opCtx)) { const auto collCSDoc = CollectionCriticalSectionDocument::parse( IDLParserContext("ShardServerOpObserver"), insertedDoc); - opCtx->recoveryUnit()->onCommit([opCtx, - insertedNss = collCSDoc.getNss(), - reason = collCSDoc.getReason().getOwned()]( - boost::optional<Timestamp>) { - boost::optional<AutoGetCollection> lockCollectionIfNotPrimary; - if (!isStandaloneOrPrimary(opCtx)) { - lockCollectionIfNotPrimary.emplace( - opCtx, insertedNss, MODE_IX, AutoGetCollectionViewMode::kViewsPermitted); - } - - UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - auto* const csr = CollectionShardingRuntime::get(opCtx, insertedNss); - auto csrLock = CollectionShardingRuntime ::CSRLock::lockExclusive(opCtx, csr); - csr->enterCriticalSectionCatchUpPhase(csrLock, reason); - }); + opCtx->recoveryUnit()->onCommit( + [opCtx, + insertedNss = collCSDoc.getNss(), + reason = collCSDoc.getReason().getOwned()](boost::optional<Timestamp>) { + boost::optional<AutoGetCollection> lockCollectionIfNotPrimary; + if (!isStandaloneOrPrimary(opCtx)) { + lockCollectionIfNotPrimary.emplace( + opCtx, + insertedNss, + MODE_IX, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); + } + + UninterruptibleLockGuard noInterrupt(opCtx->lockState()); + auto* const csr = CollectionShardingRuntime::get(opCtx, insertedNss); + auto csrLock = CollectionShardingRuntime ::CSRLock::lockExclusive(opCtx, csr); + csr->enterCriticalSectionCatchUpPhase(csrLock, reason); + }); } if (nss == NamespaceString::kShardCollectionCatalogNamespace && @@ -464,7 +468,11 @@ void ShardServerOpObserver::onUpdate(OperationContext* opCtx, const OplogUpdateE boost::optional<AutoGetCollection> lockCollectionIfNotPrimary; if (!isStandaloneOrPrimary(opCtx)) { lockCollectionIfNotPrimary.emplace( - opCtx, updatedNss, MODE_IX, AutoGetCollectionViewMode::kViewsPermitted); + opCtx, + updatedNss, + MODE_IX, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); } UninterruptibleLockGuard noInterrupt(opCtx->lockState()); @@ -580,7 +588,11 @@ void ShardServerOpObserver::onDelete(OperationContext* opCtx, boost::optional<AutoGetCollection> lockCollectionIfNotPrimary; if (!isStandaloneOrPrimary(opCtx)) { lockCollectionIfNotPrimary.emplace( - opCtx, deletedNss, MODE_IX, AutoGetCollectionViewMode::kViewsPermitted); + opCtx, + deletedNss, + MODE_IX, + AutoGetCollection::Options{}.viewMode( + auto_get_collection::ViewMode::kViewsPermitted)); } UninterruptibleLockGuard noInterrupt(opCtx->lockState()); diff --git a/src/mongo/db/s/sharding_ddl_util.cpp b/src/mongo/db/s/sharding_ddl_util.cpp index 626e9e7624d..ba16739d2ff 100644 --- a/src/mongo/db/s/sharding_ddl_util.cpp +++ b/src/mongo/db/s/sharding_ddl_util.cpp @@ -546,8 +546,9 @@ boost::optional<UUID> getCollectionUUID(OperationContext* opCtx, AutoGetCollection autoColl(opCtx, nss, MODE_IS, - allowViews ? AutoGetCollectionViewMode::kViewsPermitted - : AutoGetCollectionViewMode::kViewsForbidden); + AutoGetCollection::Options{}.viewMode( + allowViews ? auto_get_collection::ViewMode::kViewsPermitted + : auto_get_collection::ViewMode::kViewsForbidden)); return autoColl ? boost::make_optional(autoColl->uuid()) : boost::none; } diff --git a/src/mongo/db/stats/storage_stats.cpp b/src/mongo/db/stats/storage_stats.cpp index 497285f940e..f092a96738f 100644 --- a/src/mongo/db/stats/storage_stats.cpp +++ b/src/mongo/db/stats/storage_stats.cpp @@ -81,7 +81,7 @@ Status appendCollectionStorageStats(OperationContext* opCtx, try { autoColl.emplace(opCtx, collNss, - AutoGetCollectionViewMode::kViewsForbidden, + auto_get_collection::ViewMode::kViewsForbidden, waitForLock ? Date_t::max() : Date_t::now()); } catch (const ExceptionFor<ErrorCodes::LockTimeout>& ex) { return failed(ex); |