summaryrefslogtreecommitdiff
path: root/src/mongo/dbtests/query_stage_collscan.cpp
diff options
context:
space:
mode:
authorGeert Bosch <geert.bosch@mongodb.com>2014-07-16 13:48:46 -0400
committerGeert Bosch <geert.bosch@mongodb.com>2014-07-16 17:19:21 -0400
commit086412f640b38be6e77d0fc1034f2d420e186b9b (patch)
tree1624d3ace756ccb62d41beb2494e9b2583eacb70 /src/mongo/dbtests/query_stage_collscan.cpp
parentdeeb8bc5d608cc42300ff4407f3c4dac69e73d17 (diff)
downloadmongo-086412f640b38be6e77d0fc1034f2d420e186b9b.tar.gz
SERVER-13640 Port and re-enable collection scan tests
Diffstat (limited to 'src/mongo/dbtests/query_stage_collscan.cpp')
-rw-r--r--src/mongo/dbtests/query_stage_collscan.cpp277
1 files changed, 1 insertions, 276 deletions
diff --git a/src/mongo/dbtests/query_stage_collscan.cpp b/src/mongo/dbtests/query_stage_collscan.cpp
index 5c846b31afb..06428a98900 100644
--- a/src/mongo/dbtests/query_stage_collscan.cpp
+++ b/src/mongo/dbtests/query_stage_collscan.cpp
@@ -49,266 +49,7 @@
#include "mongo/util/fail_point_service.h"
namespace QueryStageCollectionScan {
-#if 0 // SERVER-13640
- //
- // Test some nitty-gritty capped collection details. Ported and polished from pdfiletests.cpp.
- //
- class QueryStageCollectionScanCappedBase {
- public:
- QueryStageCollectionScanCappedBase() : _context(ns()) { }
-
- virtual ~QueryStageCollectionScanCappedBase() {
- _context.db()->dropCollection( &_txn, ns() );
- wunit.commit();
- }
- void run() {
- // Create the capped collection.
- stringstream spec;
- spec << "{\"capped\":true,\"size\":2000,\"$nExtents\":" << nExtents() << "}";
-
- ASSERT( userCreateNS( &_txn, db(), ns(), fromjson( spec.str() ), false ).isOK() );
-
- // Tell the test to add data/extents/etc.
- insertTestData();
-
- CollectionScanParams params;
- params.collection = collection();
- params.direction = CollectionScanParams::FORWARD;
- params.tailable = false;
- params.start = DiskLoc();
-
- // Walk the collection going forward.
- {
- // Create an executor to handle the scan.
- WorkingSet* ws = new WorkingSet();
- PlanStage* ps = new CollectionScan(params, ws, NULL);
- PlanExecutor runner(ws, ps, collection());
-
- int resultCount = 0;
- BSONObj obj;
- while (Runner::RUNNER_ADVANCED == runner.getNext(&obj, NULL)) {
- ASSERT_EQUALS(resultCount, obj.firstElement().number());
- ++resultCount;
- }
-
- ASSERT_EQUALS(expectedCount(), resultCount);
- }
-
- // Walk the collection going backwards.
- {
- params.direction = CollectionScanParams::BACKWARD;
-
- WorkingSet* ws = new WorkingSet();
- PlanStage* ps = new CollectionScan(params, ws, NULL);
- PlanExecutor runner(ws, ps, collection());
-
- // Going backwards.
- int resultCount = expectedCount() - 1;
- BSONObj obj;
- while (Runner::RUNNER_ADVANCED == runner.getNext(&obj, NULL)) {
- ASSERT_EQUALS(resultCount, obj.firstElement().number());
- --resultCount;
- }
-
- ASSERT_EQUALS(-1, resultCount);
- }
- }
-
- protected:
- // Insert records into the collection.
- virtual void insertTestData() = 0;
-
- // How many records do we expect to find in our scan?
- virtual int expectedCount() const = 0;
-
- // How many extents do we create when we make the collection?
- virtual int nExtents() const = 0;
-
- // Quote: bypass standard alloc/insert routines to use the extent we want.
- DiskLoc insert( const DiskLoc& ext, int i ) {
- // Copied verbatim.
- BSONObjBuilder b;
- b.append( "a", i );
- BSONObj o = b.done();
- int len = o.objsize();
- Extent *e = extentManager()->getExtent(ext);
- e = _txn.recoveryUnit()->writing(e);
- int ofs;
- if ( e->lastRecord.isNull() ) {
- ofs = ext.getOfs() + ( e->_extentData - (char *)e );
- }
- else {
- ofs = e->lastRecord.getOfs()
- + recordStore()->recordFor(e->lastRecord)->lengthWithHeaders();
- }
- DiskLoc dl( ext.a(), ofs );
- Record *r = recordStore()->recordFor(dl);
- r = (Record*) _txn.recoveryUnit()->writingPtr(r, Record::HeaderSize + len);
- r->lengthWithHeaders() = Record::HeaderSize + len;
- r->extentOfs() = e->myLoc.getOfs();
- r->nextOfs() = DiskLoc::NullOfs;
- r->prevOfs() = e->lastRecord.isNull() ? DiskLoc::NullOfs : e->lastRecord.getOfs();
- memcpy( r->data(), o.objdata(), len );
- if ( e->firstRecord.isNull() )
- e->firstRecord = dl;
- else
- _txn.recoveryUnit()->writingInt(recordStore()->recordFor(e->lastRecord)->nextOfs()) = ofs;
- e->lastRecord = dl;
- return dl;
- }
-
- static const char *ns() { return "unittests.QueryStageCollectionScanCapped"; }
-
- Database* db() { return _context.db(); }
- ExtentManager* extentManager() { return db()->getExtentManager(); }
- Collection* collection() { return db()->getCollection( &_txn, ns() ); }
- NamespaceDetails *nsd() { return collection()->detailsWritable(); }
-
- protected:
- const RecordStore* recordStore() {
- Collection* c = collection();
- if ( !c )
- return NULL;
- return c->getRecordStore();
- }
-
- Lock::GlobalWrite lk_;
- Client::Context _context;
- OperationContextImpl _txn;
- WriteUnitOfWork wunit(_txn.recoveryUnit());
- };
-
- class QueryStageCollscanEmpty : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {}
- virtual int expectedCount() const { return 0; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanEmptyLooped : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapFirstNewRecord( &_txn, DiskLoc() );
- }
- virtual int expectedCount() const { return 0; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanEmptyMultiExtentLooped : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapFirstNewRecord( &_txn, DiskLoc() );
- }
- virtual int expectedCount() const { return 0; }
- virtual int nExtents() const { return 3; }
- };
-
- class QueryStageCollscanSingle : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 0 ) );
- }
- virtual int expectedCount() const { return 1; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanNewCapFirst : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- DiskLoc x = insert( nsd()->capExtent(), 0 );
- nsd()->setCapFirstNewRecord( &_txn, x );
- insert( nsd()->capExtent(), 1 );
- }
- virtual int expectedCount() const { return 2; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanNewCapLast : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- insert( nsd()->capExtent(), 0 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 1 ) );
- }
- virtual int expectedCount() const { return 2; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanNewCapMiddle : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- insert( nsd()->capExtent(), 0 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 1 ) );
- insert( nsd()->capExtent(), 2 );
- }
- virtual int expectedCount() const { return 3; }
- virtual int nExtents() const { return 0; }
- };
-
- class QueryStageCollscanFirstExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- insert( nsd()->capExtent(), 0 );
- insert( nsd()->lastExtent(), 1 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 2 ) );
- insert( nsd()->capExtent(), 3 );
- }
- virtual int expectedCount() const { return 4; }
- virtual int nExtents() const { return 2; }
- };
-
- class QueryStageCollscanLastExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapExtent( &_txn, nsd()->lastExtent() );
- insert( nsd()->capExtent(), 0 );
- insert( nsd()->firstExtent(), 1 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 2 ) );
- insert( nsd()->capExtent(), 3 );
- }
- virtual int expectedCount() const { return 4; }
- virtual int nExtents() const { return 2; }
- };
-
- class QueryStageCollscanMidExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapExtent( &_txn, extentManager()->getExtent(nsd()->firstExtent())->xnext );
- insert( nsd()->capExtent(), 0 );
- insert( nsd()->lastExtent(), 1 );
- insert( nsd()->firstExtent(), 2 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 3 ) );
- insert( nsd()->capExtent(), 4 );
- }
- virtual int expectedCount() const { return 5; }
- virtual int nExtents() const { return 3; }
- };
-
- class QueryStageCollscanAloneInExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapExtent( &_txn, extentManager()->getExtent(nsd()->firstExtent())->xnext );
- insert( nsd()->lastExtent(), 0 );
- insert( nsd()->firstExtent(), 1 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 2 ) );
- }
- virtual int expectedCount() const { return 3; }
- virtual int nExtents() const { return 3; }
- };
-
- class QueryStageCollscanFirstInExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapExtent( &_txn, extentManager()->getExtent(nsd()->firstExtent())->xnext );
- insert( nsd()->lastExtent(), 0 );
- insert( nsd()->firstExtent(), 1 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 2 ) );
- insert( nsd()->capExtent(), 3 );
- }
- virtual int expectedCount() const { return 4; }
- virtual int nExtents() const { return 3; }
- };
-
- class QueryStageCollscanLastInExtent : public QueryStageCollectionScanCappedBase {
- virtual void insertTestData() {
- nsd()->setCapExtent( &_txn, extentManager()->getExtent(nsd()->firstExtent())->xnext );
- insert( nsd()->capExtent(), 0 );
- insert( nsd()->lastExtent(), 1 );
- insert( nsd()->firstExtent(), 2 );
- nsd()->setCapFirstNewRecord( &_txn, insert( nsd()->capExtent(), 3 ) );
- }
- virtual int expectedCount() const { return 4; }
- virtual int nExtents() const { return 3; }
- };
-#endif // SERVER-13640
//
// Stage-specific tests.
//
@@ -629,23 +370,7 @@ namespace QueryStageCollectionScan {
All() : Suite( "QueryStageCollectionScan" ) {}
void setupTests() {
- // These tests are ported from pdfile.cpp
- /* SERVER-13640
- add<QueryStageCollscanEmpty>();
- add<QueryStageCollscanEmptyLooped>();
- add<QueryStageCollscanEmptyMultiExtentLooped>();
- add<QueryStageCollscanSingle>();
- add<QueryStageCollscanNewCapFirst>();
- add<QueryStageCollscanNewCapLast>();
- add<QueryStageCollscanNewCapMiddle>();
- add<QueryStageCollscanFirstExtent>();
- add<QueryStageCollscanLastExtent>();
- add<QueryStageCollscanMidExtent>();
- add<QueryStageCollscanAloneInExtent>();
- add<QueryStageCollscanFirstInExtent>();
- add<QueryStageCollscanLastInExtent>();
- */
- // These are not. Stage-specific tests below.
+ // Stage-specific tests below.
add<QueryStageCollscanBasicForward>();
add<QueryStageCollscanBasicBackward>();
add<QueryStageCollscanBasicForwardWithMatch>();