diff options
author | Hari Khalsa <hkhalsa@10gen.com> | 2014-04-29 17:20:15 -0400 |
---|---|---|
committer | Hari Khalsa <hkhalsa@10gen.com> | 2014-04-29 18:27:53 -0400 |
commit | 712e4f8063a0e329fd6d69d80d992e2214f97d6e (patch) | |
tree | 9700c99bf57a1a799d7003c92c7c873018b9f869 /src/mongo/dbtests | |
parent | d1f3f35e11230d1ee2bf2b81b637427036d72a0a (diff) | |
download | mongo-712e4f8063a0e329fd6d69d80d992e2214f97d6e.tar.gz |
SERVER-13783 remove likelyInMemory and PageFaultException
Diffstat (limited to 'src/mongo/dbtests')
-rw-r--r-- | src/mongo/dbtests/oplogstarttests.cpp | 14 | ||||
-rw-r--r-- | src/mongo/dbtests/plan_ranking.cpp | 54 | ||||
-rw-r--r-- | src/mongo/dbtests/query_stage_collscan.cpp | 68 | ||||
-rw-r--r-- | src/mongo/dbtests/query_stage_fetch.cpp | 233 |
4 files changed, 6 insertions, 363 deletions
diff --git a/src/mongo/dbtests/oplogstarttests.cpp b/src/mongo/dbtests/oplogstarttests.cpp index c28103e30b0..8e602dfdf70 100644 --- a/src/mongo/dbtests/oplogstarttests.cpp +++ b/src/mongo/dbtests/oplogstarttests.cpp @@ -32,12 +32,9 @@ #include "mongo/db/repl/repl_settings.h" #include "mongo/db/storage/mmap_v1/dur_transaction.h" #include "mongo/db/catalog/collection.h" -#include "mongo/util/fail_point_service.h" namespace OplogStartTests { - static const char* kCollscanFetchFpName = "collscanInMemorySucceed"; - class Base { public: Base() : _context(ns()) { @@ -47,21 +44,10 @@ namespace OplogStartTests { c = _context.db()->createCollection(&txn, ns()); } c->getIndexCatalog()->ensureHaveIdIndex(); - - // We want everything in the collscan to be in memory to avoid spurious fetch - // requests. - FailPointRegistry* registry = getGlobalFailPointRegistry(); - FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName); - failPoint->setMode(FailPoint::alwaysOn); } ~Base() { client()->dropCollection(ns()); - - // Undo fail point set in ctor. - FailPointRegistry* registry = getGlobalFailPointRegistry(); - FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName); - failPoint->setMode(FailPoint::off); } protected: diff --git a/src/mongo/dbtests/plan_ranking.cpp b/src/mongo/dbtests/plan_ranking.cpp index df47ba579f1..e0b9037dbdf 100644 --- a/src/mongo/dbtests/plan_ranking.cpp +++ b/src/mongo/dbtests/plan_ranking.cpp @@ -44,7 +44,6 @@ #include "mongo/db/query/query_planner_test_lib.h" #include "mongo/db/query/stage_builder.h" #include "mongo/dbtests/dbtests.h" -#include "mongo/util/fail_point_service.h" namespace mongo { @@ -57,9 +56,6 @@ namespace PlanRankingTests { static const char* ns = "unittests.PlanRankingTests"; - // The name of the "fetch always required" failpoint. - static const char* kFetchFpName = "fetchInMemoryFail"; - class PlanRankingTestBase { public: PlanRankingTestBase() : _internalQueryForceIntersectionPlans(internalQueryForceIntersectionPlans) { @@ -134,20 +130,6 @@ namespace PlanRankingTests { return _mpr->hasBackupPlan(); } - void turnOnAlwaysFetch() { - FailPointRegistry* registry = getGlobalFailPointRegistry(); - FailPoint* failPoint = registry->getFailPoint(kFetchFpName); - ASSERT(NULL != failPoint); - failPoint->setMode(FailPoint::alwaysOn); - } - - void turnOffAlwaysFetch() { - FailPointRegistry* registry = getGlobalFailPointRegistry(); - FailPoint* failPoint = registry->getFailPoint(kFetchFpName); - ASSERT(NULL != failPoint); - failPoint->setMode(FailPoint::off); - } - protected: // A large number, which must be larger than the number of times // candidate plans are worked by the multi plan runner. Used for @@ -463,9 +445,6 @@ namespace PlanRankingTests { class PlanRankingIxisectCovered : public PlanRankingTestBase { public: void run() { - // Simulate needing lots of FETCH's. - turnOnAlwaysFetch(); - // Neither 'a' nor 'b' is selective. for (int i = 0; i < N; ++i) { insert(BSON("a" << 1 << "b" << 1)); @@ -492,8 +471,6 @@ namespace PlanRankingTests { "{ixscan: {filter: null, pattern: {a:1}}}," "{ixscan: {filter: null, pattern: {b:1}}}]}}}}", soln->root.get())); - - turnOffAlwaysFetch(); } }; @@ -506,9 +483,6 @@ namespace PlanRankingTests { class PlanRankingIxisectNonCovered : public PlanRankingTestBase { public: void run() { - // Simulate needing lots of FETCH's. - turnOnAlwaysFetch(); - // Neither 'a' nor 'b' is selective. for (int i = 0; i < N; ++i) { insert(BSON("a" << 1 << "b" << 1)); @@ -535,8 +509,6 @@ namespace PlanRankingTests { "{fetch: {node: {ixscan: {pattern: {b: 1}}}}}", soln->root.get()); ASSERT(bestIsScanOverA || bestIsScanOverB); - - turnOffAlwaysFetch(); } }; @@ -549,9 +521,6 @@ namespace PlanRankingTests { class PlanRankingNonCoveredIxisectFetchesLess : public PlanRankingTestBase { public: void run() { - // Simulate needing lots of FETCH's. - turnOnAlwaysFetch(); - // Set up data so that the following conditions hold: // 1) Documents matching {a: 1} are of high cardinality. // 2) Documents matching {b: 1} are of high cardinality. @@ -587,8 +556,6 @@ namespace PlanRankingTests { "{ixscan: {filter: null, pattern: {a:1}}}," "{ixscan: {filter: null, pattern: {b:1}}}]}}}}", soln->root.get())); - - turnOffAlwaysFetch(); } }; @@ -599,9 +566,6 @@ namespace PlanRankingTests { class PlanRankingIxisectHitsEOFFirst : public PlanRankingTestBase { public: void run() { - // Simulate needing lots of FETCH's. - turnOnAlwaysFetch(); - // Set up the data so that for the query {a: 1, b: 1}, the // intersection is empty. The single index plans have to do // more fetching from disk in order to determine that the result @@ -633,8 +597,6 @@ namespace PlanRankingTests { "{ixscan: {filter: null, pattern: {a:1}}}," "{ixscan: {filter: null, pattern: {b:1}}}]}}}}", soln->root.get())); - - turnOffAlwaysFetch(); } }; @@ -646,9 +608,6 @@ namespace PlanRankingTests { class PlanRankingChooseBetweenIxisectPlans : public PlanRankingTestBase { public: void run() { - // Simulate needing lots of FETCH's. - turnOnAlwaysFetch(); - // Set up the data so that for the query {a: 1, b: 1, c: 1}, the intersection // between 'b' and 'c' is small, and the other intersections are larger. for (int i = 0; i < 10; ++i) { @@ -681,8 +640,6 @@ namespace PlanRankingTests { "{ixscan: {filter: null, pattern: {b:1}}}," "{ixscan: {filter: null, pattern: {c:1}}}]}}}}", soln->root.get())); - - turnOffAlwaysFetch(); } }; @@ -769,11 +726,12 @@ namespace PlanRankingTests { add<PlanRankingPreferImmediateEOF>(); add<PlanRankingNoCollscan>(); add<PlanRankingCollscan>(); - add<PlanRankingIxisectCovered>(); - add<PlanRankingIxisectNonCovered>(); - add<PlanRankingNonCoveredIxisectFetchesLess>(); - add<PlanRankingIxisectHitsEOFFirst>(); - add<PlanRankingChooseBetweenIxisectPlans>(); + // TODO: These don't work without counting FETCH and FETCH is now gone. + // add<PlanRankingIxisectCovered>(); + // add<PlanRankingIxisectNonCovered>(); + // add<PlanRankingNonCoveredIxisectFetchesLess>(); + // add<PlanRankingIxisectHitsEOFFirst>(); + // add<PlanRankingChooseBetweenIxisectPlans>(); add<PlanRankingAvoidBlockingSort>(); add<PlanRankingWorkPlansLongEnough>(); } diff --git a/src/mongo/dbtests/query_stage_collscan.cpp b/src/mongo/dbtests/query_stage_collscan.cpp index e82513a79b2..0c516cdd5d0 100644 --- a/src/mongo/dbtests/query_stage_collscan.cpp +++ b/src/mongo/dbtests/query_stage_collscan.cpp @@ -615,73 +615,6 @@ namespace QueryStageCollectionScan { } }; - class QueryStageCollscanFetch : public QueryStageCollectionScanBase { - public: - void run() { - Client::WriteContext ctx(ns()); - Collection* coll = ctx.ctx().db()->getCollection(ns()); - - // We want every result from our collscan to NOT be in memory, at least - // the first time around. - const char* kCollscanFetchFpName = "collscanInMemoryFail"; - FailPointRegistry* registry = getGlobalFailPointRegistry(); - FailPoint* failPoint = registry->getFailPoint(kCollscanFetchFpName); - ASSERT(NULL != failPoint); - - // Get the DiskLocs that would be returned by an in-order scan. - vector<DiskLoc> locs; - getLocs(coll, CollectionScanParams::FORWARD, &locs); - - // Configure the scan. - CollectionScanParams params; - params.collection = coll; - params.direction = CollectionScanParams::FORWARD; - params.tailable = false; - - WorkingSet ws; - scoped_ptr<CollectionScan> scan(new CollectionScan(params, &ws, NULL)); - failPoint->setMode(FailPoint::alwaysOn); - - // Expect the first result to be a fetch request for the first object (after - // some NEEDS_TIME initialization). - WorkingSetID id = WorkingSet::INVALID_ID; - PlanStage::StageState state; - do { - state = scan->work(&id); - } while (PlanStage::NEED_FETCH != state); - - // Make sure we're fetching the first thing in the scan. - WorkingSetMember* member = ws.get(id); - ASSERT_EQUALS(locs[0], member->loc); - - // Delete the thing we're fetching. - scan->prepareToYield(); - scan->invalidate(locs[0], INVALIDATION_DELETION); - remove(coll->docFor(locs[0])); - scan->recoverFromYield(); - - // Turn fetches off. - failPoint->setMode(FailPoint::off); - - // Make sure we get the rest of the docs but NOT the one we just nuked mid-fetch. - // We start at 1 to bypass the document we just deleted. - int count = 1; - while (!scan->isEOF()) { - WorkingSetID id = WorkingSet::INVALID_ID; - PlanStage::StageState state = scan->work(&id); - if (PlanStage::ADVANCED == state) { - WorkingSetMember* member = ws.get(id); - ASSERT_EQUALS(coll->docFor(locs[count])["foo"].numberInt(), - member->obj["foo"].numberInt()); - ++count; - } - } - - ASSERT_EQUALS(numObj(), count); - } - }; - - class All : public Suite { public: All() : Suite( "QueryStageCollectionScan" ) {} @@ -710,7 +643,6 @@ namespace QueryStageCollectionScan { add<QueryStageCollscanObjectsInOrderBackward>(); add<QueryStageCollscanInvalidateUpcomingObject>(); add<QueryStageCollscanInvalidateUpcomingObjectBackward>(); - add<QueryStageCollscanFetch>(); } } all; 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; |