summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests/query_stage_fetch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/dbtests/query_stage_fetch.cpp')
-rw-r--r--src/mongo/dbtests/query_stage_fetch.cpp233
1 files changed, 0 insertions, 233 deletions
diff --git a/src/mongo/dbtests/query_stage_fetch.cpp b/src/mongo/dbtests/query_stage_fetch.cpp
index 8abbab2f1db..a1bb651cfab 100644
--- a/src/mongo/dbtests/query_stage_fetch.cpp
+++ b/src/mongo/dbtests/query_stage_fetch.cpp
@@ -44,9 +44,6 @@
#include "mongo/db/storage/mmap_v1/dur_transaction.h"
#include "mongo/db/catalog/collection.h"
#include "mongo/dbtests/dbtests.h"
-#include "mongo/util/fail_point.h"
-#include "mongo/util/fail_point_registry.h"
-#include "mongo/util/fail_point_service.h"
namespace QueryStageFetch {
@@ -85,217 +82,6 @@ namespace QueryStageFetch {
DBDirectClient QueryStageFetchBase::_client;
//
- // Test that a fetch is passed up when it's not in memory.
- //
- class FetchStageNotInMemory : public QueryStageFetchBase {
- public:
- void run() {
- Client::WriteContext ctx(ns());
- DurTransaction txn;
- Database* db = ctx.ctx().db();
- Collection* coll = db->getCollection(ns());
- if (!coll) {
- coll = db->createCollection(&txn, ns());
- }
- WorkingSet ws;
-
- // Add an object to the DB.
- insert(BSON("foo" << 5));
- set<DiskLoc> locs;
- getLocs(&locs, coll);
- ASSERT_EQUALS(size_t(1), locs.size());
-
- // Create a mock stage that returns the WSM.
- auto_ptr<MockStage> mockStage(new MockStage(&ws));
-
- // Mock data.
- {
- WorkingSetMember mockMember;
- mockMember.state = WorkingSetMember::LOC_AND_IDX;
- mockMember.loc = *locs.begin();
-
- // State is loc and index, shouldn't be able to get the foo data inside.
- BSONElement elt;
- ASSERT_FALSE(mockMember.getFieldDotted("foo", &elt));
- mockStage->pushBack(mockMember);
- }
-
- auto_ptr<FetchStage> fetchStage(new FetchStage(&ws, mockStage.release(), NULL, coll));
-
- // Set the fail point to return not in memory.
- FailPointRegistry* reg = getGlobalFailPointRegistry();
- FailPoint* fetchInMemoryFail = reg->getFailPoint("fetchInMemoryFail");
- fetchInMemoryFail->setMode(FailPoint::alwaysOn);
-
- // First call should return a fetch request as it's not in memory.
- WorkingSetID id = WorkingSet::INVALID_ID;
- PlanStage::StageState state;
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::NEED_FETCH, state);
-
- // Let's do the fetch ourselves (though it doesn't really matter)
- WorkingSetMember* member = ws.get(id);
- ASSERT_FALSE(member->hasObj());
- coll->getRecordStore()->recordFor(member->loc)->touch();
-
- // Next call to work() should give us the object in a diff. state
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::ADVANCED, state);
- ASSERT_EQUALS(WorkingSetMember::LOC_AND_UNOWNED_OBJ, member->state);
-
- // We should be able to get data from the obj now.
- BSONElement elt;
- ASSERT_TRUE(member->getFieldDotted("foo", &elt));
- ASSERT_EQUALS(elt.numberInt(), 5);
-
- // Mock stage is EOF so fetch should be too.
- ASSERT_TRUE(fetchStage->isEOF());
-
- // Turn off fail point for further tests.
- fetchInMemoryFail->setMode(FailPoint::off);
- }
- };
-
- //
- // Test that a fetch is not passed up when it's in memory.
- //
- class FetchStageInMemory : public QueryStageFetchBase {
- public:
- void run() {
- Client::WriteContext ctx(ns());
- DurTransaction txn;
- Database* db = ctx.ctx().db();
- Collection* coll = db->getCollection(ns());
- if (!coll) {
- coll = db->createCollection(&txn, ns());
- }
- WorkingSet ws;
-
- // Add an object to the DB.
- insert(BSON("foo" << 5));
- set<DiskLoc> locs;
- getLocs(&locs, coll);
- ASSERT_EQUALS(size_t(1), locs.size());
-
- // Create a mock stage that returns the WSM.
- auto_ptr<MockStage> mockStage(new MockStage(&ws));
-
- // Mock data.
- {
- WorkingSetMember mockMember;
- mockMember.state = WorkingSetMember::LOC_AND_IDX;
- mockMember.loc = *locs.begin();
-
- // State is loc and index, shouldn't be able to get the foo data inside.
- BSONElement elt;
- ASSERT_FALSE(mockMember.getFieldDotted("foo", &elt));
- mockStage->pushBack(mockMember);
- }
-
- auto_ptr<FetchStage> fetchStage(new FetchStage(&ws, mockStage.release(), NULL, coll));
-
- // Set the fail point to return in memory.
- FailPointRegistry* reg = getGlobalFailPointRegistry();
- FailPoint* fetchInMemorySucceed = reg->getFailPoint("fetchInMemorySucceed");
- fetchInMemorySucceed->setMode(FailPoint::alwaysOn);
-
- // First call fetches as expected.
- WorkingSetID id = WorkingSet::INVALID_ID;
- PlanStage::StageState state;
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::ADVANCED, state);
-
- // State should have changed.
- WorkingSetMember* member = ws.get(id);
- ASSERT_EQUALS(WorkingSetMember::LOC_AND_UNOWNED_OBJ, member->state);
-
- // We should be able to get data from the obj now.
- BSONElement elt;
- ASSERT_TRUE(member->getFieldDotted("foo", &elt));
- ASSERT_EQUALS(elt.numberInt(), 5);
-
- // Mock stage is EOF so fetch should be too.
- ASSERT_TRUE(fetchStage->isEOF());
-
- // Turn off fail point for further tests.
- fetchInMemorySucceed->setMode(FailPoint::off);
- }
- };
-
- //
- // Test mid-fetch invalidation.
- //
- class FetchStageInvalidation : public QueryStageFetchBase {
- public:
- void run() {
- Client::WriteContext ctx(ns());
- DurTransaction txn;
- Database* db = ctx.ctx().db();
- Collection* coll = db->getCollection(ns());
- if (!coll) {
- coll = db->createCollection(&txn, ns());
- }
- WorkingSet ws;
-
- // Add an object to the DB.
- insert(BSON("foo" << 5));
- set<DiskLoc> locs;
- getLocs(&locs, coll);
- ASSERT_EQUALS(size_t(1), locs.size());
-
- // Create a mock stage that returns the WSM.
- auto_ptr<MockStage> mockStage(new MockStage(&ws));
-
- // Mock data.
- {
- WorkingSetMember mockMember;
- mockMember.state = WorkingSetMember::LOC_AND_IDX;
- mockMember.loc = *locs.begin();
-
- // State is loc and index, shouldn't be able to get the foo data inside.
- BSONElement elt;
- ASSERT_FALSE(mockMember.getFieldDotted("foo", &elt));
- mockStage->pushBack(mockMember);
- }
-
- auto_ptr<FetchStage> fetchStage(new FetchStage(&ws, mockStage.release(), NULL, coll));
-
- // Set the fail point to return not in memory.
- FailPointRegistry* reg = getGlobalFailPointRegistry();
- FailPoint* fetchInMemoryFail = reg->getFailPoint("fetchInMemoryFail");
- fetchInMemoryFail->setMode(FailPoint::alwaysOn);
-
- // First call should return a fetch request as it's not in memory.
- WorkingSetID id = WorkingSet::INVALID_ID;
- PlanStage::StageState state;
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::NEED_FETCH, state);
-
- WorkingSetMember* member = ws.get(id);
-
- // Invalidate the DL.
- fetchStage->invalidate(member->loc, INVALIDATION_DELETION);
-
- // Next call to work() should give us the OWNED obj as it was invalidated mid-page-in.
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::ADVANCED, state);
- ASSERT_EQUALS(WorkingSetMember::OWNED_OBJ, member->state);
-
- // We should be able to get data from the obj now.
- BSONElement elt;
- ASSERT_TRUE(member->getFieldDotted("foo", &elt));
- ASSERT_EQUALS(elt.numberInt(), 5);
-
- // Mock stage is EOF so fetch should be too.
- ASSERT_TRUE(fetchStage->isEOF());
-
- // Turn off fail point for further tests.
- fetchInMemoryFail->setMode(FailPoint::off);
- }
- };
-
-
- //
// Test that a WSM with an obj is passed through verbatim.
//
class FetchStageAlreadyFetched : public QueryStageFetchBase {
@@ -338,11 +124,6 @@ namespace QueryStageFetch {
auto_ptr<FetchStage> fetchStage(new FetchStage(&ws, mockStage.release(), NULL, coll));
- // Set the fail point to return not in memory so we get a fetch request.
- FailPointRegistry* reg = getGlobalFailPointRegistry();
- FailPoint* fetchInMemoryFail = reg->getFailPoint("fetchInMemoryFail");
- fetchInMemoryFail->setMode(FailPoint::alwaysOn);
-
WorkingSetID id = WorkingSet::INVALID_ID;
PlanStage::StageState state;
@@ -355,8 +136,6 @@ namespace QueryStageFetch {
// No more data to fetch, so, EOF.
state = fetchStage->work(&id);
ASSERT_EQUALS(PlanStage::IS_EOF, state);
-
- fetchInMemoryFail->setMode(FailPoint::off);
}
};
@@ -406,16 +185,9 @@ namespace QueryStageFetch {
auto_ptr<FetchStage> fetchStage(
new FetchStage(&ws, mockStage.release(), filterExpr.get(), coll));
- // Set the fail point to return not in memory so we get a fetch request.
- FailPointRegistry* reg = getGlobalFailPointRegistry();
- FailPoint* fetchInMemoryFail = reg->getFailPoint("fetchInMemoryFail");
- fetchInMemoryFail->setMode(FailPoint::alwaysOn);
-
// First call should return a fetch request as it's not in memory.
WorkingSetID id = WorkingSet::INVALID_ID;
PlanStage::StageState state;
- state = fetchStage->work(&id);
- ASSERT_EQUALS(PlanStage::NEED_FETCH, state);
// Normally we'd return the object but we have a filter that prevents it.
state = fetchStage->work(&id);
@@ -424,8 +196,6 @@ namespace QueryStageFetch {
// No more data to fetch, so, EOF.
state = fetchStage->work(&id);
ASSERT_EQUALS(PlanStage::IS_EOF, state);
-
- fetchInMemoryFail->setMode(FailPoint::off);
}
};
@@ -434,10 +204,7 @@ namespace QueryStageFetch {
All() : Suite( "query_stage_fetch" ) { }
void setupTests() {
- add<FetchStageNotInMemory>();
- add<FetchStageInMemory>();
add<FetchStageAlreadyFetched>();
- add<FetchStageInvalidation>();
add<FetchStageFilter>();
}
} queryStageFetchAll;