34 #include "mongo/base/clonable_ptr.h" 35 #include "mongo/base/shim.h" 37 #include "mongo/db/index/multikey_paths.h" 38 #include "mongo/db/jsobj.h" 39 #include "mongo/db/operation_context.h" 40 #include "mongo/db/record_id.h" 41 #include "mongo/db/server_options.h" 48 class IndexDescriptor;
49 class IndexAccessMethod;
50 struct InsertDeleteOptions;
74 inline std::unique_ptr<Impl>
clone()
const {
75 return std::unique_ptr<Impl>{this->
clone_impl()};
78 virtual bool more() = 0;
79 virtual IndexDescriptor*
next() = 0;
89 PrivateTo<IndexIterator>)
90 ->std::unique_ptr<Impl>) makeImpl;
112 inline IndexDescriptor*
next() {
132 static void hook() noexcept;
161 virtual bool ok()
const = 0;
180 OperationContext*
opCtx,
182 const BSONObj& collationSpec,
188 std::vector<IndexDescriptor*>* matches)
const = 0;
191 const BSONObj& shardKey,
192 bool requireSingleKey)
const = 0;
195 const std::string& type,
196 std::vector<IndexDescriptor*>& matches,
200 const IndexDescriptor* oldDesc) = 0;
204 virtual IndexAccessMethod*
getIndex(
const IndexDescriptor*
desc) = 0;
206 virtual const IndexAccessMethod*
getIndex(
const IndexDescriptor*
desc)
const = 0;
214 const BSONObj& original)
const = 0;
217 OperationContext*
opCtx,
218 bool includingIdIndex,
219 stdx::function<
void(
const IndexDescriptor*)> onDropFn =
nullptr) = 0;
228 const IndexDescriptor*
idx) = 0;
231 const std::vector<BsonRecord>& bsonRecords,
232 int64_t* keysInsertedOut) = 0;
238 int64_t* keysDeletedOut) = 0;
241 const BSONObj& keyPattern) = 0;
244 const std::string& newPluginName) = 0;
251 OperationContext*
opCtx,
253 bool initFromDisk) = 0;
260 const std::string& indexName,
261 const std::string& indexNamespace) = 0;
270 PrivateTo<IndexCatalog>)
271 ->std::unique_ptr<Impl>) makeImpl;
286 inline bool ok()
const {
334 const StringData
name,
350 OperationContext*
const opCtx,
352 const BSONObj& collationSpec,
367 std::vector<IndexDescriptor*>*
const matches)
const {
385 const BSONObj& shardKey,
386 const bool requireSingleKey)
const {
391 const std::string& type,
392 std::vector<IndexDescriptor*>& matches,
409 const IndexDescriptor*
const oldDesc) {
418 inline IndexAccessMethod*
getIndex(
const IndexDescriptor*
const desc) {
422 inline const IndexAccessMethod*
getIndex(
const IndexDescriptor*
const desc)
const {
447 const BSONObj spec) {
452 const BSONObj& original)
const {
462 bool includingIdIndex,
463 stdx::function<
void(
const IndexDescriptor*)> onDropFn =
nullptr) {
498 const IndexDescriptor*
const idx) {
513 const std::vector<BsonRecord>& bsonRecords,
514 int64_t*
const keysInsertedOut) {
526 int64_t*
const keysDeletedOut) {
533 const BSONObj& keyPattern) {
554 (OperationContext *
opCtx,
const IndexDescriptor*
desc, InsertDeleteOptions* options)->
void)
555 prepareInsertDeleteOptions;
575 const std::string& newPluginName) {
588 return this_->_getEntries();
592 return this_->_getEntries();
596 const std::string& indexName,
597 const std::string& indexNamespace) {
602 OperationContext*
const opCtx,
603 const std::string& indexName,
604 const std::string& indexNamespace) {
605 return this_->_deleteIndexFromDisk(
opCtx, indexName, indexNamespace);
612 static void hook() noexcept;
Status init(OperationContext *const opCtx)
Definition: index_catalog.h:282
const IndexCatalogEntry * getEntry(const IndexDescriptor *const desc) const
Definition: index_catalog.h:414
virtual bool isMultikey(OperationContext *opCtx, const IndexDescriptor *idx)=0
IndexAccessMethod * getIndex(const IndexDescriptor *const desc)
Definition: index_catalog.h:418
static void hook() noexcept
Definition: index_catalog.cpp:42
void findIndexesByKeyPattern(OperationContext *const opCtx, const BSONObj &key, const bool includeUnfinishedIndexes, std::vector< IndexDescriptor * > *const matches) const
Find indexes with a matching key pattern, putting them into the vector 'matches'.
Definition: index_catalog.h:364
bool haveAnyIndexes() const
Definition: index_catalog.h:292
virtual bool haveIdIndex(OperationContext *opCtx) const =0
virtual MultikeyPaths getMultikeyPaths(OperationContext *opCtx, const IndexDescriptor *idx)=0
Definition: index_catalog.h:131
int numIndexesReady(OperationContext *const opCtx) const
Definition: index_catalog.h:300
Definition: index_catalog_entry.h:272
virtual const IndexDescriptor * refreshEntry(OperationContext *opCtx, const IndexDescriptor *oldDesc)=0
virtual const IndexCatalogEntryContainer & _getEntries() const =0
virtual IndexCatalogEntry * _setupInMemoryStructures(OperationContext *opCtx, std::unique_ptr< IndexDescriptor > descriptor, bool initFromDisk)=0
Collection * _getCollection()
Definition: index_catalog.h:562
IndexIterator getIndexIterator(OperationContext *const opCtx, const bool includeUnfinishedIndexes) const
Definition: index_catalog.h:434
Status checkUnfinished() const
Returns a not-ok Status if there are any unfinished index builds.
Definition: index_catalog.h:430
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
virtual StatusWith< BSONObj > prepareSpecForCreate(OperationContext *opCtx, const BSONObj &original) const =0
virtual Status _dropIndex(OperationContext *opCtx, IndexCatalogEntry *entry)=0
virtual bool ok() const =0
StatusWith< BSONObj > createIndexOnEmptyCollection(OperationContext *const opCtx, const BSONObj spec)
Call this only on an empty collection from inside a WriteUnitOfWork.
Definition: index_catalog.h:446
virtual IndexAccessMethod * accessMethod(const IndexDescriptor *desc)=0
virtual int numIndexesTotal(OperationContext *opCtx) const =0
Database *const this_
Definition: database_impl.cpp:82
Collection *const collection
Definition: collection_info_cache_impl.cpp:53
const IndexDescriptor * refreshEntry(OperationContext *const opCtx, const IndexDescriptor *const oldDesc)
Reload the index definition for 'oldDesc' from the CollectionCatalogEntry.
Definition: index_catalog.h:408
virtual BSONObj getDefaultIdIndexSpec() const =0
IndexIterator(OperationContext *const opCtx, const IndexCatalog *const cat, const bool includeUnfinishedIndexes)
Definition: index_catalog.h:93
Status _upgradeDatabaseMinorVersionIfNeeded(OperationContext *const opCtx, const std::string &newPluginName)
Definition: index_catalog.h:574
bool more()
Definition: index_catalog.h:108
IndexCatalogEntryContainer & _getEntries()
Definition: index_catalog.h:583
BSONObj key
Definition: btree_interface.cpp:334
virtual Status init(OperationContext *opCtx)=0
how many: 1 per Collection.
Definition: index_catalog_impl.h:56
bool ok() const
Definition: index_catalog.h:286
virtual Status dropIndex(OperationContext *opCtx, IndexDescriptor *desc)=0
BSONObj getDefaultIdIndexSpec() const
Returns the spec for the id index to create by default for this collection.
Definition: index_catalog.h:320
void unindexRecord(OperationContext *const opCtx, const BSONObj &obj, const RecordId &loc, const bool noWarn, int64_t *const keysDeletedOut)
When 'keysDeletedOut' is not null, it will be set to the number of index keys removed by this operati...
Definition: index_catalog.h:522
void _deleteIndexFromDisk(OperationContext *const opCtx, const std::string &indexName, const std::string &indexNamespace)
Definition: index_catalog.h:595
std::unique_ptr< Impl > _pimpl
Definition: index_catalog.h:630
virtual void findIndexesByKeyPattern(OperationContext *opCtx, const BSONObj &key, bool includeUnfinishedIndexes, std::vector< IndexDescriptor * > *matches) const =0
const Impl & _impl() const
Definition: index_catalog.h:620
virtual StatusWith< BSONObj > createIndexOnEmptyCollection(OperationContext *opCtx, BSONObj spec)=0
Definition: index_catalog.h:52
const IndexAccessMethod * getIndex(const IndexDescriptor *const desc) const
Definition: index_catalog.h:422
std::string getAccessMethodName(OperationContext *const opCtx, const BSONObj &keyPattern)
Definition: index_catalog.h:532
friend IndexCatalog
Definition: index_catalog.h:152
friend IndexCatalogEntry
Definition: index_catalog.h:632
virtual Status _upgradeDatabaseMinorVersionIfNeeded(OperationContext *opCtx, const std::string &newPluginName)=0
this is NOT safe through a yield right now.
Definition: collection.h:160
bool isMultikey(OperationContext *const opCtx, const IndexDescriptor *const idx)
Returns true if the index 'idx' is multikey, and returns false otherwise.
Definition: index_catalog.h:484
virtual Status indexRecords(OperationContext *opCtx, const std::vector< BsonRecord > &bsonRecords, int64_t *keysInsertedOut)=0
Impl & _impl()
Definition: index_catalog.h:145
const IndexDescriptor * idx
Definition: coll_mod.cpp:70
void findIndexByType(OperationContext *const opCtx, const std::string &type, std::vector< IndexDescriptor * > &matches, const bool includeUnfinishedIndexes=false) const
Definition: index_catalog.h:390
static MONGO_DECLARE_SHIM((OperationContext *opCtx, const IndexCatalog *cat, bool includeUnfinishedIndexes, PrivateTo< IndexIterator >) ->std::unique_ptr< Impl >) makeImpl
virtual IndexCatalogEntry * catalogEntry(const IndexDescriptor *desc)=0
static void _deleteIndexFromDisk(IndexCatalog *const this_, OperationContext *const opCtx, const std::string &indexName, const std::string &indexNamespace)
Definition: index_catalog.h:601
virtual void dropAllIndexes(OperationContext *opCtx, bool includingIdIndex, stdx::function< void(const IndexDescriptor *)> onDropFn=nullptr)=0
how many: 1 per Collection.
Definition: index_catalog.h:62
Definition: index_catalog.h:611
Impl & _impl()
Definition: index_catalog.h:625
virtual Status checkUnfinished() const =0
virtual std::string getAccessMethodName(OperationContext *opCtx, const BSONObj &keyPattern)=0
IndexCatalog *const Collection *const const int maxNumIndexesAllowed
Definition: index_catalog_impl.cpp:75
void dropAllIndexes(OperationContext *opCtx, bool includingIdIndex, stdx::function< void(const IndexDescriptor *)> onDropFn=nullptr)
Drops all indexes in the index catalog, optionally dropping the id index depending on the 'includingI...
Definition: index_catalog.h:461
virtual IndexDescriptor * next()=0
Status dropIndex(OperationContext *const opCtx, IndexDescriptor *const desc)
Definition: index_catalog.h:467
virtual const IndexCatalogEntry * getEntry(const IndexDescriptor *desc) const =0
OperationContext Database StringData CollectionOptions bool const BSONObj &idIndex Status
Definition: database_impl.cpp:955
Definition: index_catalog.h:155
virtual Impl * clone_impl() const =0
Definition: index_catalog.h:66
TUHook() noexcept
Definition: index_catalog.h:614
OperationContext *const const IndexCatalog *const const bool includeUnfinishedIndexes
Definition: index_catalog_impl.cpp:84
Definition: index_key_validate.h:40
Definition: index_catalog_entry.h:56
Builds one or more indexes.
Definition: index_create_impl.h:63
Timestamp ts
Definition: index_catalog.h:54
virtual IndexDescriptor * findIndexByKeyPatternAndCollationSpec(OperationContext *opCtx, const BSONObj &key, const BSONObj &collationSpec, bool includeUnfinishedIndexes) const =0
IndexDescriptor * findShardKeyPrefixedIndex(OperationContext *const opCtx, const BSONObj &shardKey, const bool requireSingleKey) const
Returns an index suitable for shard key range scans.
Definition: index_catalog.h:384
virtual void _deleteIndexFromDisk(OperationContext *const opCtx, const std::string &indexName, const std::string &indexNamespace)=0
static void hook() noexcept
Definition: index_catalog.cpp:56
Status _dropIndex(OperationContext *const opCtx, IndexCatalogEntry *const desc)
Definition: index_catalog.h:570
OperationContext *const const IndexCatalog *const cat
Definition: index_catalog_impl.cpp:84
const BSONObj * docPtr
Definition: index_catalog.h:55
virtual int numIndexesReady(OperationContext *opCtx) const =0
std::unique_ptr< Impl > clone() const
Definition: index_catalog.h:74
IndexDescriptor * findIdIndex(OperationContext *const opCtx) const
Definition: index_catalog.h:324
int numIndexesTotal(OperationContext *const opCtx) const
Definition: index_catalog.h:296
TUHook() noexcept
Definition: index_catalog.h:134
virtual IndexDescriptor * findIdIndex(OperationContext *opCtx) const =0
static MONGO_DECLARE_SHIM((IndexCatalog *this_, Collection *collection, int maxNumIndexesAllowed, PrivateTo< IndexCatalog >) ->std::unique_ptr< Impl >) makeImpl
IndexCatalogEntry *const OperationContext *const const StringData CollectionCatalogEntry *const std::unique_ptr< IndexDescriptor > descriptor
Definition: index_catalog_entry_impl.cpp:58
friend IndexCatalog
Definition: index_catalog.h:263
const Impl & _impl() const
Definition: index_catalog.h:140
Definition: index_catalog.h:64
bool haveIdIndex(OperationContext *const opCtx) const
this is in "alive" until the Collection goes away in which case everything from this tree has to go a...
Definition: index_catalog.h:313
IndexCatalogEntry * catalogEntry(const IndexDescriptor *const desc)
Definition: index_catalog.h:122
static IndexCatalogEntryContainer & _getEntries(IndexCatalog *const this_)
Definition: index_catalog.h:587
virtual IndexDescriptor * findIndexByName(OperationContext *opCtx, StringData name, bool includeUnfinishedIndexes) const =0
IndexDescriptor * next()
Definition: index_catalog.h:112
virtual const Collection * _getCollection() const =0
virtual void findIndexByType(OperationContext *opCtx, const std::string &type, std::vector< IndexDescriptor * > &matches, bool includeUnfinishedIndexes) const =0
virtual std::vector< BSONObj > getAndClearUnfinishedIndexes(OperationContext *opCtx)=0
virtual IndexDescriptor * findShardKeyPrefixedIndex(OperationContext *opCtx, const BSONObj &shardKey, bool requireSingleKey) const =0
RecordId id
Definition: index_catalog.h:53
MultikeyPaths getMultikeyPaths(OperationContext *const opCtx, const IndexDescriptor *const idx)
Returns the path components that cause the index 'idx' to be multikey if the index supports path-leve...
Definition: index_catalog.h:497
IndexDescriptor * findIndexByKeyPatternAndCollationSpec(OperationContext *const opCtx, const BSONObj &key, const BSONObj &collationSpec, const bool includeUnfinishedIndexes=false) const
Find index by matching key pattern and collation spec.
Definition: index_catalog.h:349
IndexIterator & operator=(const IndexIterator ©)=default
IndexCatalog & operator=(IndexCatalog &&)=delete
std::string::size_type getLongestIndexNameLength(OperationContext *opCtx) const
Returns length of longest index name.
Definition: index_catalog.cpp:60
Status indexRecords(OperationContext *const opCtx, const std::vector< BsonRecord > &bsonRecords, int64_t *const keysInsertedOut)
When 'keysInsertedOut' is not null, it will be set to the number of index keys inserted by this opera...
Definition: index_catalog.h:512
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
IndexCatalogEntry * _setupInMemoryStructures(OperationContext *opCtx, std::unique_ptr< IndexDescriptor > descriptor, bool initFromDisk)
Definition: index_catalog.cpp:44
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual void unindexRecord(OperationContext *opCtx, const BSONObj &obj, const RecordId &loc, bool noWarn, int64_t *keysDeletedOut)=0
std::vector< BSONObj > getAndClearUnfinishedIndexes(OperationContext *const opCtx)
will drop all incompleted indexes and return specs after this, the indexes can be rebuilt.
Definition: index_catalog.h:475
StatusWith< BSONObj > prepareSpecForCreate(OperationContext *const opCtx, const BSONObj &original) const
Definition: index_catalog.h:451
OperationContext const IndexDescriptor * desc
Definition: index_catalog_impl.cpp:97
int numIndexesInProgress(OperationContext *const opCtx) const
Definition: index_catalog.h:304
IndexDescriptor * findIndexByName(OperationContext *const opCtx, const StringData name, const bool includeUnfinishedIndexes=false) const
Find index by name.
Definition: index_catalog.h:333
const Collection * _getCollection() const
Definition: index_catalog.h:558
static const IndexCatalogEntryContainer & _getEntries(const IndexCatalog *const this_)
Definition: index_catalog.h:591
const IndexCatalogEntryContainer & _getEntries() const
Definition: index_catalog.h:579
clonable_ptr< Impl > _pimpl
Definition: index_catalog.h:150
virtual IndexAccessMethod * getIndex(const IndexDescriptor *desc)=0
IndexCatalog(Collection *const collection, const int maxNumIndexesAllowed)
Definition: index_catalog.h:275
IndexAccessMethod * accessMethod(const IndexDescriptor *const desc)
Definition: index_catalog.h:117
virtual bool haveAnyIndexes() const =0