@@ -26,6 +26,7 @@ package replication
26
26
27
27
import (
28
28
"context"
29
+ "fmt"
29
30
"sync"
30
31
"sync/atomic"
31
32
"time"
@@ -49,6 +50,10 @@ import (
49
50
wcache "go.temporal.io/server/service/history/workflow/cache"
50
51
)
51
52
53
+ const (
54
+ clusterCallbackKey = "%s-%d" // <cluster name>-<polling shard id>
55
+ )
56
+
52
57
type (
53
58
// taskProcessorManagerImpl is to manage replication task processors
54
59
taskProcessorManagerImpl struct {
62
67
workflowCache wcache.Cache
63
68
resender xdc.NDCHistoryResender
64
69
taskExecutorProvider TaskExecutorProvider
70
+ taskPollerManager pollerManager
65
71
metricsHandler metrics.Handler
66
72
logger log.Logger
67
73
@@ -110,6 +116,7 @@ func NewTaskProcessorManager(
110
116
metricsHandler : shard .GetMetricsHandler (),
111
117
taskProcessors : make (map [string ]TaskProcessor ),
112
118
taskExecutorProvider : taskExecutorProvider ,
119
+ taskPollerManager : newPollerManager (shard .GetShardID (), shard .GetClusterMetadata ()),
113
120
minTxAckedTaskID : persistence .EmptyQueueMessageID ,
114
121
shutdownChan : make (chan struct {}),
115
122
}
@@ -167,36 +174,39 @@ func (r *taskProcessorManagerImpl) handleClusterMetadataUpdate(
167
174
if clusterName == currentClusterName {
168
175
continue
169
176
}
170
- // The metadata triggers a update when the following fields update: 1. Enabled 2. Initial Failover Version 3. Cluster address
171
- // The callback covers three cases:
172
- // Case 1: Remove a cluster Case 2: Add a new cluster Case 3: Refresh cluster metadata.
173
-
174
- if processor , ok := r .taskProcessors [clusterName ]; ok {
175
- // Case 1 and Case 3
176
- processor .Stop ()
177
- delete (r .taskProcessors , clusterName )
178
- }
179
-
180
- if clusterInfo := newClusterMetadata [clusterName ]; clusterInfo != nil && clusterInfo .Enabled {
181
- // Case 2 and Case 3
182
- fetcher := r .replicationTaskFetcherFactory .GetOrCreateFetcher (clusterName )
183
- replicationTaskProcessor := NewTaskProcessor (
184
- r .shard ,
185
- r .engine ,
186
- r .config ,
187
- r .shard .GetMetricsHandler (),
188
- fetcher ,
189
- r .taskExecutorProvider (TaskExecutorParams {
190
- RemoteCluster : clusterName ,
191
- Shard : r .shard ,
192
- HistoryResender : r .resender ,
193
- DeleteManager : r .deleteMgr ,
194
- WorkflowCache : r .workflowCache ,
195
- }),
196
- r .eventSerializer ,
197
- )
198
- replicationTaskProcessor .Start ()
199
- r .taskProcessors [clusterName ] = replicationTaskProcessor
177
+ sourceShardIds := r .taskPollerManager .getSourceClusterShardIDs (clusterName )
178
+ for _ , sourceShardId := range sourceShardIds {
179
+ perShardTaskProcessorKey := fmt .Sprintf (clusterCallbackKey , clusterName , sourceShardId )
180
+ // The metadata triggers an update when the following fields update: 1. Enabled 2. Initial Failover Version 3. Cluster address
181
+ // The callback covers three cases:
182
+ // Case 1: Remove a cluster Case 2: Add a new cluster Case 3: Refresh cluster metadata.
183
+ if processor , ok := r .taskProcessors [perShardTaskProcessorKey ]; ok {
184
+ // Case 1 and Case 3
185
+ processor .Stop ()
186
+ delete (r .taskProcessors , perShardTaskProcessorKey )
187
+ }
188
+ if clusterInfo := newClusterMetadata [clusterName ]; clusterInfo != nil && clusterInfo .Enabled {
189
+ // Case 2 and Case 3
190
+ fetcher := r .replicationTaskFetcherFactory .GetOrCreateFetcher (clusterName )
191
+ replicationTaskProcessor := NewTaskProcessor (
192
+ sourceShardId ,
193
+ r .shard ,
194
+ r .engine ,
195
+ r .config ,
196
+ r .shard .GetMetricsHandler (),
197
+ fetcher ,
198
+ r .taskExecutorProvider (TaskExecutorParams {
199
+ RemoteCluster : clusterName ,
200
+ Shard : r .shard ,
201
+ HistoryResender : r .resender ,
202
+ DeleteManager : r .deleteMgr ,
203
+ WorkflowCache : r .workflowCache ,
204
+ }),
205
+ r .eventSerializer ,
206
+ )
207
+ replicationTaskProcessor .Start ()
208
+ r .taskProcessors [perShardTaskProcessorKey ] = replicationTaskProcessor
209
+ }
200
210
}
201
211
}
202
212
}
0 commit comments