diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2021-03-09 02:45:40 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-03-09 03:52:02 +0000 |
commit | 8f5b19480757929c98a5d7675c4c1762b32b09e9 (patch) | |
tree | 55f9ecf39e834f240148054db54d4a4061fcb3ac /src/mongo/db/s/resharding/resharding_donor_recipient_common.cpp | |
parent | d4393f8baef001b8bd25ccd32055a156bb155777 (diff) | |
download | mongo-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.cpp | 25 |
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 = |