summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests
diff options
context:
space:
mode:
authorHari Khalsa <hkhalsa@10gen.com>2014-04-29 17:20:15 -0400
committerHari Khalsa <hkhalsa@10gen.com>2014-04-29 18:27:53 -0400
commit712e4f8063a0e329fd6d69d80d992e2214f97d6e (patch)
tree9700c99bf57a1a799d7003c92c7c873018b9f869 /src/mongo/dbtests
parentd1f3f35e11230d1ee2bf2b81b637427036d72a0a (diff)
downloadmongo-712e4f8063a0e329fd6d69d80d992e2214f97d6e.tar.gz
SERVER-13783 remove likelyInMemory and PageFaultException
Diffstat (limited to 'src/mongo/dbtests')
-rw-r--r--src/mongo/dbtests/oplogstarttests.cpp14
-rw-r--r--src/mongo/dbtests/plan_ranking.cpp54
-rw-r--r--src/mongo/dbtests/query_stage_collscan.cpp68
-rw-r--r--src/mongo/dbtests/query_stage_fetch.cpp233
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;