summaryrefslogtreecommitdiff
path: root/src/mongo/s
diff options
context:
space:
mode:
authorTess Avitabile <tess.avitabile@mongodb.com>2016-08-22 17:29:03 -0400
committerTess Avitabile <tess.avitabile@mongodb.com>2016-08-24 14:41:20 -0400
commitd91a23193b8a53e92b15ab9ecf310b9cbbf05b4c (patch)
tree56a81df62172807f01f5249d2f33df48ffc230f5 /src/mongo/s
parent2ce5f3b0afebbb10a70e5239e3790508efde11c9 (diff)
downloadmongo-d91a23193b8a53e92b15ab9ecf310b9cbbf05b4c.tar.gz
SERVER-25722 Ensure that shards are not added while _configSvrSetFeatureCompatibilityVersion is running
Diffstat (limited to 'src/mongo/s')
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp34
-rw-r--r--src/mongo/s/catalog/replset/sharding_catalog_manager_impl.h3
-rw-r--r--src/mongo/s/catalog/sharding_catalog_manager.h6
-rw-r--r--src/mongo/s/catalog/sharding_catalog_manager_mock.cpp5
-rw-r--r--src/mongo/s/catalog/sharding_catalog_manager_mock.h3
5 files changed, 51 insertions, 0 deletions
diff --git a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp
index 37a43598826..77dc96fd1fc 100644
--- a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp
+++ b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.cpp
@@ -1916,4 +1916,38 @@ void ShardingCatalogManagerImpl::_untrackAddShardHandle_inlock(const ShardId& sh
_addShardHandles.erase(shardId);
}
+Status ShardingCatalogManagerImpl::setFeatureCompatibilityVersionOnShards(
+ OperationContext* txn, const std::string& version) {
+
+ // No shards should be added until we have forwarded featureCompatibilityVersion to all shards.
+ Lock::SharedLock lk(txn->lockState(), _kShardMembershipLock);
+
+ std::vector<ShardId> shardIds;
+ grid.shardRegistry()->getAllShardIds(&shardIds);
+ for (const ShardId& shardId : shardIds) {
+ const auto shard = grid.shardRegistry()->getShard(txn, shardId);
+ if (!shard) {
+ continue;
+ }
+
+ auto response =
+ shard->runCommand(txn,
+ ReadPreferenceSetting{ReadPreference::PrimaryOnly},
+ "admin",
+ BSON(FeatureCompatibilityVersion::kCommandName << version),
+ Shard::RetryPolicy::kIdempotent);
+ if (!response.isOK()) {
+ return response.getStatus();
+ }
+ if (!response.getValue().commandStatus.isOK()) {
+ return response.getValue().commandStatus;
+ }
+ if (!response.getValue().writeConcernStatus.isOK()) {
+ return response.getValue().writeConcernStatus;
+ }
+ }
+
+ return Status::OK();
+}
+
} // namespace mongo
diff --git a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.h b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.h
index 397c64e2a83..516ab7aca52 100644
--- a/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.h
+++ b/src/mongo/s/catalog/replset/sharding_catalog_manager_impl.h
@@ -114,6 +114,9 @@ public:
void cancelAddShardTaskIfNeeded(const ShardId& shardId) override;
+ Status setFeatureCompatibilityVersionOnShards(OperationContext* txn,
+ const std::string& version) override;
+
private:
/**
* Generates a unique name to be given to a newly added shard.
diff --git a/src/mongo/s/catalog/sharding_catalog_manager.h b/src/mongo/s/catalog/sharding_catalog_manager.h
index a478d55f2d8..3a0c9c34a74 100644
--- a/src/mongo/s/catalog/sharding_catalog_manager.h
+++ b/src/mongo/s/catalog/sharding_catalog_manager.h
@@ -199,6 +199,12 @@ public:
*/
virtual void cancelAddShardTaskIfNeeded(const ShardId& shardId) = 0;
+ /**
+ * Runs the setFeatureCompatibilityVersion command on all shards.
+ */
+ virtual Status setFeatureCompatibilityVersionOnShards(OperationContext* txn,
+ const std::string& version) = 0;
+
protected:
ShardingCatalogManager() = default;
};
diff --git a/src/mongo/s/catalog/sharding_catalog_manager_mock.cpp b/src/mongo/s/catalog/sharding_catalog_manager_mock.cpp
index 577c179cd49..c9549bc32a4 100644
--- a/src/mongo/s/catalog/sharding_catalog_manager_mock.cpp
+++ b/src/mongo/s/catalog/sharding_catalog_manager_mock.cpp
@@ -123,4 +123,9 @@ void ShardingCatalogManagerMock::cancelAddShardTaskIfNeeded(const ShardId& shard
MONGO_UNREACHABLE;
}
+Status ShardingCatalogManagerMock::setFeatureCompatibilityVersionOnShards(
+ OperationContext* txn, const std::string& version) {
+ MONGO_UNREACHABLE;
+}
+
} // namespace mongo
diff --git a/src/mongo/s/catalog/sharding_catalog_manager_mock.h b/src/mongo/s/catalog/sharding_catalog_manager_mock.h
index 1b49be01afe..88d304385c7 100644
--- a/src/mongo/s/catalog/sharding_catalog_manager_mock.h
+++ b/src/mongo/s/catalog/sharding_catalog_manager_mock.h
@@ -94,6 +94,9 @@ public:
const std::string& shardName) override;
void cancelAddShardTaskIfNeeded(const ShardId& shardId) override;
+
+ Status setFeatureCompatibilityVersionOnShards(OperationContext* txn,
+ const std::string& version) override;
};
} // namespace mongo