summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2021-03-09 02:45:40 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-03-09 03:52:02 +0000
commit8f5b19480757929c98a5d7675c4c1762b32b09e9 (patch)
tree55f9ecf39e834f240148054db54d4a4061fcb3ac /src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp
parentd4393f8baef001b8bd25ccd32055a156bb155777 (diff)
downloadmongo-8f5b19480757929c98a5d7675c4c1762b32b09e9.tar.gz
SERVER-54981 Add recipientShards field to resharding donor document.
Changes "reshardingFields.donorFields" to be filled in as part of the coordinator's transition to kPreparingToDonate.
Diffstat (limited to 'src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp')
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp b/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp
index 0ad26e7eae1..18d10d50547 100644
--- a/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp
+++ b/src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp
@@ -261,18 +261,28 @@ void processReshardingFieldsForRecipientCollection(OperationContext* opCtx,
void verifyValidReshardingFields(const ReshardingFields& reshardingFields) {
auto coordinatorState = reshardingFields.getState();
- if (coordinatorState < CoordinatorStateEnum::kDecisionPersisted) {
+ if (coordinatorState < CoordinatorStateEnum::kPreparingToDonate) {
+ // Prior to the state CoordinatorStateEnum::kPreparingToDonate, the source collection's
+ // config.collections entry won't have "donorFields". Additionally, the temporary resharding
+ // collection's config.collections entry won't exist yet.
+ uassert(5498100,
+ fmt::format("reshardingFields must not contain donorFields or recipientFields when"
+ " the coordinator is in state {}. Got reshardingFields {}",
+ CoordinatorState_serializer(reshardingFields.getState()),
+ reshardingFields.toBSON().toString()),
+ !reshardingFields.getDonorFields() && !reshardingFields.getRecipientFields());
+ } else if (coordinatorState < CoordinatorStateEnum::kDecisionPersisted) {
// Prior to the state CoordinatorStateEnum::kDecisionPersisted, only the source
// collection's config.collections entry should have donorFields, and only the
// temporary resharding collection's entry should have recipientFields.
uassert(5274201,
- fmt::format("reshardingFields must contain either donorFields or recipientFields "
- "(and not both) when the "
- "coordinator is in state {}. Got reshardingFields {}",
+ fmt::format("reshardingFields must contain exactly one of donorFields and"
+ " recipientFields when the coordinator is in state {}. Got"
+ " reshardingFields {}",
CoordinatorState_serializer(reshardingFields.getState()),
reshardingFields.toBSON().toString()),
- reshardingFields.getDonorFields().is_initialized() ^
- reshardingFields.getRecipientFields().is_initialized());
+ bool(reshardingFields.getDonorFields()) !=
+ bool(reshardingFields.getRecipientFields()));
} else {
// At and after state CoordinatorStateEnum::kDecisionPersisted, the temporary
// resharding collection's config.collections entry has been removed, and so the
@@ -295,7 +305,8 @@ ReshardingDonorDocument constructDonorDocumentFromReshardingFields(
DonorShardContext donorCtx;
donorCtx.setState(DonorStateEnum::kPreparingToDonate);
- auto donorDoc = ReshardingDonorDocument{std::move(donorCtx)};
+ auto donorDoc = ReshardingDonorDocument{
+ std::move(donorCtx), reshardingFields.getDonorFields()->getRecipientShardIds()};
auto sourceUUID = getCollectionUUIDFromChunkManger(nss, *metadata.getChunkManager());
auto commonMetadata =