summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Guo <robert.guo@10gen.com>2016-02-09 13:47:28 -0500
committerRobert Guo <robert.guo@10gen.com>2016-02-09 13:47:28 -0500
commit066d5c3f49c415af84607603f6cbce82590c4da1 (patch)
tree3984f7e0d2bfc62ece49df34960fd880d4af9adb
parent3bed8596d18275d1561e4f44f1f0bd72c1e038f1 (diff)
downloadmongo-066d5c3f49c415af84607603f6cbce82590c4da1.tar.gz
SERVER-22234 The Validate Command Should Work with failIndexKeyTooLong
-rw-r--r--src/mongo/db/catalog/collection.cpp32
-rw-r--r--src/mongo/db/commands/validate.cpp10
-rw-r--r--src/mongo/db/index/index_access_method.h3
-rw-r--r--src/mongo/db/storage/record_store.h1
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;
};
/**