@@ -133,6 +133,7 @@ IndexCatalogImpl::~IndexCatalogImpl() {
133
133
134
134
// CollectionImpl::init中调用
135
135
// 例如mongod实例重启得时候会调用
136
+ // 从元数据文件"_mdb_catalog.wt"中获取索引信息,并构造索引对应的IndexCatalogEntryImpl
136
137
Status IndexCatalogImpl::init (OperationContext* opCtx) {
137
138
vector<string> indexNames;
138
139
// BSONCollectionCatalogEntry::getAllIndexes
@@ -161,7 +162,7 @@ Status IndexCatalogImpl::init(OperationContext* opCtx) {
161
162
auto descriptor = stdx::make_unique<IndexDescriptor>(
162
163
_collection, _getAccessMethodName (opCtx, keyPattern), spec);
163
164
const bool initFromDisk = true ;
164
- // 获取descriptor该索引对应的IndexCatalogEntryImpl添加到_entries数组
165
+ // 获取descriptor该索引对应的IndexCatalogEntryImpl添加到IndexCatalogImpl._entries数组
165
166
// 一个索引对应一个IndexCatalogEntry
166
167
IndexCatalogEntry* entry =
167
168
_setupInMemoryStructures (opCtx, std::move (descriptor), initFromDisk);
@@ -407,7 +408,7 @@ StatusWith<BSONObj> IndexCatalogImpl::createIndexOnEmptyCollection(OperationCont
407
408
// now going to touch disk
408
409
IndexBuildBlock indexBuildBlock (opCtx, _collection, spec);
409
410
// IndexCatalogImpl::IndexBuildBlock::init
410
- // 该索引初始化
411
+ // 对IndexBuildBlock对应的索引进行初始化,创建索引对应的存储引擎底层索引文件
411
412
status = indexBuildBlock.init ();
412
413
if (!status.isOK ())
413
414
return status;
@@ -459,7 +460,7 @@ IndexCatalogImpl::IndexBuildBlock::IndexBuildBlock(OperationContext* opCtx,
459
460
// CmdCreateIndex::errmsgRun->MultiIndexBlockImpl::init调用(收到createIndex建索引)
460
461
461
462
// //获取descriptor该索引对应的IndexCatalogEntryImpl添加到_entries数组
462
- // 对IndexBuildBlock对应的索引进行初始化
463
+ // 对IndexBuildBlock对应的索引进行初始化,创建索引对应的存储引擎底层索引文件
463
464
Status IndexCatalogImpl::IndexBuildBlock::init () {
464
465
// need this first for names, etc...
465
466
// 获取所有信息的key,可以db.collection.getIndexes()获取
@@ -478,7 +479,7 @@ Status IndexCatalogImpl::IndexBuildBlock::init() {
478
479
// / ---------- setup on disk structures ----------------
479
480
480
481
// KVCollectionCatalogEntry::prepareForIndexBuild
481
- // 准备工作
482
+ // 创建索引的准备工作,并创建存储引擎对应索引目录文件
482
483
Status status = _collection->getCatalogEntry ()->prepareForIndexBuild (_opCtx, descriptor.get ());
483
484
if (!status.isOK ())
484
485
return status;
@@ -505,14 +506,16 @@ IndexCatalogImpl::IndexBuildBlock::~IndexBuildBlock() {
505
506
// Don't need to call fail() here, as rollback will clean everything up for us.
506
507
}
507
508
508
- // 失败处理
509
+ // MultiIndexBlockImpl::~MultiIndexBlockImpl()调用
509
510
void IndexCatalogImpl::IndexBuildBlock::fail () {
510
511
fassert (17204 , _catalog->_getCollection ()->ok ()); // defensive
511
512
513
+
512
514
IndexCatalogEntry* entry = IndexCatalog::_getEntries (_catalog).find (_indexName);
513
515
invariant (entry == _entry);
514
516
515
517
if (entry) {
518
+ // 同时删除内存缓存的entry,并从磁盘删除
516
519
IndexCatalogImpl::_dropIndex (_catalog, _opCtx, entry).transitional_ignore ();
517
520
} else {
518
521
IndexCatalog::_deleteIndexFromDisk (_catalog, _opCtx, _indexName, _indexNamespace);
@@ -557,6 +560,7 @@ void IndexCatalogImpl::IndexBuildBlock::success() {
557
560
collection->setMinimumVisibleSnapshot (snapshotName);
558
561
});
559
562
563
+ // 索引创建成功,标记一下
560
564
entry->setIsReady (true );
561
565
}
562
566
@@ -958,6 +962,7 @@ Status IndexCatalogImpl::_doesSpecConflictWithExisting(OperationContext* opCtx,
958
962
return Status::OK ();
959
963
}
960
964
965
+ //
961
966
BSONObj IndexCatalogImpl::getDefaultIdIndexSpec (
962
967
ServerGlobalParams::FeatureCompatibility::Version featureCompatibilityVersion) const {
963
968
dassert (_idObj[" _id" ].type () == NumberInt);
@@ -1209,12 +1214,14 @@ vector<BSONObj> IndexCatalogImpl::getAndClearUnfinishedIndexes(OperationContext*
1209
1214
return toReturn;
1210
1215
}
1211
1216
1217
+ // 判断指定索引是否是Multikey类型
1212
1218
bool IndexCatalogImpl::isMultikey (OperationContext* opCtx, const IndexDescriptor* idx) {
1213
1219
IndexCatalogEntry* entry = _entries.find (idx);
1214
1220
invariant (entry);
1215
1221
return entry->isMultikey ();
1216
1222
}
1217
1223
1224
+ // 获取指定索引对应的MultikeyPaths
1218
1225
MultikeyPaths IndexCatalogImpl::getMultikeyPaths (OperationContext* opCtx,
1219
1226
const IndexDescriptor* idx) {
1220
1227
IndexCatalogEntry* entry = _entries.find (idx);
@@ -1223,7 +1230,7 @@ MultikeyPaths IndexCatalogImpl::getMultikeyPaths(OperationContext* opCtx,
1223
1230
}
1224
1231
1225
1232
// ---------------------------
1226
-
1233
+ // 该表是否有至少有一个索引
1227
1234
bool IndexCatalogImpl::haveAnyIndexes () const {
1228
1235
return _entries.size () != 0 ;
1229
1236
}
0 commit comments