summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp')
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp
index bb2e5ece687..e1e8374c5c3 100644
--- a/src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp
+++ b/src/mongo/db/s/config/sharding_catalog_manager_chunk_operations.cpp
@@ -237,6 +237,36 @@ BSONObj makeCommitChunkTransactionCommand(const NamespaceString& nss,
return BSON("applyOps" << updates.arr());
}
+/**
+ * Returns a chunk different from the one being migrated or 'none' if one doesn't exist.
+ */
+boost::optional<ChunkType> getControlChunkForMigrate(OperationContext* opCtx,
+ const NamespaceString& nss,
+ const ChunkType& migratedChunk,
+ const ShardId& fromShard) {
+ auto const configShard = Grid::get(opCtx)->shardRegistry()->getConfigShard();
+
+ BSONObjBuilder queryBuilder;
+ queryBuilder << ChunkType::ns(nss.ns());
+ queryBuilder << ChunkType::shard(fromShard.toString());
+ queryBuilder << ChunkType::min(BSON("$ne" << migratedChunk.getMin()));
+
+ auto status =
+ configShard->exhaustiveFindOnConfig(opCtx,
+ ReadPreferenceSetting{ReadPreference::PrimaryOnly},
+ repl::ReadConcernLevel::kLocalReadConcern,
+ ChunkType::ConfigNS,
+ queryBuilder.obj(),
+ {},
+ 1);
+ auto response = uassertStatusOK(status);
+ if (response.docs.empty()) {
+ return boost::none;
+ }
+
+ return uassertStatusOK(ChunkType::fromConfigBSON(response.docs.front()));
+}
+
} // namespace
Status ShardingCatalogManager::commitChunkSplit(OperationContext* opCtx,
@@ -576,7 +606,6 @@ StatusWith<BSONObj> ShardingCatalogManager::commitChunkMigration(
OperationContext* opCtx,
const NamespaceString& nss,
const ChunkType& migratedChunk,
- const boost::optional<ChunkType>& controlChunk,
const OID& collectionEpoch,
const ShardId& fromShard,
const ShardId& toShard,
@@ -652,21 +681,14 @@ StatusWith<BSONObj> ShardingCatalogManager::commitChunkMigration(
<< ")."};
}
- // Check that migratedChunk and controlChunk are where they should be, on fromShard.
-
+ // Check that migratedChunk is where it should be, on fromShard.
auto migratedOnShard =
checkChunkIsOnShard(opCtx, nss, migratedChunk.getMin(), migratedChunk.getMax(), fromShard);
if (!migratedOnShard.isOK()) {
return migratedOnShard;
}
- if (controlChunk) {
- auto controlOnShard = checkChunkIsOnShard(
- opCtx, nss, controlChunk->getMin(), controlChunk->getMax(), fromShard);
- if (!controlOnShard.isOK()) {
- return controlOnShard;
- }
- }
+ auto controlChunk = getControlChunkForMigrate(opCtx, nss, migratedChunk, fromShard);
// Find the chunk history.
const auto origChunk = _findChunkOnConfig(opCtx, nss, migratedChunk.getMin());