Skip to content

Commit bebe6c3

Browse files
authored
Bypass failover drills for active-active domains (#7191)
1 parent c553681 commit bebe6c3

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed

service/worker/failovermanager/workflow.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,14 @@ func shouldFailover(domain *types.DescribeDomainResponse, sourceCluster string)
381381
if !domain.GetIsGlobalDomain() {
382382
return false
383383
}
384+
385+
// TODO(active-active): Remove this check once failover drills are supported for
386+
// active-active workflows
387+
if domain.ReplicationConfiguration.ActiveClusters != nil &&
388+
len(domain.ReplicationConfiguration.ActiveClusters.ActiveClustersByRegion) > 0 {
389+
return false
390+
}
391+
384392
currentActiveCluster := domain.ReplicationConfiguration.GetActiveClusterName()
385393
isDomainTarget := currentActiveCluster == sourceCluster
386394
return isDomainTarget && isDomainFailoverManagedByCadence(domain)

service/worker/failovermanager/workflow_test.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,48 @@ func (s *failoverWorkflowTestSuite) TestShouldFailover() {
320320
sourceCluster: "c2",
321321
expected: true,
322322
},
323+
{
324+
domain: &types.DescribeDomainResponse{
325+
IsGlobalDomain: true,
326+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
327+
ActiveClusterName: "c2",
328+
Clusters: clusters,
329+
ActiveClusters: &types.ActiveClusters{
330+
ActiveClustersByRegion: map[string]types.ActiveClusterInfo{
331+
"c1": {
332+
ActiveClusterName: "c1",
333+
},
334+
},
335+
},
336+
},
337+
DomainInfo: &types.DomainInfo{
338+
Data: map[string]string{
339+
constants.DomainDataKeyForManagedFailover: "true",
340+
},
341+
},
342+
},
343+
sourceCluster: "c2",
344+
expected: false,
345+
},
346+
{
347+
domain: &types.DescribeDomainResponse{
348+
IsGlobalDomain: true,
349+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
350+
ActiveClusterName: "c2",
351+
Clusters: clusters,
352+
ActiveClusters: &types.ActiveClusters{
353+
ActiveClustersByRegion: map[string]types.ActiveClusterInfo{},
354+
},
355+
},
356+
DomainInfo: &types.DomainInfo{
357+
Data: map[string]string{
358+
constants.DomainDataKeyForManagedFailover: "true",
359+
},
360+
},
361+
},
362+
sourceCluster: "c2",
363+
expected: true,
364+
},
323365
}
324366
for _, t := range tests {
325367
s.Equal(t.expected, shouldFailover(t.domain, t.sourceCluster))
@@ -410,6 +452,122 @@ func (s *failoverWorkflowTestSuite) TestGetDomainsActivity_WithTargetDomains() {
410452
s.Equal([]string{"d1"}, result) // d3 filtered out because not managed
411453
}
412454

455+
func (s *failoverWorkflowTestSuite) TestGetDomainsActivity_FiltersActiveActiveDomains() {
456+
env, mockResource := s.prepareTestActivityEnv()
457+
458+
domains := &types.ListDomainsResponse{
459+
Domains: []*types.DescribeDomainResponse{
460+
{
461+
DomainInfo: &types.DomainInfo{
462+
Name: "regular-domain",
463+
Data: map[string]string{constants.DomainDataKeyForManagedFailover: "true"},
464+
},
465+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
466+
ActiveClusterName: "c1",
467+
Clusters: clusters,
468+
},
469+
IsGlobalDomain: true,
470+
},
471+
{
472+
DomainInfo: &types.DomainInfo{
473+
Name: "active-active-domain",
474+
Data: map[string]string{constants.DomainDataKeyForManagedFailover: "true"},
475+
},
476+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
477+
ActiveClusterName: "c1",
478+
Clusters: clusters,
479+
ActiveClusters: &types.ActiveClusters{
480+
ActiveClustersByRegion: map[string]types.ActiveClusterInfo{
481+
"region1": {
482+
ActiveClusterName: "c1",
483+
},
484+
},
485+
},
486+
},
487+
IsGlobalDomain: true,
488+
},
489+
{
490+
DomainInfo: &types.DomainInfo{
491+
Name: "empty-active-clusters-domain",
492+
Data: map[string]string{constants.DomainDataKeyForManagedFailover: "true"},
493+
},
494+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
495+
ActiveClusterName: "c1",
496+
Clusters: clusters,
497+
ActiveClusters: &types.ActiveClusters{
498+
ActiveClustersByRegion: map[string]types.ActiveClusterInfo{},
499+
},
500+
},
501+
IsGlobalDomain: true,
502+
},
503+
},
504+
}
505+
mockResource.FrontendClient.EXPECT().ListDomains(gomock.Any(), gomock.Any()).Return(domains, nil)
506+
507+
params := &GetDomainsActivityParams{
508+
TargetCluster: "c2",
509+
SourceCluster: "c1",
510+
}
511+
actResult, err := env.ExecuteActivity(getDomainsActivityName, params)
512+
s.NoError(err)
513+
var result []string
514+
s.NoError(actResult.Get(&result))
515+
s.Equal([]string{"regular-domain", "empty-active-clusters-domain"}, result)
516+
}
517+
518+
func (s *failoverWorkflowTestSuite) TestGetDomainsActivity_WithActiveActiveTargetDomains() {
519+
env, mockResource := s.prepareTestActivityEnv()
520+
521+
domains := &types.ListDomainsResponse{
522+
Domains: []*types.DescribeDomainResponse{
523+
{
524+
DomainInfo: &types.DomainInfo{
525+
Name: "regular-domain",
526+
Data: map[string]string{constants.DomainDataKeyForManagedFailover: "true"},
527+
},
528+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
529+
ActiveClusterName: "c1",
530+
Clusters: clusters,
531+
},
532+
IsGlobalDomain: true,
533+
},
534+
{
535+
DomainInfo: &types.DomainInfo{
536+
Name: "active-active-domain",
537+
Data: map[string]string{constants.DomainDataKeyForManagedFailover: "true"},
538+
},
539+
ReplicationConfiguration: &types.DomainReplicationConfiguration{
540+
ActiveClusterName: "c1",
541+
Clusters: clusters,
542+
ActiveClusters: &types.ActiveClusters{
543+
ActiveClustersByRegion: map[string]types.ActiveClusterInfo{
544+
"region1": {
545+
ActiveClusterName: "c1",
546+
},
547+
"region2": {
548+
ActiveClusterName: "c2",
549+
},
550+
},
551+
},
552+
},
553+
IsGlobalDomain: true,
554+
},
555+
},
556+
}
557+
mockResource.FrontendClient.EXPECT().ListDomains(gomock.Any(), gomock.Any()).Return(domains, nil)
558+
559+
params := &GetDomainsActivityParams{
560+
TargetCluster: "c2",
561+
SourceCluster: "c1",
562+
Domains: []string{"regular-domain", "active-active-domain"},
563+
}
564+
actResult, err := env.ExecuteActivity(getDomainsActivityName, params)
565+
s.NoError(err)
566+
var result []string
567+
s.NoError(actResult.Get(&result))
568+
s.Equal([]string{"regular-domain"}, result)
569+
}
570+
413571
func (s *failoverWorkflowTestSuite) TestFailoverActivity_ForceFailover_Success() {
414572
env, mockResource := s.prepareTestActivityEnv()
415573

0 commit comments

Comments
 (0)