summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBlake Oler <blake.oler@mongodb.com>2019-03-26 13:25:21 -0400
committerBlake Oler <blake.oler@mongodb.com>2019-03-26 17:21:03 -0400
commit8a19243db63197056d6230daa92cf54a847912e4 (patch)
tree48c8113965e0d1c073358d2870c70ae0b6f185f3 /src
parent43e089c8cea5d0d88b37ec59d3943d10bcbd0c9f (diff)
downloadmongo-8a19243db63197056d6230daa92cf54a847912e4.tar.gz
SERVER-40333 Only clone collection options once for each shard in shardsvrShardCollection
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/s/shardsvr_shard_collection.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/mongo/db/s/shardsvr_shard_collection.cpp b/src/mongo/db/s/shardsvr_shard_collection.cpp
index 02aec5ce450..e6bff1ed444 100644
--- a/src/mongo/db/s/shardsvr_shard_collection.cpp
+++ b/src/mongo/db/s/shardsvr_shard_collection.cpp
@@ -473,9 +473,14 @@ void shardCollection(OperationContext* opCtx,
// want to do this for mapReduce.
if (!fromMapReduce) {
std::vector<AsyncRequestsSender::Request> requests;
+ std::set<ShardId> initializedShards;
for (const auto& chunk : initialChunks.chunks) {
- if (chunk.getShard() == dbPrimaryShardId)
+ const auto& chunkShardId = chunk.getShard();
+ if (chunkShardId == dbPrimaryShardId ||
+ initializedShards.find(chunkShardId) != initializedShards.end()) {
continue;
+ }
+
CloneCollectionOptionsFromPrimaryShard cloneCollectionOptionsFromPrimaryShardRequest(
nss);
@@ -484,9 +489,11 @@ void shardCollection(OperationContext* opCtx,
cloneCollectionOptionsFromPrimaryShardRequest.setDbName(nss.db());
requests.emplace_back(
- chunk.getShard(),
+ chunkShardId,
cloneCollectionOptionsFromPrimaryShardRequest.toBSON(
BSON("writeConcern" << ShardingCatalogClient::kMajorityWriteConcern.toBSON())));
+
+ initializedShards.emplace(chunkShardId);
}
if (!requests.empty()) {
@@ -533,15 +540,15 @@ void shardCollection(OperationContext* opCtx,
forceShardFilteringMetadataRefresh(opCtx, nss);
- std::vector<ShardId> shardsRefreshed;
+ std::set<ShardId> shardsRefreshed;
for (const auto& chunk : initialChunks.chunks) {
- if ((chunk.getShard() == dbPrimaryShardId) ||
- std::find(shardsRefreshed.begin(), shardsRefreshed.end(), chunk.getShard()) !=
- shardsRefreshed.end()) {
+ const auto& chunkShardId = chunk.getShard();
+ if (chunkShardId == dbPrimaryShardId ||
+ shardsRefreshed.find(chunkShardId) != shardsRefreshed.end()) {
continue;
}
- auto shard = uassertStatusOK(shardRegistry->getShard(opCtx, chunk.getShard()));
+ auto shard = uassertStatusOK(shardRegistry->getShard(opCtx, chunkShardId));
auto refreshCmdResponse = uassertStatusOK(shard->runCommandWithFixedRetryAttempts(
opCtx,
ReadPreferenceSetting{ReadPreference::PrimaryOnly},
@@ -551,7 +558,7 @@ void shardCollection(OperationContext* opCtx,
Shard::RetryPolicy::kIdempotent));
uassertStatusOK(refreshCmdResponse.commandStatus);
- shardsRefreshed.emplace_back(chunk.getShard());
+ shardsRefreshed.emplace(chunkShardId);
}
ShardingLogging::get(opCtx)->logChange(