diff options
author | David Storch <david.storch@10gen.com> | 2014-10-29 18:56:51 -0400 |
---|---|---|
committer | David Storch <david.storch@10gen.com> | 2014-11-04 14:24:14 -0500 |
commit | c8012ebc991cd4db85e63c4c61883aef3b793498 (patch) | |
tree | 9a0b3fbd3f1b4049b103b95690caaf3db2a9dc0d /src/mongo/db/exec/near.cpp | |
parent | d5f6eb21a94a39bd39c3c7a7b0ac107aca33a7e4 (diff) | |
download | mongo-c8012ebc991cd4db85e63c4c61883aef3b793498.tar.gz |
SERVER-15665 MMAP v1 requests yields during page faults via NEED_FETCH
Diffstat (limited to 'src/mongo/db/exec/near.cpp')
-rw-r--r-- | src/mongo/db/exec/near.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
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; } |