summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/collection_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/catalog/collection_impl.cpp')
-rw-r--r--src/mongo/db/catalog/collection_impl.cpp29
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;
}