diff options
author | Eliot Horowitz <eliot@10gen.com> | 2013-08-15 16:23:21 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2013-08-16 09:18:46 -0400 |
commit | ac1c12cb75ee05528e569311a7adfdf2fff9773f (patch) | |
tree | 778d99cca57bdf286e6fd27fba2eaf13d5d2564a | |
parent | 0ea79f6e86fb059478468a583f30cda8a1360318 (diff) | |
download | mongo-ac1c12cb75ee05528e569311a7adfdf2fff9773f.tar.gz |
SERVER-6405: don't throw away Collection* across yield
-rw-r--r-- | src/mongo/db/structure/collection.cpp | 9 | ||||
-rw-r--r-- | src/mongo/db/structure/collection.h | 6 | ||||
-rw-r--r-- | src/mongo/db/structure/collection_iterator.cpp | 34 | ||||
-rw-r--r-- | src/mongo/db/structure/collection_iterator.h | 3 |
4 files changed, 28 insertions, 24 deletions
diff --git a/src/mongo/db/structure/collection.cpp b/src/mongo/db/structure/collection.cpp index 57f523a53e6..128d3efe160 100644 --- a/src/mongo/db/structure/collection.cpp +++ b/src/mongo/db/structure/collection.cpp @@ -32,10 +32,17 @@ namespace mongo { _ns = fullNS.toString(); _details = details; _database = database; + _magic = 1357924; + } + + CollectionTemp::~CollectionTemp() { + verify( ok() ); + _magic = 0; } CollectionIterator* CollectionTemp::getIterator( const DiskLoc& start, bool tailable, const CollectionScanParams::Direction& dir) const { + verify( ok() ); if ( _details->isCapped() ) return new CappedIterator( _ns, start, tailable, dir ); return new FlatIterator( this, start, dir ); @@ -43,10 +50,12 @@ namespace mongo { ExtentManager* CollectionTemp::getExtentManager() { + verify( ok() ); return &_database->getExtentManager(); } const ExtentManager* CollectionTemp::getExtentManager() const { + verify( ok() ); return &_database->getExtentManager(); } diff --git a/src/mongo/db/structure/collection.h b/src/mongo/db/structure/collection.h index e577a8a307d..95443235cba 100644 --- a/src/mongo/db/structure/collection.h +++ b/src/mongo/db/structure/collection.h @@ -44,6 +44,10 @@ namespace mongo { NamespaceDetails* details, Database* database ); + ~CollectionTemp(); + + bool ok() const { return _magic == 1357924; } + StringData ns() const { return _ns; } CollectionIterator* getIterator( const DiskLoc& start, bool tailable, @@ -54,6 +58,8 @@ namespace mongo { ExtentManager* getExtentManager(); const ExtentManager* getExtentManager() const; + int _magic; + std::string _ns; // TODO: this copy might be annoyingly slow NamespaceDetails* _details; Database* _database; diff --git a/src/mongo/db/structure/collection_iterator.cpp b/src/mongo/db/structure/collection_iterator.cpp index 9f8f00e8e7d..41c6f4a2d95 100644 --- a/src/mongo/db/structure/collection_iterator.cpp +++ b/src/mongo/db/structure/collection_iterator.cpp @@ -16,7 +16,12 @@ #include "mongo/db/structure/collection_iterator.h" -#include "mongo/db/pdfile.h" +#include "mongo/db/namespace_details.h" +#include "mongo/db/storage/extent.h" +#include "mongo/db/storage/extent_manager.h" +#include "mongo/db/structure/collection.h" + +#include "mongo/db/pdfile.h" // XXX-ERH namespace mongo { @@ -27,7 +32,7 @@ namespace mongo { FlatIterator::FlatIterator(const CollectionTemp* collection, const DiskLoc& start, const CollectionScanParams::Direction& dir) - : _curr(start), _ns(collection->ns().toString()), _collection(collection), _direction(dir) { + : _curr(start), _collection(collection), _direction(dir) { if (_curr.isNull()) { @@ -85,37 +90,24 @@ namespace mongo { } void FlatIterator::invalidate(const DiskLoc& dl) { + verify( _collection->ok() ); + // Just move past the thing being deleted. if (dl == _curr) { - - _collection = cc().database()->getCollectionTemp( _ns ); - if ( _collection == NULL ) { - return; - } - // We don't care about the return of getNext so much as the side effect of moving _curr // to the 'next' thing. getNext(); - - _collection = NULL; } } void FlatIterator::prepareToYield() { - _collection = NULL; } bool FlatIterator::recoverFromYield() { - _collection = cc().database()->getCollectionTemp( _ns ); - - // If the collection we're iterating over was dropped... - if ( _collection == NULL ) { - // Go right to EOF as a preventative measure. - _curr = DiskLoc(); - - // And return "NOT OK." - return false; - } + // if the collection is dropped, then the cursor should be destroyed + // this check is just a sanity check that the Collection instance we're about to use + // has need been destroyed + verify( _collection->ok() ); return true; } diff --git a/src/mongo/db/structure/collection_iterator.h b/src/mongo/db/structure/collection_iterator.h index 2a85462286f..3b71ec1f8ea 100644 --- a/src/mongo/db/structure/collection_iterator.h +++ b/src/mongo/db/structure/collection_iterator.h @@ -72,9 +72,6 @@ namespace mongo { // The result returned on the next call to getNext(). DiskLoc _curr; - // The collection we're iterating over. - string _ns; - const CollectionTemp* _collection; CollectionScanParams::Direction _direction; |