diff options
Diffstat (limited to 'src/mongo/dbtests/query_stage_fetch.cpp')
-rw-r--r-- | src/mongo/dbtests/query_stage_fetch.cpp | 233 |
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; |