diff options
author | Randolph Tan <randolph@mongodb.com> | 2019-09-13 16:05:48 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-09-13 16:05:48 +0000 |
commit | 87d8a588a8f43c580f26f3c3031e507dea6c7e1e (patch) | |
tree | 913f715a57f1e488aa919592a0810cf57e0155c6 /src/mongo/db/pipeline | |
parent | 121aa792f301b5edbfbda44048f5bcbd6de830b3 (diff) | |
download | mongo-87d8a588a8f43c580f26f3c3031e507dea6c7e1e.tar.gz |
SERVER-40258 Relax locking requirements for sharding metadata refresh on shards
(cherry picked from commit 0d07bf5e7a72a5bce3f7d7d681a71d7ecfe7eb8c)
Diffstat (limited to 'src/mongo/db/pipeline')
-rw-r--r-- | src/mongo/db/pipeline/pipeline_d.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/pipeline/process_interface_shardsvr.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/pipeline/process_interface_standalone.h | 5 |
3 files changed, 12 insertions, 9 deletions
diff --git a/src/mongo/db/pipeline/pipeline_d.cpp b/src/mongo/db/pipeline/pipeline_d.cpp index 96047148104..4a4f4b7ea14 100644 --- a/src/mongo/db/pipeline/pipeline_d.cpp +++ b/src/mongo/db/pipeline/pipeline_d.cpp @@ -126,16 +126,13 @@ StatusWith<unique_ptr<PlanExecutor, PlanExecutor::Deleter>> createRandomCursorEx // If the incoming operation is sharded, use the CSS to infer the filtering metadata for the // collection, otherwise treat it as unsharded - boost::optional<ScopedCollectionMetadata> shardMetadata = - (OperationShardingState::isOperationVersioned(opCtx) - ? CollectionShardingState::get(opCtx, coll->ns())->getOrphansFilter(opCtx) - : boost::optional<ScopedCollectionMetadata>{}); + auto shardMetadata = CollectionShardingState::get(opCtx, coll->ns())->getOrphansFilter(opCtx); // Because 'numRecords' includes orphan documents, our initial decision to optimize the $sample // cursor may have been mistaken. For sharded collections, build a TRIAL plan that will switch // to a collection scan if the ratio of orphaned to owned documents encountered over the first // 100 works() is such that we would have chosen not to optimize. - if (shardMetadata && (*shardMetadata)->isSharded()) { + if (shardMetadata->isSharded()) { // The ratio of owned to orphaned documents must be at least equal to the ratio between the // requested sampleSize and the maximum permitted sampleSize for the original constraints to // be satisfied. For instance, if there are 200 documents and the sampleSize is 5, then at @@ -146,12 +143,12 @@ StatusWith<unique_ptr<PlanExecutor, PlanExecutor::Deleter>> createRandomCursorEx sampleSize / (numRecords * kMaxSampleRatioForRandCursor), kMaxSampleRatioForRandCursor); // The trial plan is SHARDING_FILTER-MULTI_ITERATOR. auto randomCursorPlan = - std::make_unique<ShardFilterStage>(opCtx, *shardMetadata, ws.get(), root.release()); + std::make_unique<ShardFilterStage>(opCtx, shardMetadata, ws.get(), root.release()); // The backup plan is SHARDING_FILTER-COLLSCAN. std::unique_ptr<PlanStage> collScanPlan = std::make_unique<CollectionScan>( opCtx, coll, CollectionScanParams{}, ws.get(), nullptr); collScanPlan = std::make_unique<ShardFilterStage>( - opCtx, *shardMetadata, ws.get(), collScanPlan.release()); + opCtx, shardMetadata, ws.get(), collScanPlan.release()); // Place a TRIAL stage at the root of the plan tree, and pass it the trial and backup plans. root = std::make_unique<TrialStage>(opCtx, ws.get(), diff --git a/src/mongo/db/pipeline/process_interface_shardsvr.cpp b/src/mongo/db/pipeline/process_interface_shardsvr.cpp index c2672dcf2a0..74508c4a10e 100644 --- a/src/mongo/db/pipeline/process_interface_shardsvr.cpp +++ b/src/mongo/db/pipeline/process_interface_shardsvr.cpp @@ -206,8 +206,9 @@ unique_ptr<Pipeline, PipelineDeleter> MongoInterfaceShardServer::attachCursorSou std::unique_ptr<ShardFilterer> MongoInterfaceShardServer::getShardFilterer( const boost::intrusive_ptr<ExpressionContext>& expCtx) const { - return std::make_unique<ShardFiltererImpl>( - CollectionShardingState::get(expCtx->opCtx, expCtx->ns)->getOrphansFilter(expCtx->opCtx)); + auto shardingMetadata = + CollectionShardingState::get(expCtx->opCtx, expCtx->ns)->getOrphansFilter(expCtx->opCtx); + return std::make_unique<ShardFiltererImpl>(std::move(shardingMetadata)); } } // namespace mongo diff --git a/src/mongo/db/pipeline/process_interface_standalone.h b/src/mongo/db/pipeline/process_interface_standalone.h index 8b9df872966..ecdb5a2c0d1 100644 --- a/src/mongo/db/pipeline/process_interface_standalone.h +++ b/src/mongo/db/pipeline/process_interface_standalone.h @@ -57,6 +57,11 @@ public: DBClientBase* directClient() final; std::unique_ptr<TransactionHistoryIteratorBase> createTransactionHistoryIterator( repl::OpTime time) const final; + + /** + * Note: Information returned can be stale. Caller should always attach shardVersion when + * sending request against nss based on this information. + */ bool isSharded(OperationContext* opCtx, const NamespaceString& nss) final; Status insert(const boost::intrusive_ptr<ExpressionContext>& expCtx, const NamespaceString& ns, |