summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2013-08-15 16:23:21 -0400
committerEliot Horowitz <eliot@10gen.com>2013-08-16 09:18:46 -0400
commitac1c12cb75ee05528e569311a7adfdf2fff9773f (patch)
tree778d99cca57bdf286e6fd27fba2eaf13d5d2564a
parent0ea79f6e86fb059478468a583f30cda8a1360318 (diff)
downloadmongo-ac1c12cb75ee05528e569311a7adfdf2fff9773f.tar.gz
SERVER-6405: don't throw away Collection* across yield
-rw-r--r--src/mongo/db/structure/collection.cpp9
-rw-r--r--src/mongo/db/structure/collection.h6
-rw-r--r--src/mongo/db/structure/collection_iterator.cpp34
-rw-r--r--src/mongo/db/structure/collection_iterator.h3
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;