summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/validate.cpp
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2021-01-28 15:36:38 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-01-29 00:01:41 +0000
commit0d6199bb52dcae5978551816c6ac4ad98bda165b (patch)
tree0f1a707ead6ea117e4937414695fe4593d748dc6 /src/mongo/db/commands/validate.cpp
parent603f25ced3e7917ce94cf95265e7ffa0893b7fa6 (diff)
downloadmongo-0d6199bb52dcae5978551816c6ac4ad98bda165b.tar.gz
SERVER-53675 Allow validate to fix up multikey metadata
This allows foreground validation to fix up the following multikey metadata inconsistencies: * An index is multikey but there are no multikey fields * An index has multikeyPaths covering fields that are not multikey * An index does not have multikeyPaths but there are multikey documents (for pre-3.4 indexes) If any changes were made, a warning is included to the validate output and the 'repaired' flag is set to true.
Diffstat (limited to 'src/mongo/db/commands/validate.cpp')
-rw-r--r--src/mongo/db/commands/validate.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/mongo/db/commands/validate.cpp b/src/mongo/db/commands/validate.cpp
index c1d787a49bb..bdde2c3156a 100644
--- a/src/mongo/db/commands/validate.cpp
+++ b/src/mongo/db/commands/validate.cpp
@@ -212,8 +212,25 @@ public:
return CollectionValidation::ValidateMode::kForeground;
}();
- auto repairMode = repair ? CollectionValidation::RepairMode::kRepair
- : CollectionValidation::RepairMode::kNone;
+ auto repairMode = [&] {
+ switch (mode) {
+ case CollectionValidation::ValidateMode::kForeground:
+ case CollectionValidation::ValidateMode::kForegroundFull:
+ case CollectionValidation::ValidateMode::kForegroundFullIndexOnly:
+ // Foreground validation may not repair data while running as a replica set node
+ // because we do not have timestamps that are required to perform writes.
+ if (replCoord->isReplEnabled()) {
+ return CollectionValidation::RepairMode::kNone;
+ }
+ if (repair) {
+ return CollectionValidation::RepairMode::kFixErrors;
+ }
+ // Foreground validation will adjust multikey metadata by default.
+ return CollectionValidation::RepairMode::kAdjustMultikey;
+ default:
+ return CollectionValidation::RepairMode::kNone;
+ }
+ }();
if (repair) {
opCtx->recoveryUnit()->setPrepareConflictBehavior(