diff options
author | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-08-22 17:29:03 -0400 |
---|---|---|
committer | Tess Avitabile <tess.avitabile@mongodb.com> | 2016-08-24 14:41:20 -0400 |
commit | d91a23193b8a53e92b15ab9ecf310b9cbbf05b4c (patch) | |
tree | 56a81df62172807f01f5249d2f33df48ffc230f5 /src/mongo/s | |
parent | 2ce5f3b0afebbb10a70e5239e3790508efde11c9 (diff) | |
download | mongo-d91a23193b8a53e92b15ab9ecf310b9cbbf05b4c.tar.gz |
SERVER-25722 Ensure that shards are not added while _configSvrSetFeatureCompatibilityVersion is running
Diffstat (limited to 'src/mongo/s')
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 |