diff options
author | Mathias Stearn <mathias@10gen.com> | 2014-06-19 13:38:24 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2014-06-19 19:35:15 -0400 |
commit | 98a0c6f7c2a91d28a1f48c8fb0805e6745f0e8f9 (patch) | |
tree | 1570eec49263742ff2d7219fffb8f4610b3e0d16 | |
parent | 527ee3561d90aad6a66c7c656d2950eef6f1331b (diff) | |
download | mongo-98a0c6f7c2a91d28a1f48c8fb0805e6745f0e8f9.tar.gz |
SERVER-13635 IndexAccessMethods now take a BtreeInterface rather than a RecordStore
21 files changed, 88 insertions, 58 deletions
diff --git a/src/mongo/db/index/2d_access_method.cpp b/src/mongo/db/index/2d_access_method.cpp index 8823c3a08c9..c7b85ca1c28 100644 --- a/src/mongo/db/index/2d_access_method.cpp +++ b/src/mongo/db/index/2d_access_method.cpp @@ -42,8 +42,8 @@ namespace mongo { TwoDAccessMethod::TwoDAccessMethod(IndexCatalogEntry* btreeState, - RecordStore* rs) - : BtreeBasedAccessMethod(btreeState, rs) { + BtreeInterface* btree) + : BtreeBasedAccessMethod(btreeState, btree) { const IndexDescriptor* descriptor = btreeState->descriptor(); diff --git a/src/mongo/db/index/2d_access_method.h b/src/mongo/db/index/2d_access_method.h index 2f8eea41959..c45349b8ff8 100644 --- a/src/mongo/db/index/2d_access_method.h +++ b/src/mongo/db/index/2d_access_method.h @@ -69,7 +69,7 @@ namespace mongo { using BtreeBasedAccessMethod::_descriptor; TwoDAccessMethod(IndexCatalogEntry* btreeState, - RecordStore* rs); + BtreeInterface* btree); virtual ~TwoDAccessMethod() { } private: diff --git a/src/mongo/db/index/btree_access_method.cpp b/src/mongo/db/index/btree_access_method.cpp index e0586e42918..7f7de5072c2 100644 --- a/src/mongo/db/index/btree_access_method.cpp +++ b/src/mongo/db/index/btree_access_method.cpp @@ -40,8 +40,8 @@ namespace mongo { // Standard Btree implementation below. - BtreeAccessMethod::BtreeAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs ) - : BtreeBasedAccessMethod(btreeState, rs) { + BtreeAccessMethod::BtreeAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree ) + : BtreeBasedAccessMethod(btreeState, btree) { // The key generation wants these values. vector<const char*> fieldNames; diff --git a/src/mongo/db/index/btree_access_method.h b/src/mongo/db/index/btree_access_method.h index 74c4cdfc997..18da7a970f2 100644 --- a/src/mongo/db/index/btree_access_method.h +++ b/src/mongo/db/index/btree_access_method.h @@ -52,7 +52,7 @@ namespace mongo { using BtreeBasedAccessMethod::_descriptor; BtreeAccessMethod(IndexCatalogEntry* btreeState, - RecordStore* rs ); + BtreeInterface* btree ); virtual ~BtreeAccessMethod() { } private: diff --git a/src/mongo/db/index/btree_based_access_method.cpp b/src/mongo/db/index/btree_based_access_method.cpp index b680ad07ba8..34b51753569 100644 --- a/src/mongo/db/index/btree_based_access_method.cpp +++ b/src/mongo/db/index/btree_based_access_method.cpp @@ -50,31 +50,19 @@ namespace mongo { MONGO_EXPORT_SERVER_PARAMETER(failIndexKeyTooLong, bool, true); - /** - * Invalidates all active cursors, which point at the bucket being deleted. - */ - class InvalidateCursorsNotification : public BucketDeletionNotification { - public: - virtual void aboutToDeleteBucket(const DiskLoc& bucket) { - BtreeIndexCursor::aboutToDeleteBucket(bucket); - } - }; + void BtreeBasedAccessMethod::InvalidateCursorsNotification::aboutToDeleteBucket( + const DiskLoc& bucket) { + BtreeIndexCursor::aboutToDeleteBucket(bucket); + } - static InvalidateCursorsNotification invalidateCursors; + BtreeBasedAccessMethod::InvalidateCursorsNotification BtreeBasedAccessMethod::invalidateCursors; BtreeBasedAccessMethod::BtreeBasedAccessMethod(IndexCatalogEntry* btreeState, - RecordStore* recordStore) + BtreeInterface* btree) : _btreeState(btreeState), - _recordStore( recordStore ), - _descriptor(btreeState->descriptor()) { - + _descriptor(btreeState->descriptor()), + _newInterface(btree) { verify(0 == _descriptor->version() || 1 == _descriptor->version()); - _newInterface.reset(BtreeInterface::getInterface(btreeState->headManager(), - recordStore, - btreeState->ordering(), - _descriptor->indexNamespace(), - _descriptor->version(), - &invalidateCursors)); } // Find the keys for obj, put them in the tree pointing to loc @@ -224,7 +212,7 @@ namespace mongo { Status BtreeBasedAccessMethod::touch( OperationContext* txn ) const { - return _recordStore->touch( txn, NULL ); + return _btree->touch(txn); } DiskLoc BtreeBasedAccessMethod::findSingle(const BSONObj& key) const { diff --git a/src/mongo/db/index/btree_based_access_method.h b/src/mongo/db/index/btree_based_access_method.h index 94b78c260c6..ed82ff6dc48 100644 --- a/src/mongo/db/index/btree_based_access_method.h +++ b/src/mongo/db/index/btree_based_access_method.h @@ -37,11 +37,11 @@ #include "mongo/db/index/index_cursor.h" #include "mongo/db/index/index_descriptor.h" #include "mongo/db/structure/btree/btree_interface.h" +#include "mongo/db/structure/btree/bucket_deletion_notification.h" namespace mongo { class ExternalSortComparison; - class RecordStore; /** * Any access method that is Btree based subclasses from this. @@ -58,7 +58,7 @@ namespace mongo { MONGO_DISALLOW_COPYING( BtreeBasedAccessMethod ); public: BtreeBasedAccessMethod( IndexCatalogEntry* btreeState, - RecordStore* recordStore ); + BtreeInterface* btree ); virtual ~BtreeBasedAccessMethod() { } @@ -103,6 +103,16 @@ namespace mongo { // XXX: consider migrating callers to use IndexCursor instead virtual DiskLoc findSingle( const BSONObj& key ) const; + /** + * Invalidates all active cursors, which point at the bucket being deleted. + * TODO see if there is a better place to put this. + */ + class InvalidateCursorsNotification : public BucketDeletionNotification { + public: + virtual void aboutToDeleteBucket(const DiskLoc& bucket); + }; + static InvalidateCursorsNotification invalidateCursors; + protected: // Friends who need getKeys. friend class BtreeBasedBulkAccessMethod; @@ -113,7 +123,7 @@ namespace mongo { virtual void getKeys(const BSONObj &obj, BSONObjSet *keys) = 0; IndexCatalogEntry* _btreeState; // owned by IndexCatalogEntry - scoped_ptr<RecordStore> _recordStore; // owned by us + scoped_ptr<BtreeInterface> _btree; // owned by us const IndexDescriptor* _descriptor; private: diff --git a/src/mongo/db/index/btree_based_bulk_access_method.cpp b/src/mongo/db/index/btree_based_bulk_access_method.cpp index dec127174bf..d6645c9aca5 100644 --- a/src/mongo/db/index/btree_based_bulk_access_method.cpp +++ b/src/mongo/db/index/btree_based_bulk_access_method.cpp @@ -113,13 +113,6 @@ namespace mongo { Status BtreeBasedBulkAccessMethod::commit(set<DiskLoc>* dupsToDrop, bool mayInterrupt) { - DiskLoc oldHead = _real->_btreeState->head(); - - // XXX: do we expect the tree to be empty but have a head set? Looks like so from old code. - invariant(!oldHead.isNull()); - _real->_btreeState->setHead(_txn, DiskLoc()); - _real->_recordStore->deleteRecord(_txn, oldHead); - if (_isMultiKey) { _real->_btreeState->setMultikey( _txn ); } diff --git a/src/mongo/db/index/fts_access_method.cpp b/src/mongo/db/index/fts_access_method.cpp index 5eb20d4f8cf..8630451b29d 100644 --- a/src/mongo/db/index/fts_access_method.cpp +++ b/src/mongo/db/index/fts_access_method.cpp @@ -31,8 +31,8 @@ namespace mongo { - FTSAccessMethod::FTSAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs ) - : BtreeBasedAccessMethod(btreeState, rs), _ftsSpec(btreeState->descriptor()->infoObj()) { } + FTSAccessMethod::FTSAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree ) + : BtreeBasedAccessMethod(btreeState, btree), _ftsSpec(btreeState->descriptor()->infoObj()) { } void FTSAccessMethod::getKeys(const BSONObj& obj, BSONObjSet* keys) { ExpressionKeysPrivate::getFTSKeys(obj, _ftsSpec, keys); diff --git a/src/mongo/db/index/fts_access_method.h b/src/mongo/db/index/fts_access_method.h index 2ea4fecc375..66d04f1957e 100644 --- a/src/mongo/db/index/fts_access_method.h +++ b/src/mongo/db/index/fts_access_method.h @@ -38,7 +38,7 @@ namespace mongo { class FTSAccessMethod : public BtreeBasedAccessMethod { public: - FTSAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs ); + FTSAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree ); virtual ~FTSAccessMethod() { } const fts::FTSSpec& getSpec() const { return _ftsSpec; } diff --git a/src/mongo/db/index/hash_access_method.cpp b/src/mongo/db/index/hash_access_method.cpp index bb3684c020a..173aaa91838 100644 --- a/src/mongo/db/index/hash_access_method.cpp +++ b/src/mongo/db/index/hash_access_method.cpp @@ -33,8 +33,8 @@ namespace mongo { - HashAccessMethod::HashAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs) - : BtreeBasedAccessMethod(btreeState, rs) { + HashAccessMethod::HashAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree) + : BtreeBasedAccessMethod(btreeState, btree) { const IndexDescriptor* descriptor = btreeState->descriptor(); diff --git a/src/mongo/db/index/hash_access_method.h b/src/mongo/db/index/hash_access_method.h index ac6139e4d34..ff090cbfd58 100644 --- a/src/mongo/db/index/hash_access_method.h +++ b/src/mongo/db/index/hash_access_method.h @@ -45,7 +45,7 @@ namespace mongo { public: using BtreeBasedAccessMethod::_descriptor; - HashAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs); + HashAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree); virtual ~HashAccessMethod() { } private: diff --git a/src/mongo/db/index/haystack_access_method.cpp b/src/mongo/db/index/haystack_access_method.cpp index 9bf1ee6593b..e34ced1f2aa 100644 --- a/src/mongo/db/index/haystack_access_method.cpp +++ b/src/mongo/db/index/haystack_access_method.cpp @@ -39,8 +39,8 @@ namespace mongo { - HaystackAccessMethod::HaystackAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs) - : BtreeBasedAccessMethod(btreeState, rs) { + HaystackAccessMethod::HaystackAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree) + : BtreeBasedAccessMethod(btreeState, btree) { const IndexDescriptor* descriptor = btreeState->descriptor(); diff --git a/src/mongo/db/index/haystack_access_method.h b/src/mongo/db/index/haystack_access_method.h index e1a4fe9e7df..5ce9d787450 100644 --- a/src/mongo/db/index/haystack_access_method.h +++ b/src/mongo/db/index/haystack_access_method.h @@ -57,7 +57,7 @@ namespace mongo { public: using BtreeBasedAccessMethod::_descriptor; - HaystackAccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs); + HaystackAccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree); virtual ~HaystackAccessMethod() { } protected: diff --git a/src/mongo/db/index/s2_access_method.cpp b/src/mongo/db/index/s2_access_method.cpp index c75ec66d44e..8b97e3ff556 100644 --- a/src/mongo/db/index/s2_access_method.cpp +++ b/src/mongo/db/index/s2_access_method.cpp @@ -43,8 +43,8 @@ namespace mongo { static const string kIndexVersionFieldName("2dsphereIndexVersion"); - S2AccessMethod::S2AccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs) - : BtreeBasedAccessMethod(btreeState, rs) { + S2AccessMethod::S2AccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree) + : BtreeBasedAccessMethod(btreeState, btree) { const IndexDescriptor* descriptor = btreeState->descriptor(); diff --git a/src/mongo/db/index/s2_access_method.h b/src/mongo/db/index/s2_access_method.h index 666d2bb1e98..d189e8229db 100644 --- a/src/mongo/db/index/s2_access_method.h +++ b/src/mongo/db/index/s2_access_method.h @@ -43,7 +43,7 @@ namespace mongo { public: using BtreeBasedAccessMethod::_descriptor; - S2AccessMethod(IndexCatalogEntry* btreeState, RecordStore* rs); + S2AccessMethod(IndexCatalogEntry* btreeState, BtreeInterface* btree); virtual ~S2AccessMethod() { } /** diff --git a/src/mongo/db/storage/heap1/heap1_database_catalog_entry.cpp b/src/mongo/db/storage/heap1/heap1_database_catalog_entry.cpp index 909ee979bbc..25b107fcf9a 100644 --- a/src/mongo/db/storage/heap1/heap1_database_catalog_entry.cpp +++ b/src/mongo/db/storage/heap1/heap1_database_catalog_entry.cpp @@ -148,7 +148,15 @@ namespace mongo { invariant( type.empty() ); // we don't support other index types right now HeapRecordStore* rs = new HeapRecordStore( index->descriptor()->indexName() ); - i->second->access.reset( new BtreeAccessMethod( index, rs ) ); + std::auto_ptr<BtreeInterface> btree( + BtreeInterface::getInterface(index->headManager(), + rs, + index->ordering(), + index->descriptor()->indexNamespace(), + index->descriptor()->version(), + &BtreeBasedAccessMethod::invalidateCursors)); + + i->second->access.reset( new BtreeAccessMethod( index, btree.release()) ); } return i->second->access.get(); diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp index 08f36b9e8a1..e5855c3ed83 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp @@ -529,23 +529,31 @@ namespace mongo { RecordStore* rs = _getRecordStore( txn, entry->descriptor()->indexNamespace() ); invariant( rs ); + std::auto_ptr<BtreeInterface> btree( + BtreeInterface::getInterface(entry->headManager(), + rs, + entry->ordering(), + entry->descriptor()->indexNamespace(), + entry->descriptor()->version(), + &BtreeBasedAccessMethod::invalidateCursors)); + if (IndexNames::HASHED == type) - return new HashAccessMethod( entry, rs ); + return new HashAccessMethod( entry, btree.release() ); if (IndexNames::GEO_2DSPHERE == type) - return new S2AccessMethod( entry, rs ); + return new S2AccessMethod( entry, btree.release() ); if (IndexNames::TEXT == type) - return new FTSAccessMethod( entry, rs ); + return new FTSAccessMethod( entry, btree.release() ); if (IndexNames::GEO_HAYSTACK == type) - return new HaystackAccessMethod( entry, rs ); + return new HaystackAccessMethod( entry, btree.release() ); if ("" == type) - return new BtreeAccessMethod( entry, rs ); + return new BtreeAccessMethod( entry, btree.release() ); if (IndexNames::GEO_2D == type) - return new TwoDAccessMethod( entry, rs ); + return new TwoDAccessMethod( entry, btree.release() ); log() << "Can't find index for keyPattern " << entry->descriptor()->keyPattern(); fassertFailed(17489); diff --git a/src/mongo/db/structure/btree/btree_interface.cpp b/src/mongo/db/structure/btree/btree_interface.cpp index 0b5c0461121..7c1c1c468d6 100644 --- a/src/mongo/db/structure/btree/btree_interface.cpp +++ b/src/mongo/db/structure/btree/btree_interface.cpp @@ -110,6 +110,10 @@ namespace mongo { return _btree->isEmpty(); } + virtual Status touch(OperationContext* txn) const{ + return _btree->touch(txn); + } + class Cursor : public BtreeInterface::Cursor { public: Cursor(const BtreeLogic<OnDiskFormat>* btree, int direction) diff --git a/src/mongo/db/structure/btree/btree_interface.h b/src/mongo/db/structure/btree/btree_interface.h index 45e0f1bc070..f132b0e0606 100644 --- a/src/mongo/db/structure/btree/btree_interface.h +++ b/src/mongo/db/structure/btree/btree_interface.h @@ -121,6 +121,11 @@ namespace mongo { virtual void fullValidate(long long* numKeysOut) = 0; virtual bool isEmpty() = 0; + + /** + * Attempt to bring whole index into memory. No-op is ok if not supported. + */ + virtual Status touch(OperationContext* txn) const = 0; // // Navigation diff --git a/src/mongo/db/structure/btree/btree_logic.cpp b/src/mongo/db/structure/btree/btree_logic.cpp index 0d02ed8d44d..e800110351a 100644 --- a/src/mongo/db/structure/btree/btree_logic.cpp +++ b/src/mongo/db/structure/btree/btree_logic.cpp @@ -56,6 +56,13 @@ namespace mongo { _numAdded(0), _txn(txn) { + // XXX: Due to the way bulk building works, we already have an empty root bucket that we + // must now dispose of. + DiskLoc oldHead = _logic->_headManager->getHead(); + invariant(!oldHead.isNull()); + _logic->_headManager->setHead(_txn, DiskLoc()); + _logic->_recordStore->deleteRecord(_txn, oldHead); + _first = _cur = _logic->_addBucket(txn); _b = _getModifiableBucket(_cur); _committed = false; @@ -2042,6 +2049,11 @@ namespace mongo { } template <class BtreeLayout> + Status BtreeLogic<BtreeLayout>::touch(OperationContext* txn) const { + return _recordStore->touch( txn, NULL ); + } + + template <class BtreeLayout> long long BtreeLogic<BtreeLayout>::fullValidate(long long *unusedCount, bool strict, bool dumpBuckets, diff --git a/src/mongo/db/structure/btree/btree_logic.h b/src/mongo/db/structure/btree/btree_logic.h index 65ddc6fd46d..94b82ed99bd 100644 --- a/src/mongo/db/structure/btree/btree_logic.h +++ b/src/mongo/db/structure/btree/btree_logic.h @@ -178,6 +178,10 @@ namespace mongo { BSONObj getKey(const DiskLoc& bucketLoc, const int keyOffset) const; + DiskLoc getHead() const { return _headManager->getHead(); } + + Status touch(OperationContext* txn) const; + // // Composite key navigation methods // @@ -206,8 +210,6 @@ namespace mongo { DiskLoc* bucketInOut, int* keyOffsetInOut) const; - DiskLoc getHead() const { return _headManager->getHead(); } - // // Creation and deletion // |