diff options
author | Robert Guo <robert.guo@10gen.com> | 2016-02-09 13:47:28 -0500 |
---|---|---|
committer | Robert Guo <robert.guo@10gen.com> | 2016-02-09 13:47:28 -0500 |
commit | 066d5c3f49c415af84607603f6cbce82590c4da1 (patch) | |
tree | 3984f7e0d2bfc62ece49df34960fd880d4af9adb | |
parent | 3bed8596d18275d1561e4f44f1f0bd72c1e038f1 (diff) | |
download | mongo-066d5c3f49c415af84607603f6cbce82590c4da1.tar.gz |
SERVER-22234 The Validate Command Should Work with failIndexKeyTooLong
-rw-r--r-- | src/mongo/db/catalog/collection.cpp | 32 | ||||
-rw-r--r-- | src/mongo/db/commands/validate.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/index/index_access_method.h | 3 | ||||
-rw-r--r-- | 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 <atomic> #include <memory> #include "mongo/base/disallow_copying.h" @@ -40,6 +41,8 @@ namespace mongo { +extern std::atomic<bool> 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<std::string> errors; + std::vector<std::string> warnings; }; /** |