diff options
author | Blake Oler <blake.oler@mongodb.com> | 2020-11-17 20:20:37 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-11-24 21:01:35 +0000 |
commit | 5f72078a11a072b2af8cae30b195038945e49755 (patch) | |
tree | aa94fa057dd2babf5426af8954b767d52ab2953e | |
parent | 0e69ddaa39b360d4083a55041b2f792c1cd61ec5 (diff) | |
download | mongo-5f72078a11a072b2af8cae30b195038945e49755.tar.gz |
SERVER-52802 Remove kDropping from the ReshardingCoordinator
6 files changed, 39 insertions, 51 deletions
diff --git a/src/mongo/db/s/collection_metadata.cpp b/src/mongo/db/s/collection_metadata.cpp index a8598ce826b..d72b013b9ac 100644 --- a/src/mongo/db/s/collection_metadata.cpp +++ b/src/mongo/db/s/collection_metadata.cpp @@ -70,7 +70,6 @@ boost::optional<ShardKeyPattern> CollectionMetadata::getReshardingKeyIfShouldFor case CoordinatorStateEnum::kMirroring: case CoordinatorStateEnum::kCommitted: case CoordinatorStateEnum::kRenaming: - case CoordinatorStateEnum::kDropping: case CoordinatorStateEnum::kDone: case CoordinatorStateEnum::kError: return boost::none; @@ -109,7 +108,6 @@ bool CollectionMetadata::writesShouldRunInDistributedTransaction(const OID& orig return true; case CoordinatorStateEnum::kRenaming: break; - case CoordinatorStateEnum::kDropping: case CoordinatorStateEnum::kDone: case CoordinatorStateEnum::kError: return false; diff --git a/src/mongo/db/s/resharding/resharding_coordinator_observer.h b/src/mongo/db/s/resharding/resharding_coordinator_observer.h index b3e1e4acf35..27a64fa53be 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_observer.h +++ b/src/mongo/db/s/resharding/resharding_coordinator_observer.h @@ -92,18 +92,18 @@ public: SharedSemiFuture<ReshardingCoordinatorDocument> awaitAllRecipientsInStrictConsistency(); /** - * Fulfills the '_allDonorsDroppedOriginalCollection' promise when the last donor writes that it - * is in 'done' state. - */ - SharedSemiFuture<ReshardingCoordinatorDocument> awaitAllDonorsDroppedOriginalCollection(); - - /** * Fulfills the '_allRecipientsRenamedCollection' promise when the last recipient writes * that it is in 'done' state. */ SharedSemiFuture<ReshardingCoordinatorDocument> awaitAllRecipientsRenamedCollection(); /** + * Fulfills the '_allDonorsDroppedOriginalCollection' promise when the last donor writes that it + * is in 'done' state. + */ + SharedSemiFuture<ReshardingCoordinatorDocument> awaitAllDonorsDroppedOriginalCollection(); + + /** * Sets errors on any promises that have not yet been fulfilled. */ void interrupt(Status status); diff --git a/src/mongo/db/s/resharding/resharding_coordinator_service.cpp b/src/mongo/db/s/resharding/resharding_coordinator_service.cpp index b90af097d0b..2e9b66818b6 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_service.cpp +++ b/src/mongo/db/s/resharding/resharding_coordinator_service.cpp @@ -44,6 +44,7 @@ #include "mongo/s/grid.h" #include "mongo/s/shard_id.h" #include "mongo/s/write_ops/batched_command_response.h" +#include "mongo/util/future_util.h" #include "mongo/util/string_map.h" #include "mongo/util/uuid.h" @@ -398,17 +399,16 @@ std::vector<ShardId> extractShardIds(const std::vector<T>& participantShardEntri /** * Maps which participants are to be notified when the coordinator transitions into a given state. */ -enum class ParticipantsToNofityEnum { kDonors, kRecipientsTempNss, kRecipientsOrigNss, kNone }; +enum class ParticipantsToNofityEnum { kDonors, kRecipients, kAllParticipantsPostCommit, kNone }; stdx::unordered_map<CoordinatorStateEnum, ParticipantsToNofityEnum> notifyForStateTransition{ {CoordinatorStateEnum::kUnused, ParticipantsToNofityEnum::kNone}, {CoordinatorStateEnum::kInitializing, ParticipantsToNofityEnum::kNone}, {CoordinatorStateEnum::kPreparingToDonate, ParticipantsToNofityEnum::kDonors}, - {CoordinatorStateEnum::kCloning, ParticipantsToNofityEnum::kRecipientsTempNss}, + {CoordinatorStateEnum::kCloning, ParticipantsToNofityEnum::kRecipients}, {CoordinatorStateEnum::kApplying, ParticipantsToNofityEnum::kDonors}, {CoordinatorStateEnum::kMirroring, ParticipantsToNofityEnum::kDonors}, {CoordinatorStateEnum::kCommitted, ParticipantsToNofityEnum::kNone}, - {CoordinatorStateEnum::kRenaming, ParticipantsToNofityEnum::kRecipientsOrigNss}, - {CoordinatorStateEnum::kDropping, ParticipantsToNofityEnum::kDonors}, + {CoordinatorStateEnum::kRenaming, ParticipantsToNofityEnum::kAllParticipantsPostCommit}, {CoordinatorStateEnum::kDone, ParticipantsToNofityEnum::kNone}, {CoordinatorStateEnum::kError, ParticipantsToNofityEnum::kNone}, }; @@ -462,7 +462,7 @@ void bumpShardVersionsThenExecuteStateTransitionAndMetadataChangesInTxn( updatedCoordinatorDoc.getNss(), extractShardIds(updatedCoordinatorDoc.getDonorShards()), std::move(changeMetadataFunc)); - } else if (participantsToNotify == ParticipantsToNofityEnum::kRecipientsTempNss) { + } else if (participantsToNotify == ParticipantsToNofityEnum::kRecipients) { // Bump the recipient shard versions for the temporary resharding namespace along with // updating the metadata. ShardingCatalogManager::get(opCtx)->bumpCollShardVersionsAndChangeMetadataInTxn( @@ -470,9 +470,10 @@ void bumpShardVersionsThenExecuteStateTransitionAndMetadataChangesInTxn( updatedCoordinatorDoc.getTempReshardingNss(), extractShardIds(updatedCoordinatorDoc.getRecipientShards()), std::move(changeMetadataFunc)); - } else if (participantsToNotify == ParticipantsToNofityEnum::kRecipientsOrigNss) { + } else if (participantsToNotify == ParticipantsToNofityEnum::kAllParticipantsPostCommit) { // Bump the recipient shard versions for the original resharding namespace along with - // updating the metadata. + // updating the metadata. Only the recipient shards will have chunks for the namespace + // after commit, bumping chunk versions on the donor shards would not apply. ShardingCatalogManager::get(opCtx)->bumpCollShardVersionsAndChangeMetadataInTxn( opCtx, updatedCoordinatorDoc.getNss(), @@ -678,11 +679,10 @@ SemiFuture<void> ReshardingCoordinatorService::ReshardingCoordinator::run( _coordinatorDoc); return; }) - .then([this, executor] { _tellAllRecipientsToRefresh(executor); }) - .then([this, executor] { return _awaitAllRecipientsRenamedCollection(executor); }) - .then([this, executor] { _tellAllDonorsToRefresh(executor); }) - .then([this, executor] { return _awaitAllDonorsDroppedOriginalCollection(executor); }) .then([this, executor] { _tellAllParticipantsToRefresh(executor); }) + .then([this, executor] { + return _awaitAllParticipantShardsRenamedOrDroppedOriginalCollection(executor); + }) .onError([this, executor](Status status) { stdx::lock_guard<Latch> lg(_mutex); if (_completionPromise.getFuture().isReady()) { @@ -859,33 +859,26 @@ Future<void> ReshardingCoordinatorService::ReshardingCoordinator::_commit( return Status::OK(); }; -ExecutorFuture<void> -ReshardingCoordinatorService::ReshardingCoordinator::_awaitAllRecipientsRenamedCollection( - const std::shared_ptr<executor::ScopedTaskExecutor>& executor) { +ExecutorFuture<void> ReshardingCoordinatorService::ReshardingCoordinator:: + _awaitAllParticipantShardsRenamedOrDroppedOriginalCollection( + const std::shared_ptr<executor::ScopedTaskExecutor>& executor) { if (_coordinatorDoc.getState() > CoordinatorStateEnum::kRenaming) { return ExecutorFuture<void>(**executor, Status::OK()); } - return _reshardingCoordinatorObserver->awaitAllRecipientsRenamedCollection() - .thenRunOn(**executor) - .then([this](ReshardingCoordinatorDocument coordinatorDocChangedOnDisk) { - _updateCoordinatorDocStateAndCatalogEntries(CoordinatorStateEnum::kDropping, - coordinatorDocChangedOnDisk); - }); -} - -ExecutorFuture<void> -ReshardingCoordinatorService::ReshardingCoordinator::_awaitAllDonorsDroppedOriginalCollection( - const std::shared_ptr<executor::ScopedTaskExecutor>& executor) { - if (_coordinatorDoc.getState() > CoordinatorStateEnum::kDropping) { - return ExecutorFuture<void>(**executor, Status::OK()); - } + std::vector<ExecutorFuture<ReshardingCoordinatorDocument>> futures; + futures.emplace_back( + _reshardingCoordinatorObserver->awaitAllRecipientsRenamedCollection().thenRunOn( + **executor)); + futures.emplace_back( + _reshardingCoordinatorObserver->awaitAllDonorsDroppedOriginalCollection().thenRunOn( + **executor)); - return _reshardingCoordinatorObserver->awaitAllDonorsDroppedOriginalCollection() + return whenAllSucceed(std::move(futures)) .thenRunOn(**executor) - .then([this](ReshardingCoordinatorDocument coordinatorDocChangedOnDisk) { + .then([this, executor](const auto& coordinatorDocsChangedOnDisk) { _updateCoordinatorDocStateAndCatalogEntries(CoordinatorStateEnum::kDone, - coordinatorDocChangedOnDisk); + coordinatorDocsChangedOnDisk[1]); }); } diff --git a/src/mongo/db/s/resharding/resharding_coordinator_service.h b/src/mongo/db/s/resharding/resharding_coordinator_service.h index 26cca998bea..833a9f4450d 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_service.h +++ b/src/mongo/db/s/resharding/resharding_coordinator_service.h @@ -182,17 +182,15 @@ private: Future<void> _commit(const ReshardingCoordinatorDocument& updatedDoc); /** - * Waits on _reshardingCoordinatorObserver to notify that all recipients have renamed the - * temporary collection to the original collection namespace. Transitions to 'kDropping'. - */ - ExecutorFuture<void> _awaitAllRecipientsRenamedCollection( - const std::shared_ptr<executor::ScopedTaskExecutor>& executor); - - /** - * Waits on _reshardingCoordinatorObserver to notify that all donors have dropped the - * original collection. Transitions to 'kDone'. + * Waits on _reshardingCoordinatorObserver to notify that: + * 1. All recipient shards have renamed the temporary collection to the original collection + * namespace, and + * 2. All donor shards that were not also recipient shards have dropped the original + * collection. + * + * Transitions to 'kDone'. */ - ExecutorFuture<void> _awaitAllDonorsDroppedOriginalCollection( + ExecutorFuture<void> _awaitAllParticipantShardsRenamedOrDroppedOriginalCollection( const std::shared_ptr<executor::ScopedTaskExecutor>& executor); /** diff --git a/src/mongo/db/s/resharding/resharding_coordinator_test.cpp b/src/mongo/db/s/resharding/resharding_coordinator_test.cpp index 4810d2710ef..3c455384ceb 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_test.cpp +++ b/src/mongo/db/s/resharding/resharding_coordinator_test.cpp @@ -681,7 +681,7 @@ TEST_F(ReshardingCoordinatorPersistenceTest, PersistTransitionToErrorSucceeds) { TEST_F(ReshardingCoordinatorPersistenceTest, PersistTransitionToDoneSucceeds) { auto coordinatorDoc = - insertStateAndCatalogEntries(CoordinatorStateEnum::kDropping, _finalEpoch); + insertStateAndCatalogEntries(CoordinatorStateEnum::kRenaming, _finalEpoch); // Persist the updates on disk auto expectedCoordinatorDoc = coordinatorDoc; diff --git a/src/mongo/s/resharding/common_types.idl b/src/mongo/s/resharding/common_types.idl index 6928129a6ff..41368c2c60a 100644 --- a/src/mongo/s/resharding/common_types.idl +++ b/src/mongo/s/resharding/common_types.idl @@ -49,7 +49,6 @@ enums: kMirroring: "mirroring" kCommitted: "committed" kRenaming: "renaming" - kDropping: "dropping" kDone: "done" kError: "error" |