Storage Engine API
index_catalog.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include <memory>
32 #include <vector>
33 
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"
43 
44 namespace mongo {
45 class Client;
46 class Collection;
47 
48 class IndexDescriptor;
49 class IndexAccessMethod;
50 struct InsertDeleteOptions;
51 
52 struct BsonRecord {
53  RecordId id;
54  Timestamp ts;
55  const BSONObj* docPtr;
56 };
57 
62 class IndexCatalog {
63 public:
64  class IndexIterator {
65  public:
66  class Impl {
67  public:
68  virtual ~Impl() = 0;
69 
70  private:
71  virtual Impl* clone_impl() const = 0;
72 
73  public:
74  inline std::unique_ptr<Impl> clone() const {
75  return std::unique_ptr<Impl>{this->clone_impl()};
76  }
77 
78  virtual bool more() = 0;
79  virtual IndexDescriptor* next() = 0;
80 
81  virtual IndexAccessMethod* accessMethod(const IndexDescriptor* desc) = 0;
82 
83  virtual IndexCatalogEntry* catalogEntry(const IndexDescriptor* desc) = 0;
84  };
85 
86  static MONGO_DECLARE_SHIM((OperationContext * opCtx,
87  const IndexCatalog* cat,
89  PrivateTo<IndexIterator>)
90  ->std::unique_ptr<Impl>) makeImpl;
91 
92  private:
93  explicit inline IndexIterator(OperationContext* const opCtx,
94  const IndexCatalog* const cat,
95  const bool includeUnfinishedIndexes)
96  : _pimpl(makeImpl(opCtx, cat, includeUnfinishedIndexes, PrivateCall<IndexIterator>{})) {
97  }
98 
99  public:
100  inline ~IndexIterator() = default;
101 
102  inline IndexIterator(const IndexIterator& copy) = default;
103  inline IndexIterator& operator=(const IndexIterator& copy) = default;
104 
105  inline IndexIterator(IndexIterator&& copy) = default;
106  inline IndexIterator& operator=(IndexIterator&& copy) = default;
107 
108  inline bool more() {
109  return this->_impl().more();
110  }
111 
112  inline IndexDescriptor* next() {
113  return this->_impl().next();
114  }
115 
116  // Returns the access method for the last return IndexDescriptor.
117  inline IndexAccessMethod* accessMethod(const IndexDescriptor* const desc) {
118  return this->_impl().accessMethod(desc);
119  }
120 
121  // Returns the IndexCatalogEntry for the last return IndexDescriptor.
122  inline IndexCatalogEntry* catalogEntry(const IndexDescriptor* const desc) {
123  return this->_impl().catalogEntry(desc);
124  }
125 
126  private:
127  // This structure exists to give us a customization point to decide how to force users of
128  // this class to depend upon the corresponding `index_catalog.cpp` Translation Unit (TU).
129  // All public forwarding functions call `_impl(), and `_impl` creates an instance of this
130  // structure.
131  struct TUHook {
132  static void hook() noexcept;
133 
134  explicit inline TUHook() noexcept {
135  if (kDebugBuild)
136  this->hook();
137  }
138  };
139 
140  inline const Impl& _impl() const {
141  TUHook{};
142  return *this->_pimpl;
143  }
144 
145  inline Impl& _impl() {
146  TUHook{};
147  return *this->_pimpl;
148  }
149 
150  clonable_ptr<Impl> _pimpl;
151 
152  friend IndexCatalog;
153  };
154 
155  class Impl {
156  public:
157  virtual ~Impl() = 0;
158 
159  virtual Status init(OperationContext* opCtx) = 0;
160 
161  virtual bool ok() const = 0;
162 
163  virtual bool haveAnyIndexes() const = 0;
164 
165  virtual int numIndexesTotal(OperationContext* opCtx) const = 0;
166 
167  virtual int numIndexesReady(OperationContext* opCtx) const = 0;
168 
169  virtual bool haveIdIndex(OperationContext* opCtx) const = 0;
170 
171  virtual BSONObj getDefaultIdIndexSpec() const = 0;
172 
173  virtual IndexDescriptor* findIdIndex(OperationContext* opCtx) const = 0;
174 
175  virtual IndexDescriptor* findIndexByName(OperationContext* opCtx,
176  StringData name,
177  bool includeUnfinishedIndexes) const = 0;
178 
179  virtual IndexDescriptor* findIndexByKeyPatternAndCollationSpec(
180  OperationContext* opCtx,
181  const BSONObj& key,
182  const BSONObj& collationSpec,
183  bool includeUnfinishedIndexes) const = 0;
184 
185  virtual void findIndexesByKeyPattern(OperationContext* opCtx,
186  const BSONObj& key,
187  bool includeUnfinishedIndexes,
188  std::vector<IndexDescriptor*>* matches) const = 0;
189 
190  virtual IndexDescriptor* findShardKeyPrefixedIndex(OperationContext* opCtx,
191  const BSONObj& shardKey,
192  bool requireSingleKey) const = 0;
193 
194  virtual void findIndexByType(OperationContext* opCtx,
195  const std::string& type,
196  std::vector<IndexDescriptor*>& matches,
197  bool includeUnfinishedIndexes) const = 0;
198 
199  virtual const IndexDescriptor* refreshEntry(OperationContext* opCtx,
200  const IndexDescriptor* oldDesc) = 0;
201 
202  virtual const IndexCatalogEntry* getEntry(const IndexDescriptor* desc) const = 0;
203 
204  virtual IndexAccessMethod* getIndex(const IndexDescriptor* desc) = 0;
205 
206  virtual const IndexAccessMethod* getIndex(const IndexDescriptor* desc) const = 0;
207 
208  virtual Status checkUnfinished() const = 0;
209 
210  virtual StatusWith<BSONObj> createIndexOnEmptyCollection(OperationContext* opCtx,
211  BSONObj spec) = 0;
212 
213  virtual StatusWith<BSONObj> prepareSpecForCreate(OperationContext* opCtx,
214  const BSONObj& original) const = 0;
215 
216  virtual void dropAllIndexes(
217  OperationContext* opCtx,
218  bool includingIdIndex,
219  stdx::function<void(const IndexDescriptor*)> onDropFn = nullptr) = 0;
220 
221  virtual Status dropIndex(OperationContext* opCtx, IndexDescriptor* desc) = 0;
222 
223  virtual std::vector<BSONObj> getAndClearUnfinishedIndexes(OperationContext* opCtx) = 0;
224 
225  virtual bool isMultikey(OperationContext* opCtx, const IndexDescriptor* idx) = 0;
226 
227  virtual MultikeyPaths getMultikeyPaths(OperationContext* opCtx,
228  const IndexDescriptor* idx) = 0;
229 
230  virtual Status indexRecords(OperationContext* opCtx,
231  const std::vector<BsonRecord>& bsonRecords,
232  int64_t* keysInsertedOut) = 0;
233 
234  virtual void unindexRecord(OperationContext* opCtx,
235  const BSONObj& obj,
236  const RecordId& loc,
237  bool noWarn,
238  int64_t* keysDeletedOut) = 0;
239 
240  virtual std::string getAccessMethodName(OperationContext* opCtx,
241  const BSONObj& keyPattern) = 0;
242 
243  virtual Status _upgradeDatabaseMinorVersionIfNeeded(OperationContext* opCtx,
244  const std::string& newPluginName) = 0;
245 
246  private:
247  virtual const Collection* _getCollection() const = 0;
248  virtual Collection* _getCollection() = 0;
249 
250  virtual IndexCatalogEntry* _setupInMemoryStructures(
251  OperationContext* opCtx,
252  std::unique_ptr<IndexDescriptor> descriptor,
253  bool initFromDisk) = 0;
254  virtual Status _dropIndex(OperationContext* opCtx, IndexCatalogEntry* entry) = 0;
255 
256  virtual const IndexCatalogEntryContainer& _getEntries() const = 0;
257  virtual IndexCatalogEntryContainer& _getEntries() = 0;
258 
259  virtual void _deleteIndexFromDisk(OperationContext* const opCtx,
260  const std::string& indexName,
261  const std::string& indexNamespace) = 0;
262 
263  friend IndexCatalog;
264  };
265 
266 public:
267  static MONGO_DECLARE_SHIM((IndexCatalog * this_,
270  PrivateTo<IndexCatalog>)
271  ->std::unique_ptr<Impl>) makeImpl;
272 
273  inline ~IndexCatalog() = default;
274 
275  explicit inline IndexCatalog(Collection* const collection, const int maxNumIndexesAllowed)
276  : _pimpl(makeImpl(this, collection, maxNumIndexesAllowed, PrivateCall<IndexCatalog>{})) {}
277 
278  inline IndexCatalog(IndexCatalog&&) = delete;
279  inline IndexCatalog& operator=(IndexCatalog&&) = delete;
280 
281  // Must be called before used.
282  inline Status init(OperationContext* const opCtx) {
283  return this->_impl().init(opCtx);
284  }
285 
286  inline bool ok() const {
287  return this->_impl().ok();
288  }
289 
290  // ---- accessors -----
291 
292  inline bool haveAnyIndexes() const {
293  return this->_impl().haveAnyIndexes();
294  }
295 
296  inline int numIndexesTotal(OperationContext* const opCtx) const {
297  return this->_impl().numIndexesTotal(opCtx);
298  }
299 
300  inline int numIndexesReady(OperationContext* const opCtx) const {
301  return this->_impl().numIndexesReady(opCtx);
302  }
303 
304  inline int numIndexesInProgress(OperationContext* const opCtx) const {
305  return numIndexesTotal(opCtx) - numIndexesReady(opCtx);
306  }
307 
313  inline bool haveIdIndex(OperationContext* const opCtx) const {
314  return this->_impl().haveIdIndex(opCtx);
315  }
316 
320  inline BSONObj getDefaultIdIndexSpec() const {
321  return this->_impl().getDefaultIdIndexSpec();
322  }
323 
324  inline IndexDescriptor* findIdIndex(OperationContext* const opCtx) const {
325  return this->_impl().findIdIndex(opCtx);
326  }
327 
333  inline IndexDescriptor* findIndexByName(OperationContext* const opCtx,
334  const StringData name,
335  const bool includeUnfinishedIndexes = false) const {
336  return this->_impl().findIndexByName(opCtx, name, includeUnfinishedIndexes);
337  }
338 
349  inline IndexDescriptor* findIndexByKeyPatternAndCollationSpec(
350  OperationContext* const opCtx,
351  const BSONObj& key,
352  const BSONObj& collationSpec,
353  const bool includeUnfinishedIndexes = false) const {
354  return this->_impl().findIndexByKeyPatternAndCollationSpec(
355  opCtx, key, collationSpec, includeUnfinishedIndexes);
356  }
357 
364  inline void findIndexesByKeyPattern(OperationContext* const opCtx,
365  const BSONObj& key,
366  const bool includeUnfinishedIndexes,
367  std::vector<IndexDescriptor*>* const matches) const {
368  return this->_impl().findIndexesByKeyPattern(opCtx, key, includeUnfinishedIndexes, matches);
369  }
370 
384  inline IndexDescriptor* findShardKeyPrefixedIndex(OperationContext* const opCtx,
385  const BSONObj& shardKey,
386  const bool requireSingleKey) const {
387  return this->_impl().findShardKeyPrefixedIndex(opCtx, shardKey, requireSingleKey);
388  }
389 
390  inline void findIndexByType(OperationContext* const opCtx,
391  const std::string& type,
392  std::vector<IndexDescriptor*>& matches,
393  const bool includeUnfinishedIndexes = false) const {
394  return this->_impl().findIndexByType(opCtx, type, matches, includeUnfinishedIndexes);
395  }
396 
408  inline const IndexDescriptor* refreshEntry(OperationContext* const opCtx,
409  const IndexDescriptor* const oldDesc) {
410  return this->_impl().refreshEntry(opCtx, oldDesc);
411  }
412 
413  // never returns NULL
414  const IndexCatalogEntry* getEntry(const IndexDescriptor* const desc) const {
415  return this->_impl().getEntry(desc);
416  }
417 
418  inline IndexAccessMethod* getIndex(const IndexDescriptor* const desc) {
419  return this->_impl().getIndex(desc);
420  }
421 
422  inline const IndexAccessMethod* getIndex(const IndexDescriptor* const desc) const {
423  return this->_impl().getIndex(desc);
424  }
425 
430  inline Status checkUnfinished() const {
431  return this->_impl().checkUnfinished();
432  }
433 
434  inline IndexIterator getIndexIterator(OperationContext* const opCtx,
435  const bool includeUnfinishedIndexes) const {
436  return IndexIterator(opCtx, this, includeUnfinishedIndexes);
437  };
438 
439  // ---- index set modifiers ------
440 
447  const BSONObj spec) {
448  return this->_impl().createIndexOnEmptyCollection(opCtx, spec);
449  }
450 
451  inline StatusWith<BSONObj> prepareSpecForCreate(OperationContext* const opCtx,
452  const BSONObj& original) const {
453  return this->_impl().prepareSpecForCreate(opCtx, original);
454  }
455 
461  inline void dropAllIndexes(OperationContext* opCtx,
462  bool includingIdIndex,
463  stdx::function<void(const IndexDescriptor*)> onDropFn = nullptr) {
464  this->_impl().dropAllIndexes(opCtx, includingIdIndex, onDropFn);
465  }
466 
467  inline Status dropIndex(OperationContext* const opCtx, IndexDescriptor* const desc) {
468  return this->_impl().dropIndex(opCtx, desc);
469  }
470 
475  inline std::vector<BSONObj> getAndClearUnfinishedIndexes(OperationContext* const opCtx) {
476  return this->_impl().getAndClearUnfinishedIndexes(opCtx);
477  }
478 
479  // ---- modify single index
480 
484  inline bool isMultikey(OperationContext* const opCtx, const IndexDescriptor* const idx) {
485  return this->_impl().isMultikey(opCtx, idx);
486  }
487 
497  inline MultikeyPaths getMultikeyPaths(OperationContext* const opCtx,
498  const IndexDescriptor* const idx) {
499  return this->_impl().getMultikeyPaths(opCtx, idx);
500  }
501 
502  // --- these probably become private?
503 
504  // ----- data modifiers ------
505 
512  inline Status indexRecords(OperationContext* const opCtx,
513  const std::vector<BsonRecord>& bsonRecords,
514  int64_t* const keysInsertedOut) {
515  return this->_impl().indexRecords(opCtx, bsonRecords, keysInsertedOut);
516  }
517 
522  inline void unindexRecord(OperationContext* const opCtx,
523  const BSONObj& obj,
524  const RecordId& loc,
525  const bool noWarn,
526  int64_t* const keysDeletedOut) {
527  return this->_impl().unindexRecord(opCtx, obj, loc, noWarn, keysDeletedOut);
528  }
529 
530  // ------- temp internal -------
531 
532  inline std::string getAccessMethodName(OperationContext* const opCtx,
533  const BSONObj& keyPattern) {
534  return this->_impl().getAccessMethodName(opCtx, keyPattern);
535  }
536 
537  // public helpers
538 
543  std::string::size_type getLongestIndexNameLength(OperationContext* opCtx) const;
544 
545  // public static helpers
546 
547  static MONGO_DECLARE_SHIM((const BSONObj& key)->BSONObj) fixIndexKey;
548 
553  static MONGO_DECLARE_SHIM(
554  (OperationContext * opCtx, const IndexDescriptor* desc, InsertDeleteOptions* options)->void)
555  prepareInsertDeleteOptions;
556 
557 private:
558  inline const Collection* _getCollection() const {
559  return this->_impl()._getCollection();
560  }
561 
563  return this->_impl()._getCollection();
564  }
565 
566  IndexCatalogEntry* _setupInMemoryStructures(OperationContext* opCtx,
567  std::unique_ptr<IndexDescriptor> descriptor,
568  bool initFromDisk);
569 
570  inline Status _dropIndex(OperationContext* const opCtx, IndexCatalogEntry* const desc) {
571  return this->_impl()._dropIndex(opCtx, desc);
572  }
573 
574  inline Status _upgradeDatabaseMinorVersionIfNeeded(OperationContext* const opCtx,
575  const std::string& newPluginName) {
576  return this->_impl()._upgradeDatabaseMinorVersionIfNeeded(opCtx, newPluginName);
577  }
578 
579  inline const IndexCatalogEntryContainer& _getEntries() const {
580  return this->_impl()._getEntries();
581  }
582 
584  return this->_impl()._getEntries();
585  }
586 
588  return this_->_getEntries();
589  }
590 
591  inline static const IndexCatalogEntryContainer& _getEntries(const IndexCatalog* const this_) {
592  return this_->_getEntries();
593  }
594 
595  inline void _deleteIndexFromDisk(OperationContext* const opCtx,
596  const std::string& indexName,
597  const std::string& indexNamespace) {
598  return this->_impl()._deleteIndexFromDisk(opCtx, indexName, indexNamespace);
599  }
600 
601  inline static void _deleteIndexFromDisk(IndexCatalog* const this_,
602  OperationContext* const opCtx,
603  const std::string& indexName,
604  const std::string& indexNamespace) {
605  return this_->_deleteIndexFromDisk(opCtx, indexName, indexNamespace);
606  }
607 
608  // This structure exists to give us a customization point to decide how to force users of this
609  // class to depend upon the corresponding `index_catalog.cpp` Translation Unit (TU). All public
610  // forwarding functions call `_impl(), and `_impl` creates an instance of this structure.
611  struct TUHook {
612  static void hook() noexcept;
613 
614  explicit inline TUHook() noexcept {
615  if (kDebugBuild)
616  this->hook();
617  }
618  };
619 
620  inline const Impl& _impl() const {
621  TUHook{};
622  return *this->_pimpl;
623  }
624 
625  inline Impl& _impl() {
626  TUHook{};
627  return *this->_pimpl;
628  }
629 
630  std::unique_ptr<Impl> _pimpl;
631 
633  friend class IndexCatalogImpl;
634  friend class MultiIndexBlockImpl;
635 };
636 } // namespace mongo
Status init(OperationContext *const opCtx)
Definition: index_catalog.h:282
const IndexCatalogEntry * getEntry(const IndexDescriptor *const desc) const
Definition: index_catalog.h:414
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 &#39;matches&#39;. ...
Definition: index_catalog.h:364
IndexAccessMethod * getIndex(const IndexDescriptor *const desc)
Definition: index_catalog.h:418
bool haveAnyIndexes() const
Definition: index_catalog.h:292
Definition: index_catalog.h:131
int numIndexesReady(OperationContext *const opCtx) const
Definition: index_catalog.h:300
Definition: index_catalog_entry.h:272
void findIndexByType(OperationContext *const opCtx, const std::string &type, std::vector< IndexDescriptor *> &matches, const bool includeUnfinishedIndexes=false) const
Definition: index_catalog.h:390
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
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
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 &#39;oldDesc&#39; from the CollectionCatalogEntry.
Definition: index_catalog.h:408
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
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
how many: 1 per Collection.
Definition: index_catalog_impl.h:56
bool ok() const
Definition: index_catalog.h:286
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 &#39;keysDeletedOut&#39; 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
const Impl & _impl() const
Definition: index_catalog.h:620
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
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 &#39;idx&#39; is multikey, and returns false otherwise.
Definition: index_catalog.h:484
Impl & _impl()
Definition: index_catalog.h:145
const IndexDescriptor * idx
Definition: coll_mod.cpp:70
static void _deleteIndexFromDisk(IndexCatalog *const this_, OperationContext *const opCtx, const std::string &indexName, const std::string &indexNamespace)
Definition: index_catalog.h:601
how many: 1 per Collection.
Definition: index_catalog.h:62
Definition: index_catalog.h:611
Impl & _impl()
Definition: index_catalog.h:625
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 &#39;includingI...
Definition: index_catalog.h:461
Status dropIndex(OperationContext *const opCtx, IndexDescriptor *const desc)
Definition: index_catalog.h:467
Definition: index_catalog.h:155
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
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
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
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
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
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
IndexCatalogEntry * catalogEntry(const IndexDescriptor *const desc)
Definition: index_catalog.h:122
static IndexCatalogEntryContainer & _getEntries(IndexCatalog *const this_)
Definition: index_catalog.h:587
IndexDescriptor * next()
Definition: index_catalog.h:112
RecordId id
Definition: index_catalog.h:53
MultikeyPaths getMultikeyPaths(OperationContext *const opCtx, const IndexDescriptor *const idx)
Returns the path components that cause the index &#39;idx&#39; 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
Status indexRecords(OperationContext *const opCtx, const std::vector< BsonRecord > &bsonRecords, int64_t *const keysInsertedOut)
When &#39;keysInsertedOut&#39; 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
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
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
IndexCatalog(Collection *const collection, const int maxNumIndexesAllowed)
Definition: index_catalog.h:275
IndexAccessMethod * accessMethod(const IndexDescriptor *const desc)
Definition: index_catalog.h:117