diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/commands/run_aggregate.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/pipeline/pipeline_d.cpp | 19 | ||||
-rw-r--r-- | src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/query/query_knobs.idl | 16 |
4 files changed, 33 insertions, 6 deletions
diff --git a/src/mongo/db/commands/run_aggregate.cpp b/src/mongo/db/commands/run_aggregate.cpp index 3aca415a48b..13d31c99ace 100644 --- a/src/mongo/db/commands/run_aggregate.cpp +++ b/src/mongo/db/commands/run_aggregate.cpp @@ -72,6 +72,7 @@ #include "mongo/db/query/plan_executor_factory.h" #include "mongo/db/query/plan_summary_stats.h" #include "mongo/db/query/query_feature_flags_gen.h" +#include "mongo/db/query/query_knobs_gen.h" #include "mongo/db/query/query_planner_common.h" #include "mongo/db/read_concern.h" #include "mongo/db/repl/oplog.h" @@ -685,6 +686,7 @@ Status runAggregate(OperationContext* opCtx, if (serverGlobalParams.featureCompatibility.isVersionInitialized() && feature_flags::gFeatureFlagSBELookupPushdown.isEnabled( serverGlobalParams.featureCompatibility) && + !internalQuerySlotBasedExecutionDisableLookupPushdown.load() && !internalQueryForceClassicEngine.load()) { secondaryExecNssList = liteParsedPipeline.getForeignExecutionNamespaces(); } diff --git a/src/mongo/db/pipeline/pipeline_d.cpp b/src/mongo/db/pipeline/pipeline_d.cpp index 50a8a408c2c..36899095c63 100644 --- a/src/mongo/db/pipeline/pipeline_d.cpp +++ b/src/mongo/db/pipeline/pipeline_d.cpp @@ -80,6 +80,7 @@ #include "mongo/db/query/plan_executor_factory.h" #include "mongo/db/query/plan_summary_stats.h" #include "mongo/db/query/query_feature_flags_gen.h" +#include "mongo/db/query/query_knobs_gen.h" #include "mongo/db/query/query_planner.h" #include "mongo/db/query/sort_pattern.h" #include "mongo/db/s/collection_sharding_state.h" @@ -140,8 +141,11 @@ std::vector<std::unique_ptr<InnerPipelineStageInterface>> extractSbeCompatibleSt auto&& sources = pipeline->getSources(); - const auto groupFeatureFlagEnabled = feature_flags::gFeatureFlagSBEGroupPushdown.isEnabled( - serverGlobalParams.featureCompatibility); + const auto disallowGroupPushdown = + !(serverGlobalParams.featureCompatibility.isVersionInitialized() && + feature_flags::gFeatureFlagSBEGroupPushdown.isEnabled( + serverGlobalParams.featureCompatibility)) || + internalQuerySlotBasedExecutionDisableGroupPushdown.load(); bool isMainCollectionSharded = false; if (const auto& mainColl = collections.getMainCollection()) { @@ -159,16 +163,19 @@ std::vector<std::unique_ptr<InnerPipelineStageInterface>> extractSbeCompatibleSt !(serverGlobalParams.featureCompatibility.isVersionInitialized() && feature_flags::gFeatureFlagSBELookupPushdown.isEnabled( serverGlobalParams.featureCompatibility)) || - isMainCollectionSharded || collections.isAnySecondaryNamespaceAViewOrSharded(); + internalQuerySlotBasedExecutionDisableLookupPushdown.load() || isMainCollectionSharded || + collections.isAnySecondaryNamespaceAViewOrSharded(); for (auto itr = sources.begin(); itr != sources.end();) { const bool isLastSource = itr->get() == sources.back().get(); // $group pushdown logic. if (auto groupStage = dynamic_cast<DocumentSourceGroup*>(itr->get())) { - bool groupEligibleForPushdown = - groupFeatureFlagEnabled && groupStage->sbeCompatible() && !groupStage->doingMerge(); - if (groupEligibleForPushdown) { + if (disallowGroupPushdown) { + break; + } + + if (groupStage->sbeCompatible() && !groupStage->doingMerge()) { stagesForPushdown.push_back( std::make_unique<InnerPipelineStageImpl>(groupStage, isLastSource)); sources.erase(itr++); 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 f557f3aa392..9b0b8921cfa 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 @@ -56,6 +56,7 @@ #include "mongo/db/pipeline/pipeline_d.h" #include "mongo/db/query/collection_index_usage_tracker_decoration.h" #include "mongo/db/query/collection_query_info.h" +#include "mongo/db/query/query_knobs_gen.h" #include "mongo/db/query/sbe_plan_cache.h" #include "mongo/db/repl/primary_only_service.h" #include "mongo/db/s/sharding_state.h" @@ -436,6 +437,7 @@ CommonMongodProcessInterface::attachCursorSourceToPipelineForLocalRead(Pipeline* if (serverGlobalParams.featureCompatibility.isVersionInitialized() && feature_flags::gFeatureFlagSBELookupPushdown.isEnabled( serverGlobalParams.featureCompatibility) && + !internalQuerySlotBasedExecutionDisableLookupPushdown.load() && !internalQueryForceClassicEngine.load()) { auto lpp = LiteParsedPipeline(expCtx->ns, pipeline->serializeToBson()); return lpp.getForeignExecutionNamespaces(); diff --git a/src/mongo/db/query/query_knobs.idl b/src/mongo/db/query/query_knobs.idl index babf4576fdc..4756981a4b9 100644 --- a/src/mongo/db/query/query_knobs.idl +++ b/src/mongo/db/query/query_knobs.idl @@ -637,6 +637,22 @@ server_parameters: validator: gt: 0 + internalQuerySlotBasedExecutionDisableLookupPushdown: + description: "If true, the system will not push down $lookup to the SBE execution engine." + set_at: [ startup, runtime ] + cpp_varname: "internalQuerySlotBasedExecutionDisableLookupPushdown" + cpp_vartype: AtomicWord<bool> + default: false + on_update: plan_cache_util::clearSbeCacheOnParameterChange + + internalQuerySlotBasedExecutionDisableGroupPushdown: + description: "If true, the system will not push down $group to the SBE execution engine." + set_at: [ startup, runtime ] + cpp_varname: "internalQuerySlotBasedExecutionDisableGroupPushdown" + cpp_vartype: AtomicWord<bool> + default: false + on_update: plan_cache_util::clearSbeCacheOnParameterChange + internalQueryForceClassicEngine: description: "If true, the system will use the classic execution engine for all queries, otherwise eligible queries will execute using the SBE execution engine." |