From c8012ebc991cd4db85e63c4c61883aef3b793498 Mon Sep 17 00:00:00 2001 From: David Storch Date: Wed, 29 Oct 2014 18:56:51 -0400 Subject: SERVER-15665 MMAP v1 requests yields during page faults via NEED_FETCH --- src/mongo/db/exec/near.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/mongo/db/exec/near.cpp') diff --git a/src/mongo/db/exec/near.cpp b/src/mongo/db/exec/near.cpp index a1c96e80cf4..a8050e7e89f 100644 --- a/src/mongo/db/exec/near.cpp +++ b/src/mongo/db/exec/near.cpp @@ -76,7 +76,7 @@ namespace mongo { return PlanStage::NEED_TIME; } - invariant(state != PlanStage::ADVANCED); + invariant(state != PlanStage::ADVANCED && state != PlanStage::NEED_FETCH); // Propagate NEED_TIME or errors upward. return state; @@ -105,7 +105,7 @@ namespace mongo { nextState = initNext(); } else if (SearchState_Buffering == _searchState) { - nextState = bufferNext(&error); + nextState = bufferNext(&toReturn, &error); } else if (SearchState_Advancing == _searchState) { nextState = advanceNext(&toReturn); @@ -126,6 +126,10 @@ namespace mongo { *out = toReturn; ++_stats->common.advanced; } + else if (PlanStage::NEED_FETCH == nextState) { + *out = toReturn; + ++_stats->common.needFetch; + } else if (PlanStage::NEED_TIME == nextState) { ++_stats->common.needTime; } @@ -154,7 +158,8 @@ namespace mongo { double distance; }; - PlanStage::StageState NearStage::bufferNext(Status* error) { + // Set "toReturn" when NEED_FETCH. + PlanStage::StageState NearStage::bufferNext(WorkingSetID* toReturn, Status* error) { // // Try to retrieve the next covered member @@ -199,6 +204,10 @@ namespace mongo { *error = WorkingSetCommon::getMemberStatus(*_workingSet->get(nextMemberID)); return intervalState; } + else if (PlanStage::NEED_FETCH == intervalState) { + *toReturn = nextMemberID; + return intervalState; + } else if (PlanStage::ADVANCED != intervalState) { return intervalState; } -- cgit v1.2.1