summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVesselina Ratcheva <vesselina.ratcheva@10gen.com>2020-02-14 16:17:33 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-02-18 18:27:39 +0000
commit34dc015fcb40b8e4c2c99aadf1a78d7b64de6146 (patch)
tree62716f0181b9f755cce63ee6ad55ad1d0f42a636 /src
parentc18271eaf8bf8a85549ffec363748b40e57b9392 (diff)
downloadmongo-34dc015fcb40b8e4c2c99aadf1a78d7b64de6146.tar.gz
SERVER-45610 Reject commands that read data when node is in RECOVERING state
This reverts commit 542de84ec1e17520bd0d99d54a024ff0e0bc3de2. create mode 100644 jstests/libs/all_commands_test.js create mode 100644 jstests/replsets/db_reads_while_recovering_all_commands.js
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/commands/dbcheck.cpp4
-rw-r--r--src/mongo/db/commands/dbcommands.cpp6
-rw-r--r--src/mongo/db/commands/distinct.cpp4
-rw-r--r--src/mongo/db/commands/list_collections.cpp3
-rw-r--r--src/mongo/db/commands/list_databases.cpp3
-rw-r--r--src/mongo/db/commands/list_indexes.cpp3
-rw-r--r--src/mongo/db/commands/pipeline_command.cpp4
-rw-r--r--src/mongo/s/commands/cluster_coll_stats_cmd.cpp4
-rw-r--r--src/mongo/s/commands/cluster_db_stats_cmd.cpp4
-rw-r--r--src/mongo/s/commands/cluster_distinct_cmd.cpp4
-rw-r--r--src/mongo/s/commands/cluster_list_databases_cmd.cpp4
-rw-r--r--src/mongo/s/commands/commands_public.cpp8
-rw-r--r--src/mongo/shell/replsettest.js20
13 files changed, 66 insertions, 5 deletions
diff --git a/src/mongo/db/commands/dbcheck.cpp b/src/mongo/db/commands/dbcheck.cpp
index 42cfdf10cd6..a446095f91b 100644
--- a/src/mongo/db/commands/dbcheck.cpp
+++ b/src/mongo/db/commands/dbcheck.cpp
@@ -492,6 +492,10 @@ public:
return AllowedOnSecondary::kNever;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
virtual bool adminOnly() const {
return false;
}
diff --git a/src/mongo/db/commands/dbcommands.cpp b/src/mongo/db/commands/dbcommands.cpp
index e21d689045a..a7015ebf7ec 100644
--- a/src/mongo/db/commands/dbcommands.cpp
+++ b/src/mongo/db/commands/dbcommands.cpp
@@ -562,6 +562,9 @@ public:
AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
virtual bool supportsWriteConcern(const BSONObj& cmd) const override {
return false;
}
@@ -644,6 +647,9 @@ public:
AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
virtual bool supportsWriteConcern(const BSONObj& cmd) const override {
return false;
}
diff --git a/src/mongo/db/commands/distinct.cpp b/src/mongo/db/commands/distinct.cpp
index b4e16653a51..d04cb68ebbc 100644
--- a/src/mongo/db/commands/distinct.cpp
+++ b/src/mongo/db/commands/distinct.cpp
@@ -76,6 +76,10 @@ public:
return AllowedOnSecondary::kOptIn;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool supportsWriteConcern(const BSONObj& cmd) const override {
return false;
}
diff --git a/src/mongo/db/commands/list_collections.cpp b/src/mongo/db/commands/list_collections.cpp
index d3841cbaed8..7ef36d2e1cf 100644
--- a/src/mongo/db/commands/list_collections.cpp
+++ b/src/mongo/db/commands/list_collections.cpp
@@ -214,6 +214,9 @@ public:
AllowedOnSecondary secondaryAllowed(ServiceContext*) const final {
return AllowedOnSecondary::kOptIn;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
bool adminOnly() const final {
return false;
}
diff --git a/src/mongo/db/commands/list_databases.cpp b/src/mongo/db/commands/list_databases.cpp
index 19ebc60b933..9a383f85522 100644
--- a/src/mongo/db/commands/list_databases.cpp
+++ b/src/mongo/db/commands/list_databases.cpp
@@ -68,6 +68,9 @@ public:
bool adminOnly() const final {
return true;
}
+ bool maintenanceOk() const final {
+ return false;
+ }
bool supportsWriteConcern(const BSONObj& cmd) const final {
return false;
}
diff --git a/src/mongo/db/commands/list_indexes.cpp b/src/mongo/db/commands/list_indexes.cpp
index dafefa6f1ee..02dc4b7ead2 100644
--- a/src/mongo/db/commands/list_indexes.cpp
+++ b/src/mongo/db/commands/list_indexes.cpp
@@ -96,6 +96,9 @@ public:
return AllowedOnSecondary::kOptIn;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
virtual bool adminOnly() const {
return false;
}
diff --git a/src/mongo/db/commands/pipeline_command.cpp b/src/mongo/db/commands/pipeline_command.cpp
index a70ae8a51d3..d068dc2812a 100644
--- a/src/mongo/db/commands/pipeline_command.cpp
+++ b/src/mongo/db/commands/pipeline_command.cpp
@@ -168,7 +168,9 @@ public:
AllowedOnSecondary secondaryAllowed(ServiceContext*) const override {
return AllowedOnSecondary::kOptIn;
}
-
+ bool maintenanceOk() const override {
+ return false;
+ }
ReadWriteType getReadWriteType() const {
return ReadWriteType::kRead;
}
diff --git a/src/mongo/s/commands/cluster_coll_stats_cmd.cpp b/src/mongo/s/commands/cluster_coll_stats_cmd.cpp
index c1c9a24d5f8..b6b78d452df 100644
--- a/src/mongo/s/commands/cluster_coll_stats_cmd.cpp
+++ b/src/mongo/s/commands/cluster_coll_stats_cmd.cpp
@@ -53,6 +53,10 @@ public:
return false;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
std::string parseNs(const std::string& dbname, const BSONObj& cmdObj) const override {
return CommandHelpers::parseNsCollectionRequired(dbname, cmdObj).ns();
}
diff --git a/src/mongo/s/commands/cluster_db_stats_cmd.cpp b/src/mongo/s/commands/cluster_db_stats_cmd.cpp
index 3408419de95..b8b9e2f90f9 100644
--- a/src/mongo/s/commands/cluster_db_stats_cmd.cpp
+++ b/src/mongo/s/commands/cluster_db_stats_cmd.cpp
@@ -88,6 +88,10 @@ public:
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool adminOnly() const override {
return false;
}
diff --git a/src/mongo/s/commands/cluster_distinct_cmd.cpp b/src/mongo/s/commands/cluster_distinct_cmd.cpp
index bba351c4f58..1b19ddaad90 100644
--- a/src/mongo/s/commands/cluster_distinct_cmd.cpp
+++ b/src/mongo/s/commands/cluster_distinct_cmd.cpp
@@ -64,6 +64,10 @@ public:
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool adminOnly() const override {
return false;
}
diff --git a/src/mongo/s/commands/cluster_list_databases_cmd.cpp b/src/mongo/s/commands/cluster_list_databases_cmd.cpp
index fb5e9ab261a..4222656f498 100644
--- a/src/mongo/s/commands/cluster_list_databases_cmd.cpp
+++ b/src/mongo/s/commands/cluster_list_databases_cmd.cpp
@@ -55,6 +55,10 @@ public:
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool adminOnly() const override {
return true;
}
diff --git a/src/mongo/s/commands/commands_public.cpp b/src/mongo/s/commands/commands_public.cpp
index bcdeaeb3b02..16f56cd9d24 100644
--- a/src/mongo/s/commands/commands_public.cpp
+++ b/src/mongo/s/commands/commands_public.cpp
@@ -365,6 +365,10 @@ public:
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool adminOnly() const override {
return false;
}
@@ -517,6 +521,10 @@ public:
return AllowedOnSecondary::kAlways;
}
+ bool maintenanceOk() const override {
+ return false;
+ }
+
bool adminOnly() const override {
return false;
}
diff --git a/src/mongo/shell/replsettest.js b/src/mongo/shell/replsettest.js
index 1160d4b454c..c83a4788989 100644
--- a/src/mongo/shell/replsettest.js
+++ b/src/mongo/shell/replsettest.js
@@ -2193,10 +2193,15 @@ var ReplSetTest = function(opts) {
print("checkDBHashesForReplSet checking data hashes against primary: " + primary.host);
- slaves.forEach(secondary => {
+ slaves.forEach(node => {
+ // Arbiters have no replicated data.
+ if (isNodeArbiter(node)) {
+ print("checkDBHashesForReplSet skipping data of arbiter: " + node.host);
+ return;
+ }
print("checkDBHashesForReplSet going to check data hashes on secondary: " +
- secondary.host);
- secondary.getDBNames().forEach(dbName => combinedDBs.add(dbName));
+ node.host);
+ node.getDBNames().forEach(dbName => combinedDBs.add(dbName));
});
for (var dbName of combinedDBs) {
@@ -2621,7 +2626,14 @@ var ReplSetTest = function(opts) {
}
function checkCollectionCountsForReplSet(rst) {
- rst.nodes.forEach(node => checkCollectionCountsForNode(node));
+ rst.nodes.forEach(node => {
+ // Arbiters have no replicated collections.
+ if (isNodeArbiter(node)) {
+ print("checkCollectionCounts skipping counts for arbiter: " + node.host);
+ return;
+ }
+ checkCollectionCountsForNode(node);
+ });
assert(success, `Collection counts did not match. search for '${errPrefix}' in logs.`);
}