summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/commands/run_aggregate.cpp2
-rw-r--r--src/mongo/db/pipeline/pipeline_d.cpp19
-rw-r--r--src/mongo/db/pipeline/process_interface/common_mongod_process_interface.cpp2
-rw-r--r--src/mongo/db/query/query_knobs.idl16
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."