diff options
author | Geert Bosch <geert.bosch@mongodb.com> | 2014-07-16 13:48:46 -0400 |
---|---|---|
committer | Geert Bosch <geert.bosch@mongodb.com> | 2014-07-16 17:19:21 -0400 |
commit | 086412f640b38be6e77d0fc1034f2d420e186b9b (patch) | |
tree | 1624d3ace756ccb62d41beb2494e9b2583eacb70 /src/mongo/dbtests/query_stage_collscan.cpp | |
parent | deeb8bc5d608cc42300ff4407f3c4dac69e73d17 (diff) | |
download | mongo-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.cpp | 277 |
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>(); |