Skip to content

Commit c61c5d7

Browse files
committed
Fix DD hang during multi-region failover by decoupling health reporting from remote TC startup
1 parent b363e11 commit c61c5d7

4 files changed

Lines changed: 11 additions & 6 deletions

File tree

fdbserver/datadistributor/DDTeamCollection.actor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4470,8 +4470,8 @@ DDTeamCollection::DDTeamCollection(DDTeamCollectionInitParams const& params)
44704470
output(params.output), unhealthyServers(0), storageWiggler(makeReference<StorageWiggler>(this)),
44714471
processingWiggle(params.processingWiggle), shardsAffectedByTeamFailure(params.shardsAffectedByTeamFailure),
44724472
initialFailureReactionDelay(
4473-
delayed(params.readyToStart, SERVER_KNOBS->INITIAL_FAILURE_REACTION_DELAY, TaskPriority::DataDistribution)),
4474-
initializationDoneActor(logOnCompletion(params.readyToStart && initialFailureReactionDelay)), recruitingStream(0),
4473+
delayed(params.onHealthy, SERVER_KNOBS->INITIAL_FAILURE_REACTION_DELAY, TaskPriority::DataDistribution)),
4474+
initializationDoneActor(logOnCompletion(params.onHealthy && initialFailureReactionDelay)), recruitingStream(0),
44754475
restartRecruiting(SERVER_KNOBS->DEBOUNCE_RECRUITING_DELAY), healthyTeamCount(0),
44764476
zeroHealthyTeams(params.zeroHealthyTeams), optimalTeamCount(0), zeroOptimalTeams(true), isTssRecruiting(false),
44774477
includedDCs(params.includedDCs), otherTrackedDCs(params.otherTrackedDCs),
@@ -6266,6 +6266,7 @@ class DDTeamCollectionUnitTest {
62666266
{},
62676267
{},
62686268
Future<Void>(Void()),
6269+
Future<Void>(Void()),
62696270
makeReference<AsyncVar<bool>>(true),
62706271
IsPrimary::True,
62716272
makeReference<AsyncVar<bool>>(false),
@@ -6321,6 +6322,7 @@ class DDTeamCollectionUnitTest {
63216322
{},
63226323
{},
63236324
Future<Void>(Void()),
6325+
Future<Void>(Void()),
63246326
makeReference<AsyncVar<bool>>(true),
63256327
IsPrimary::True,
63266328
makeReference<AsyncVar<bool>>(false),

fdbserver/datadistributor/DataDistribution.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2882,6 +2882,7 @@ Future<Void> dataDistribution(Reference<DataDistributor> self,
28822882
self->primaryDcId,
28832883
self->configuration.usableRegions > 1 ? self->remoteDcIds : std::vector<Optional<Key>>(),
28842884
self->initialized.getFuture(),
2885+
self->initialized.getFuture(),
28852886
zeroHealthyTeams[0],
28862887
IsPrimary::True,
28872888
processingUnhealthy,
@@ -2908,10 +2909,10 @@ Future<Void> dataDistribution(Reference<DataDistributor> self,
29082909
self->configuration,
29092910
self->remoteDcIds,
29102911
Optional<std::vector<Optional<Key>>>(),
2911-
// In multi-region configurations DD only needs the cluster to
2912-
// reach ACCEPTING_COMMITS before continuing startup. Waiting for
2913-
// ALL_LOGS_RECRUITED can hang during degraded failover scenarios
2914-
// such as when the primary DC is down.
2912+
// Remote TC must wait for ALL_LOGS_RECRUITED before actually
2913+
// starting (building teams, moving data), but reports Healthy
2914+
// status at ACCEPTING_COMMITS for faster visibility.
2915+
self->initialized.getFuture() && remoteRecovered(self->dbInfo),
29152916
self->initialized.getFuture() && waitForAcceptingCommits(self->dbInfo),
29162917
zeroHealthyTeams[1],
29172918
IsPrimary::False,

fdbserver/datadistributor/include/fdbserver/datadistributor/DDTeamCollection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ struct DDTeamCollectionInitParams {
193193
std::vector<Optional<Key>> includedDCs;
194194
Optional<std::vector<Optional<Key>>> otherTrackedDCs;
195195
Future<Void> readyToStart;
196+
Future<Void> onHealthy;
196197
Reference<AsyncVar<bool>> zeroHealthyTeams;
197198
IsPrimary primary;
198199
Reference<AsyncVar<bool>> processingUnhealthy;

fdbserver/workloads/PerpetualWiggleStatsWorkload.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ struct PerpetualWiggleStatsWorkload : public TestWorkload {
199199
{},
200200
{},
201201
Future<Void>(Void()),
202+
Future<Void>(Void()),
202203
makeReference<AsyncVar<bool>>(true),
203204
IsPrimary::True,
204205
makeReference<AsyncVar<bool>>(false),

0 commit comments

Comments
 (0)