summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/near.cpp
diff options
context:
space:
mode:
authorDavid Storch <david.storch@10gen.com>2014-10-29 18:56:51 -0400
committerDavid Storch <david.storch@10gen.com>2014-11-04 14:24:14 -0500
commitc8012ebc991cd4db85e63c4c61883aef3b793498 (patch)
tree9a0b3fbd3f1b4049b103b95690caaf3db2a9dc0d /src/mongo/db/exec/near.cpp
parentd5f6eb21a94a39bd39c3c7a7b0ac107aca33a7e4 (diff)
downloadmongo-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.cpp15
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;
}