From 066d5c3f49c415af84607603f6cbce82590c4da1 Mon Sep 17 00:00:00 2001 From: Robert Guo Date: Tue, 9 Feb 2016 13:47:28 -0500 Subject: SERVER-22234 The Validate Command Should Work with failIndexKeyTooLong --- src/mongo/db/catalog/collection.cpp | 32 ++++++++++++++++++++++++++------ src/mongo/db/commands/validate.cpp | 10 +++++----- src/mongo/db/index/index_access_method.h | 3 +++ src/mongo/db/storage/record_store.h | 1 + 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/mongo/db/catalog/collection.cpp b/src/mongo/db/catalog/collection.cpp index 596c80d396b..bc14618b4b9 100644 --- a/src/mongo/db/catalog/collection.cpp +++ b/src/mongo/db/catalog/collection.cpp @@ -54,6 +54,7 @@ #include "mongo/db/ops/update_driver.h" #include "mongo/db/ops/update_request.h" #include "mongo/db/repl/replication_coordinator_global.h" +#include "mongo/db/server_parameters.h" #include "mongo/db/service_context.h" #include "mongo/db/storage/mmap_v1/mmap_v1_options.h" #include "mongo/db/storage/record_fetcher.h" @@ -925,12 +926,26 @@ void validateIndexKeyCount(OperationContext* txn, int64_t numIdxKeys, int64_t numRecs, ValidateResults* results) { + if (!failIndexKeyTooLong) { + string warning = + "the server is configured with {failIndexKeyTooLong: false}. Validation failures " + "resulting from having fewer index entries than documents are downgraded from errors " + "to warnings"; + results->warnings.push_back(warning); + } + if (idx.isIdIndex() && numIdxKeys != numRecs) { - string err = str::stream() << "number of _id index entries (" << numIdxKeys + string msg = str::stream() << "number of _id index entries (" << numIdxKeys << ") does not match the number of documents (" << numRecs << ")"; - results->errors.push_back(err); - results->valid = false; + + if (failIndexKeyTooLong) { + results->errors.push_back(msg); + results->valid = false; + } else { + results->warnings.push_back(msg); + } + return; // Avoid failing the next two checks, they just add redundant/confusing messages } if (!idx.isMultikey(txn) && numIdxKeys > numRecs) { @@ -944,11 +959,16 @@ void validateIndexKeyCount(OperationContext* txn, // index plugin with different semantics. if (!idx.isSparse() && !idx.isPartial() && idx.getAccessMethodName() == "" && numIdxKeys < numRecs) { - string err = str::stream() << "index " << idx.indexName() + string msg = str::stream() << "index " << idx.indexName() << " is not sparse or partial, but has fewer entries (" << numIdxKeys << ") than documents (" << numRecs << ")"; - results->errors.push_back(err); - results->valid = false; + + if (failIndexKeyTooLong) { + results->errors.push_back(msg); + results->valid = false; + } else { + results->warnings.push_back(msg); + } } } } // namespace diff --git a/src/mongo/db/commands/validate.cpp b/src/mongo/db/commands/validate.cpp index 41d5b4afdb8..b4f87e353b7 100644 --- a/src/mongo/db/commands/validate.cpp +++ b/src/mongo/db/commands/validate.cpp @@ -107,15 +107,15 @@ public: if (!status.isOK()) return appendCommandStatus(result, status); - result.appendBool("valid", results.valid); - result.append("errors", results.errors); - if (!full) { - result.append( - "warning", + results.warnings.push_back( "Some checks omitted for speed. use {full:true} option to do more thorough scan."); } + result.appendBool("valid", results.valid); + result.append("warnings", results.warnings); + result.append("errors", results.errors); + if (!results.valid) { result.append("advice", "ns corrupt. See http://dochub.mongodb.org/core/data-recovery"); } diff --git a/src/mongo/db/index/index_access_method.h b/src/mongo/db/index/index_access_method.h index df62c4ae937..ea9ea90c71c 100644 --- a/src/mongo/db/index/index_access_method.h +++ b/src/mongo/db/index/index_access_method.h @@ -28,6 +28,7 @@ #pragma once +#include #include #include "mongo/base/disallow_copying.h" @@ -40,6 +41,8 @@ namespace mongo { +extern std::atomic failIndexKeyTooLong; // NOLINT + class BSONObjBuilder; class MatchExpression; class UpdateTicket; diff --git a/src/mongo/db/storage/record_store.h b/src/mongo/db/storage/record_store.h index b6e973a16ab..2beb8368bf4 100644 --- a/src/mongo/db/storage/record_store.h +++ b/src/mongo/db/storage/record_store.h @@ -604,6 +604,7 @@ struct ValidateResults { } bool valid; std::vector errors; + std::vector warnings; }; /** -- cgit v1.2.1