diff options
author | Benety Goh <benety@mongodb.com> | 2018-10-12 06:03:01 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2018-10-12 06:03:15 -0400 |
commit | 849c85561e065598813d6a702ce132f494380eed (patch) | |
tree | 7467d8bbc8f877585918242799043b3cdbad0f63 | |
parent | 6ac6f0efe6e2b6452f2238beb765396f983c53cb (diff) | |
download | mongo-849c85561e065598813d6a702ce132f494380eed.tar.gz |
SERVER-36889 unshim IndexCatalogEntry
-rw-r--r-- | src/mongo/db/catalog/index_catalog_entry.cpp | 25 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog_entry.h | 188 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog_entry_impl.cpp | 19 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog_entry_impl.h | 3 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog_impl.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_create.h | 1 |
6 files changed, 39 insertions, 208 deletions
diff --git a/src/mongo/db/catalog/index_catalog_entry.cpp b/src/mongo/db/catalog/index_catalog_entry.cpp index 1972c2237d4..3922d2571be 100644 --- a/src/mongo/db/catalog/index_catalog_entry.cpp +++ b/src/mongo/db/catalog/index_catalog_entry.cpp @@ -36,30 +36,6 @@ #include "mongo/db/index/index_descriptor.h" namespace mongo { -IndexCatalogEntry::Impl::~Impl() = default; - -MONGO_DEFINE_SHIM(IndexCatalogEntry::makeImpl); - -void IndexCatalogEntry::TUHook::hook() noexcept {} - -IndexCatalogEntry::IndexCatalogEntry(OperationContext* opCtx, - StringData ns, - CollectionCatalogEntry* collection, - std::unique_ptr<IndexDescriptor> descriptor, - CollectionInfoCache* infoCache) - : _pimpl(makeImpl(this, - opCtx, - ns, - collection, - std::move(descriptor), - infoCache, - PrivateCall<IndexCatalogEntry>{})) {} - -void IndexCatalogEntry::init(std::unique_ptr<IndexAccessMethod> accessMethod) { - return this->_impl().init(std::move(accessMethod)); -} - -// ------------------ const IndexCatalogEntry* IndexCatalogEntryContainer::find(const IndexDescriptor* desc) const { if (desc->_cachedEntry) @@ -104,4 +80,5 @@ IndexCatalogEntry* IndexCatalogEntryContainer::release(const IndexDescriptor* de } return nullptr; } + } // namespace mongo diff --git a/src/mongo/db/catalog/index_catalog_entry.h b/src/mongo/db/catalog/index_catalog_entry.h index 98f7554b058..67edd00b3c3 100644 --- a/src/mongo/db/catalog/index_catalog_entry.h +++ b/src/mongo/db/catalog/index_catalog_entry.h @@ -32,7 +32,6 @@ #include <string> #include "mongo/base/owned_pointer_vector.h" -#include "mongo/base/shim.h" #include "mongo/bson/ordering.h" #include "mongo/bson/timestamp.h" #include "mongo/db/index/multikey_paths.h" @@ -55,144 +54,46 @@ class OperationContext; class IndexCatalogEntry { public: - // This class represents the internal vtable for the (potentially polymorphic) implementation of - // the `IndexCatalogEntry` class. This allows us to expose an interface to this object without - // requiring a dependency upon the implementation's definition library. - class Impl { - public: - virtual ~Impl() = 0; - - virtual const std::string& ns() const = 0; - - virtual void init(std::unique_ptr<IndexAccessMethod> accessMethod) = 0; - - virtual IndexDescriptor* descriptor() = 0; - - virtual const IndexDescriptor* descriptor() const = 0; - - virtual IndexAccessMethod* accessMethod() = 0; - - virtual const IndexAccessMethod* accessMethod() const = 0; - - virtual const Ordering& ordering() const = 0; - - virtual const MatchExpression* getFilterExpression() const = 0; - - virtual const CollatorInterface* getCollator() const = 0; - - virtual const RecordId& head(OperationContext* opCtx) const = 0; - - virtual void setHead(OperationContext* opCtx, RecordId newHead) = 0; - - virtual void setIsReady(bool newIsReady) = 0; - - virtual HeadManager* headManager() const = 0; - - virtual bool isMultikey(OperationContext* opCtx) const = 0; - - virtual MultikeyPaths getMultikeyPaths(OperationContext* opCtx) const = 0; - - virtual void setMultikey(OperationContext* opCtx, const MultikeyPaths& multikeyPaths) = 0; - - // TODO SERVER-36385 Remove this function: we don't set the feature tracker bit in 4.4 - // because 4.4 can only downgrade to 4.2 which can read long TypeBits. - virtual void setIndexKeyStringWithLongTypeBitsExistsOnDisk(OperationContext* opCtx) = 0; - - virtual bool isReady(OperationContext* opCtx) const = 0; - - virtual KVPrefix getPrefix() const = 0; - - virtual boost::optional<Timestamp> getMinimumVisibleSnapshot() = 0; - - virtual void setMinimumVisibleSnapshot(Timestamp name) = 0; - }; - -public: - static MONGO_DECLARE_SHIM((IndexCatalogEntry * this_, - OperationContext* opCtx, - StringData ns, - CollectionCatalogEntry* collection, - std::unique_ptr<IndexDescriptor> descriptor, - CollectionInfoCache* infoCache, - PrivateTo<IndexCatalogEntry>) - ->std::unique_ptr<Impl>) makeImpl; - - explicit IndexCatalogEntry( - OperationContext* opCtx, - StringData ns, - CollectionCatalogEntry* collection, // not owned - std::unique_ptr<IndexDescriptor> descriptor, // ownership passes to me - CollectionInfoCache* infoCache); // not owned, optional - - // Do not call this function. It exists for use with test drivers that need to inject - // alternative implementations. - explicit IndexCatalogEntry(std::unique_ptr<Impl> impl) : _pimpl(std::move(impl)) {} - - inline ~IndexCatalogEntry() = default; + IndexCatalogEntry() = default; + virtual ~IndexCatalogEntry() = default; inline IndexCatalogEntry(IndexCatalogEntry&&) = delete; inline IndexCatalogEntry& operator=(IndexCatalogEntry&&) = delete; - inline const std::string& ns() const { - return this->_impl().ns(); - } + virtual const std::string& ns() const = 0; - void init(std::unique_ptr<IndexAccessMethod> accessMethod); + virtual void init(std::unique_ptr<IndexAccessMethod> accessMethod) = 0; - inline IndexDescriptor* descriptor() { - return this->_impl().descriptor(); - } + virtual IndexDescriptor* descriptor() = 0; - inline const IndexDescriptor* descriptor() const { - return this->_impl().descriptor(); - } + virtual const IndexDescriptor* descriptor() const = 0; - inline IndexAccessMethod* accessMethod() { - return this->_impl().accessMethod(); - } + virtual IndexAccessMethod* accessMethod() = 0; - inline const IndexAccessMethod* accessMethod() const { - return this->_impl().accessMethod(); - } + virtual const IndexAccessMethod* accessMethod() const = 0; - inline const Ordering& ordering() const { - return this->_impl().ordering(); - } + virtual const Ordering& ordering() const = 0; - inline const MatchExpression* getFilterExpression() const { - return this->_impl().getFilterExpression(); - } + virtual const MatchExpression* getFilterExpression() const = 0; - inline const CollatorInterface* getCollator() const { - return this->_impl().getCollator(); - } + virtual const CollatorInterface* getCollator() const = 0; /// --------------------- - inline const RecordId& head(OperationContext* const opCtx) const { - return this->_impl().head(opCtx); - } + virtual const RecordId& head(OperationContext* const opCtx) const = 0; - inline void setHead(OperationContext* const opCtx, const RecordId newHead) { - return this->_impl().setHead(opCtx, newHead); - } + virtual void setHead(OperationContext* const opCtx, const RecordId newHead) = 0; - inline void setIsReady(const bool newIsReady) { - return this->_impl().setIsReady(newIsReady); - } + virtual void setIsReady(const bool newIsReady) = 0; - inline HeadManager* headManager() const { - return this->_impl().headManager(); - } + virtual HeadManager* headManager() const = 0; // -- /** * Returns true if this index is multikey and false otherwise. */ - inline bool isMultikey(OperationContext* opCtx) const { - return this->_impl().isMultikey(opCtx); - } + virtual bool isMultikey(OperationContext* opCtx) const = 0; /** * Returns the path components that cause this index to be multikey if this index supports @@ -203,9 +104,7 @@ public: * returns a vector with size equal to the number of elements in the index key pattern where * each element in the vector is an empty set. */ - inline MultikeyPaths getMultikeyPaths(OperationContext* const opCtx) const { - return this->_impl().getMultikeyPaths(opCtx); - } + virtual MultikeyPaths getMultikeyPaths(OperationContext* const opCtx) const = 0; /** * Sets this index to be multikey. Information regarding which newly detected path components @@ -222,59 +121,26 @@ public: * namespace, index name, and multikey paths on the OperationContext rather than set the index * as multikey here. */ - void setMultikey(OperationContext* const opCtx, const MultikeyPaths& multikeyPaths) { - return this->_impl().setMultikey(opCtx, multikeyPaths); - } + virtual void setMultikey(OperationContext* const opCtx, const MultikeyPaths& multikeyPaths) = 0; - void setIndexKeyStringWithLongTypeBitsExistsOnDisk(OperationContext* const opCtx) { - return this->_impl().setIndexKeyStringWithLongTypeBitsExistsOnDisk(opCtx); - } + /** + * TODO SERVER-36385 Remove this function: we don't set the feature tracker bit in 4.4 + * because 4.4 can only downgrade to 4.2 which can read long TypeBits. + */ + virtual void setIndexKeyStringWithLongTypeBitsExistsOnDisk(OperationContext* const opCtx) = 0; // if this ready is ready for queries - bool isReady(OperationContext* const opCtx) const { - return this->_impl().isReady(opCtx); - } + virtual bool isReady(OperationContext* const opCtx) const = 0; - KVPrefix getPrefix() const { - return this->_impl().getPrefix(); - } + virtual KVPrefix getPrefix() const = 0; /** * If return value is not boost::none, reads with majority read concern using an older snapshot * must treat this index as unfinished. */ - boost::optional<Timestamp> getMinimumVisibleSnapshot() { - return this->_impl().getMinimumVisibleSnapshot(); - } - - void setMinimumVisibleSnapshot(const Timestamp name) { - return this->_impl().setMinimumVisibleSnapshot(name); - } - -private: - // This structure exists to give us a customization point to decide how to force users of this - // class to depend upon the corresponding `index_catalog_entry.cpp` Translation Unit (TU). All - // public forwarding functions call `_impl(), and `_impl` creates an instance of this structure. - struct TUHook { - static void hook() noexcept; - - explicit inline TUHook() noexcept { - if (kDebugBuild) - this->hook(); - } - }; - - inline const Impl& _impl() const { - TUHook{}; - return *this->_pimpl; - } - - inline Impl& _impl() { - TUHook{}; - return *this->_pimpl; - } + virtual boost::optional<Timestamp> getMinimumVisibleSnapshot() = 0; - std::unique_ptr<Impl> _pimpl; + virtual void setMinimumVisibleSnapshot(const Timestamp name) = 0; }; class IndexCatalogEntryContainer { diff --git a/src/mongo/db/catalog/index_catalog_entry_impl.cpp b/src/mongo/db/catalog/index_catalog_entry_impl.cpp index 9d24c7c7c08..a4d810a85d6 100644 --- a/src/mongo/db/catalog/index_catalog_entry_impl.cpp +++ b/src/mongo/db/catalog/index_catalog_entry_impl.cpp @@ -54,18 +54,6 @@ #include "mongo/util/scopeguard.h" namespace mongo { -MONGO_REGISTER_SHIM(IndexCatalogEntry::makeImpl) -(IndexCatalogEntry* const this_, - OperationContext* const opCtx, - const StringData ns, - CollectionCatalogEntry* const collection, - std::unique_ptr<IndexDescriptor> descriptor, - CollectionInfoCache* const infoCache, - PrivateTo<IndexCatalogEntry>) - ->std::unique_ptr<IndexCatalogEntry::Impl> { - return std::make_unique<IndexCatalogEntryImpl>( - this_, opCtx, ns, collection, std::move(descriptor), infoCache); -} using std::string; @@ -87,8 +75,7 @@ private: IndexCatalogEntry* _catalogEntry; }; -IndexCatalogEntryImpl::IndexCatalogEntryImpl(IndexCatalogEntry* const this_, - OperationContext* const opCtx, +IndexCatalogEntryImpl::IndexCatalogEntryImpl(OperationContext* const opCtx, const StringData ns, CollectionCatalogEntry* const collection, std::unique_ptr<IndexDescriptor> descriptor, @@ -97,11 +84,11 @@ IndexCatalogEntryImpl::IndexCatalogEntryImpl(IndexCatalogEntry* const this_, _collection(collection), _descriptor(std::move(descriptor)), _infoCache(infoCache), - _headManager(stdx::make_unique<HeadManagerImpl>(this_)), + _headManager(stdx::make_unique<HeadManagerImpl>(this)), _ordering(Ordering::make(_descriptor->keyPattern())), _isReady(false), _prefix(collection->getIndexPrefix(opCtx, _descriptor->indexName())) { - _descriptor->_cachedEntry = this_; + _descriptor->_cachedEntry = this; _isReady = _catalogIsReady(opCtx); _head = _catalogHead(opCtx); diff --git a/src/mongo/db/catalog/index_catalog_entry_impl.h b/src/mongo/db/catalog/index_catalog_entry_impl.h index e663d67c051..b949e589e5f 100644 --- a/src/mongo/db/catalog/index_catalog_entry_impl.h +++ b/src/mongo/db/catalog/index_catalog_entry_impl.h @@ -53,12 +53,11 @@ class IndexDescriptor; class MatchExpression; class OperationContext; -class IndexCatalogEntryImpl : public IndexCatalogEntry::Impl { +class IndexCatalogEntryImpl : public IndexCatalogEntry { MONGO_DISALLOW_COPYING(IndexCatalogEntryImpl); public: explicit IndexCatalogEntryImpl( - IndexCatalogEntry* this_, OperationContext* opCtx, StringData ns, CollectionCatalogEntry* collection, // not owned diff --git a/src/mongo/db/catalog/index_catalog_impl.cpp b/src/mongo/db/catalog/index_catalog_impl.cpp index 16323385052..3539a9d08b0 100644 --- a/src/mongo/db/catalog/index_catalog_impl.cpp +++ b/src/mongo/db/catalog/index_catalog_impl.cpp @@ -42,6 +42,7 @@ #include "mongo/db/catalog/collection.h" #include "mongo/db/catalog/collection_catalog_entry.h" #include "mongo/db/catalog/database_catalog_entry.h" +#include "mongo/db/catalog/index_catalog_entry_impl.h" #include "mongo/db/catalog/index_create.h" #include "mongo/db/catalog/index_key_validate.h" #include "mongo/db/client.h" @@ -143,11 +144,11 @@ IndexCatalogEntry* IndexCatalogImpl::_setupInMemoryStructures( } auto* const descriptorPtr = descriptor.get(); - auto entry = stdx::make_unique<IndexCatalogEntry>(opCtx, - _collection->ns().ns(), - _collection->getCatalogEntry(), - std::move(descriptor), - _collection->infoCache()); + auto entry = stdx::make_unique<IndexCatalogEntryImpl>(opCtx, + _collection->ns().ns(), + _collection->getCatalogEntry(), + std::move(descriptor), + _collection->infoCache()); std::unique_ptr<IndexAccessMethod> accessMethod( _collection->dbce()->getIndex(opCtx, _collection->getCatalogEntry(), entry.get())); entry->init(std::move(accessMethod)); diff --git a/src/mongo/db/catalog/index_create.h b/src/mongo/db/catalog/index_create.h index 3aabd68ed1c..62d9d29eb13 100644 --- a/src/mongo/db/catalog/index_create.h +++ b/src/mongo/db/catalog/index_create.h @@ -34,6 +34,7 @@ #include <vector> #include "mongo/base/disallow_copying.h" +#include "mongo/base/shim.h" #include "mongo/base/status.h" #include "mongo/db/catalog/index_catalog.h" #include "mongo/db/catalog/index_catalog_impl.h" |