summaryrefslogtreecommitdiff
path: root/src/mongo/db/index/index_access_method.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/index/index_access_method.cpp')
-rw-r--r--src/mongo/db/index/index_access_method.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/mongo/db/index/index_access_method.cpp b/src/mongo/db/index/index_access_method.cpp
index ada7e27ab92..5dfc812e6d8 100644
--- a/src/mongo/db/index/index_access_method.cpp
+++ b/src/mongo/db/index/index_access_method.cpp
@@ -131,7 +131,7 @@ Status IndexAccessMethod::insert(OperationContext* txn,
BSONObjSet keys = SimpleBSONObjComparator::kInstance.makeBSONObjSet();
MultikeyPaths multikeyPaths;
// Delegate to the subclass.
- getKeys(obj, options.getKeysMode, &keys, &multikeyPaths);
+ getKeys(obj, options.getKeysMode, GetKeysContext::kReadOrAddKeys, &keys, &multikeyPaths);
Status ret = Status::OK();
for (BSONObjSet::const_iterator i = keys.begin(); i != keys.end(); ++i) {
@@ -211,7 +211,7 @@ Status IndexAccessMethod::remove(OperationContext* txn,
// multikey when removing a document since the index metadata isn't updated when keys are
// deleted.
MultikeyPaths* multikeyPaths = nullptr;
- getKeys(obj, options.getKeysMode, &keys, multikeyPaths);
+ getKeys(obj, options.getKeysMode, GetKeysContext::kRemovingKeys, &keys, multikeyPaths);
for (BSONObjSet::const_iterator i = keys.begin(); i != keys.end(); ++i) {
removeOneKey(txn, *i, loc, options.dupsAllowed);
@@ -230,7 +230,11 @@ Status IndexAccessMethod::touch(OperationContext* txn, const BSONObj& obj) {
// There's no need to compute the prefixes of the indexed fields that cause the index to be
// multikey when paging a document's index entries into memory.
MultikeyPaths* multikeyPaths = nullptr;
- getKeys(obj, GetKeysMode::kEnforceConstraints, &keys, multikeyPaths);
+ getKeys(obj,
+ GetKeysMode::kEnforceConstraints,
+ GetKeysContext::kReadOrAddKeys,
+ &keys,
+ multikeyPaths);
std::unique_ptr<SortedDataInterface::Cursor> cursor(_newInterface->newCursor(txn));
for (BSONObjSet::const_iterator i = keys.begin(); i != keys.end(); ++i) {
@@ -252,7 +256,11 @@ RecordId IndexAccessMethod::findSingle(OperationContext* txn, const BSONObj& req
// For performance, call get keys only if there is a non-simple collation.
BSONObjSet keys = SimpleBSONObjComparator::kInstance.makeBSONObjSet();
MultikeyPaths* multikeyPaths = nullptr;
- getKeys(requestedKey, GetKeysMode::kEnforceConstraints, &keys, multikeyPaths);
+ getKeys(requestedKey,
+ GetKeysMode::kEnforceConstraints,
+ GetKeysContext::kReadOrAddKeys,
+ &keys,
+ multikeyPaths);
invariant(keys.size() == 1);
actualKey = *keys.begin();
} else {
@@ -341,11 +349,19 @@ Status IndexAccessMethod::validateUpdate(OperationContext* txn,
// index to be multikey when the old version of the document was written since the index
// metadata isn't updated when keys are deleted.
MultikeyPaths* multikeyPaths = nullptr;
- getKeys(from, options.getKeysMode, &ticket->oldKeys, multikeyPaths);
+ getKeys(from,
+ options.getKeysMode,
+ GetKeysContext::kRemovingKeys,
+ &ticket->oldKeys,
+ multikeyPaths);
}
if (!indexFilter || indexFilter->matchesBSON(to)) {
- getKeys(to, options.getKeysMode, &ticket->newKeys, &ticket->newMultikeyPaths);
+ getKeys(to,
+ options.getKeysMode,
+ GetKeysContext::kReadOrAddKeys,
+ &ticket->newKeys,
+ &ticket->newMultikeyPaths);
}
ticket->loc = record;
@@ -427,7 +443,7 @@ Status IndexAccessMethod::BulkBuilder::insert(OperationContext* txn,
BSONObjSet keys = SimpleBSONObjComparator::kInstance.makeBSONObjSet();
MultikeyPaths multikeyPaths;
- _real->getKeys(obj, options.getKeysMode, &keys, &multikeyPaths);
+ _real->getKeys(obj, options.getKeysMode, GetKeysContext::kReadOrAddKeys, &keys, &multikeyPaths);
_everGeneratedMultipleKeys = _everGeneratedMultipleKeys || (keys.size() > 1);
@@ -542,6 +558,7 @@ Status IndexAccessMethod::commitBulk(OperationContext* txn,
void IndexAccessMethod::getKeys(const BSONObj& obj,
GetKeysMode mode,
+ GetKeysContext context,
BSONObjSet* keys,
MultikeyPaths* multikeyPaths) const {
static stdx::unordered_set<int> whiteList{ErrorCodes::CannotBuildIndexKeys,
@@ -567,7 +584,7 @@ void IndexAccessMethod::getKeys(const BSONObj& obj,
13026,
13027};
try {
- doGetKeys(obj, keys, multikeyPaths);
+ doGetKeys(obj, context, keys, multikeyPaths);
} catch (const UserException& ex) {
if (mode == GetKeysMode::kEnforceConstraints) {
throw;