summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2014-06-19 13:38:24 -0400
committerMathias Stearn <mathias@10gen.com>2014-06-19 19:35:15 -0400
commit98a0c6f7c2a91d28a1f48c8fb0805e6745f0e8f9 (patch)
tree1570eec49263742ff2d7219fffb8f4610b3e0d16
parent527ee3561d90aad6a66c7c656d2950eef6f1331b (diff)
downloadmongo-98a0c6f7c2a91d28a1f48c8fb0805e6745f0e8f9.tar.gz
SERVER-13635 IndexAccessMethods now take a BtreeInterface rather than a RecordStore
-rw-r--r--src/mongo/db/index/2d_access_method.cpp4
-rw-r--r--src/mongo/db/index/2d_access_method.h2
-rw-r--r--src/mongo/db/index/btree_access_method.cpp4
-rw-r--r--src/mongo/db/index/btree_access_method.h2
-rw-r--r--src/mongo/db/index/btree_based_access_method.cpp30
-rw-r--r--src/mongo/db/index/btree_based_access_method.h16
-rw-r--r--src/mongo/db/index/btree_based_bulk_access_method.cpp7
-rw-r--r--src/mongo/db/index/fts_access_method.cpp4
-rw-r--r--src/mongo/db/index/fts_access_method.h2
-rw-r--r--src/mongo/db/index/hash_access_method.cpp4
-rw-r--r--src/mongo/db/index/hash_access_method.h2
-rw-r--r--src/mongo/db/index/haystack_access_method.cpp4
-rw-r--r--src/mongo/db/index/haystack_access_method.h2
-rw-r--r--src/mongo/db/index/s2_access_method.cpp4
-rw-r--r--src/mongo/db/index/s2_access_method.h2
-rw-r--r--src/mongo/db/storage/heap1/heap1_database_catalog_entry.cpp10
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp20
-rw-r--r--src/mongo/db/structure/btree/btree_interface.cpp4
-rw-r--r--src/mongo/db/structure/btree/btree_interface.h5
-rw-r--r--src/mongo/db/structure/btree/btree_logic.cpp12
-rw-r--r--src/mongo/db/structure/btree/btree_logic.h6
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
//