Files
tasks/service/history/api/replication/generate_task.go
zigeHandGitHub a91f02ea6a Add target cluster to replication tasks (#7692)
## What changed?
<!-- Describe what has changed in this PR -->
Add a targetCluster field to the replication task and propagate it from
the failover workflow all the way to the task generation logic. Include
this parameter in the SyncWorkflowStateTask. Finally, update the stream
sender to check this parameter and only send the task if target ==
targetCluster; otherwise, skip transmission.

## Why?
<!-- Tell your future self why have you made these changes -->

## How did you test it?
<!-- How have you verified this change? Tested locally? Added a unit
test? Checked in staging env? -->

## Potential risks
<!-- Assuming the worst case, what can be broken when deploying this
change to production? -->

## Documentation
<!-- Have you made sure this change doesn't falsify anything currently
stated in `docs/`? If significant
new behavior is added, have you described that in `docs/`? -->

## Is hotfix candidate?
<!-- Is this PR a hotfix candidate or does it require a notification to
be sent to the broader community? (Yes/No) -->
2025-05-12 13:04:28 -07:00

68 lines
1.9 KiB
Go

package replication
import (
"context"
"go.temporal.io/server/api/historyservice/v1"
"go.temporal.io/server/common/definition"
"go.temporal.io/server/common/locks"
"go.temporal.io/server/common/namespace"
"go.temporal.io/server/common/persistence"
"go.temporal.io/server/service/history/api"
historyi "go.temporal.io/server/service/history/interfaces"
"go.temporal.io/server/service/history/tasks"
)
func GenerateTask(
ctx context.Context,
request *historyservice.GenerateLastHistoryReplicationTasksRequest,
shard historyi.ShardContext,
workflowConsistencyChecker api.WorkflowConsistencyChecker,
) (_ *historyservice.GenerateLastHistoryReplicationTasksResponse, retError error) {
namespaceEntry, err := api.GetNamespace(shard, namespace.ID(request.GetNamespaceId()))
if err != nil {
return nil, err
}
namespaceID := namespaceEntry.ID()
workflowLease, err := workflowConsistencyChecker.GetWorkflowLease(
ctx,
nil,
definition.NewWorkflowKey(
namespaceID.String(),
request.Execution.WorkflowId,
request.Execution.RunId,
),
locks.PriorityHigh,
)
if err != nil {
return nil, err
}
defer func() { workflowLease.GetReleaseFn()(retError) }()
mutableState := workflowLease.GetMutableState()
replicationTasks, stateTransitionCount, err := mutableState.GenerateMigrationTasks(request.GetTargetClusters())
if err != nil {
return nil, err
}
err = shard.AddTasks(ctx, &persistence.AddHistoryTasksRequest{
ShardID: shard.GetShardID(),
// RangeID is set by shard
NamespaceID: string(namespaceID),
WorkflowID: request.Execution.WorkflowId,
Tasks: map[tasks.Category][]tasks.Task{
tasks.CategoryReplication: replicationTasks,
},
})
if err != nil {
return nil, err
}
historyLength := max(mutableState.GetNextEventID()-1, 0)
return &historyservice.GenerateLastHistoryReplicationTasksResponse{
StateTransitionCount: stateTransitionCount,
HistoryLength: historyLength,
}, nil
}