diff options
Diffstat (limited to 'src/mongo/db/catalog/collection_impl.cpp')
-rw-r--r-- | src/mongo/db/catalog/collection_impl.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/src/mongo/db/catalog/collection_impl.cpp b/src/mongo/db/catalog/collection_impl.cpp index 8565f8cc65e..152859a2d0c 100644 --- a/src/mongo/db/catalog/collection_impl.cpp +++ b/src/mongo/db/catalog/collection_impl.cpp @@ -329,6 +329,10 @@ void CollectionImpl::init(OperationContext* opCtx) { "validatorStatus"_attr = _validator.getStatus()); } + if (collectionOptions.clusteredIndex) { + _clustered = true; + } + getIndexCatalog()->init(opCtx).transitional_ignore(); _initialized = true; } @@ -622,10 +626,21 @@ Status CollectionImpl::insertDocumentForBulkLoader( dassert(opCtx->lockState()->isCollectionLockedForMode(ns(), MODE_IX)); + RecordId recordId; + if (isClustered()) { + // Collections clustered by _id require ObjectId values. + BSONElement oidElem; + bool foundId = doc.getObjectID(oidElem); + uassert(ErrorCodes::BadValue, + str::stream() << "Document " << redact(doc) << " is missing the '_id' field", + foundId); + recordId = RecordId(oidElem.OID()); + } + // Using timestamp 0 for these inserts, which are non-oplog so we don't have an appropriate // timestamp to use. - StatusWith<RecordId> loc = - _shared->_recordStore->insertRecord(opCtx, doc.objdata(), doc.objsize(), Timestamp()); + StatusWith<RecordId> loc = _shared->_recordStore->insertRecord( + opCtx, recordId, doc.objdata(), doc.objsize(), Timestamp()); if (!loc.isOK()) return loc.getStatus(); @@ -692,8 +707,8 @@ Status CollectionImpl::_insertDocuments(OperationContext* opCtx, const auto& doc = it->doc; RecordId recordId; - if (_shared->_recordStore->isClustered()) { - // Extract the ObjectId from the document's _id field. + if (isClustered()) { + // Collections clustered by _id require ObjectId values. BSONElement oidElem; bool foundId = doc.getObjectID(oidElem); uassert(ErrorCodes::BadValue, @@ -722,7 +737,7 @@ Status CollectionImpl::_insertDocuments(OperationContext* opCtx, int recordIndex = 0; for (auto it = begin; it != end; it++) { RecordId loc = records[recordIndex++].id; - if (_shared->_recordStore->isClustered()) { + if (isClustered()) { invariant(RecordId::min<OID>() < loc); invariant(loc < RecordId::max<OID>()); } else { @@ -962,6 +977,10 @@ bool CollectionImpl::isTemporary(OperationContext* opCtx) const { return DurableCatalog::get(opCtx)->getCollectionOptions(opCtx, getCatalogId()).temp; } +bool CollectionImpl::isClustered() const { + return _clustered; +} + bool CollectionImpl::getRecordPreImages() const { return _recordPreImages; } |