@@ -22,35 +22,51 @@ package matching
22
22
23
23
import (
24
24
"context"
25
+ "fmt"
25
26
26
27
"go.uber.org/yarpc"
27
28
29
+ "github.com/uber/cadence/client/sharddistributor"
30
+ "github.com/uber/cadence/common"
31
+ "github.com/uber/cadence/common/dynamicconfig"
28
32
"github.com/uber/cadence/common/future"
33
+ "github.com/uber/cadence/common/log"
34
+ "github.com/uber/cadence/common/log/tag"
29
35
"github.com/uber/cadence/common/persistence"
30
36
"github.com/uber/cadence/common/types"
37
+ "github.com/uber/cadence/service/sharddistributor/constants"
31
38
)
32
39
33
40
var _ Client = (* clientImpl )(nil )
34
41
35
42
type clientImpl struct {
36
- client Client
37
- peerResolver PeerResolver
38
- loadBalancer LoadBalancer
39
- provider PartitionConfigProvider
43
+ client Client
44
+ peerResolver PeerResolver
45
+ shardDistributorClient sharddistributor.Client
46
+ shardDistributionMode dynamicconfig.StringPropertyFn
47
+ loadBalancer LoadBalancer
48
+ provider PartitionConfigProvider
49
+ logger log.Logger
40
50
}
41
51
42
52
// NewClient creates a new history service TChannel client
43
53
func NewClient (
44
54
client Client ,
45
55
peerResolver PeerResolver ,
56
+ shardDistributorClient sharddistributor.Client ,
57
+ hashDistributionMode dynamicconfig.StringPropertyFn ,
46
58
lb LoadBalancer ,
47
59
provider PartitionConfigProvider ,
60
+ logger log.Logger ,
48
61
) Client {
49
62
return & clientImpl {
50
- client : client ,
51
- peerResolver : peerResolver ,
52
- loadBalancer : lb ,
53
- provider : provider ,
63
+ client : client ,
64
+ peerResolver : peerResolver ,
65
+ shardDistributorClient : shardDistributorClient ,
66
+ shardDistributionMode : hashDistributionMode ,
67
+ loadBalancer : lb ,
68
+ provider : provider ,
69
+ logger : logger ,
54
70
}
55
71
}
56
72
@@ -65,7 +81,7 @@ func (c *clientImpl) AddActivityTask(
65
81
)
66
82
originalTaskListName := request .TaskList .GetName ()
67
83
request .TaskList .Name = partition
68
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
84
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
69
85
if err != nil {
70
86
return nil , err
71
87
}
@@ -94,7 +110,7 @@ func (c *clientImpl) AddDecisionTask(
94
110
)
95
111
originalTaskListName := request .TaskList .GetName ()
96
112
request .TaskList .Name = partition
97
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
113
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
98
114
if err != nil {
99
115
return nil , err
100
116
}
@@ -124,7 +140,7 @@ func (c *clientImpl) PollForActivityTask(
124
140
)
125
141
originalTaskListName := request .PollRequest .GetTaskList ().GetName ()
126
142
request .PollRequest .TaskList .Name = partition
127
- peer , err := c .peerResolver . FromTaskList ( request .PollRequest .TaskList .GetName ())
143
+ peer , err := c .getShardOwner ( ctx , request .PollRequest .TaskList .GetName ())
128
144
if err != nil {
129
145
return nil , err
130
146
}
@@ -162,7 +178,7 @@ func (c *clientImpl) PollForDecisionTask(
162
178
)
163
179
originalTaskListName := request .PollRequest .GetTaskList ().GetName ()
164
180
request .PollRequest .TaskList .Name = partition
165
- peer , err := c .peerResolver . FromTaskList ( request .PollRequest .TaskList .GetName ())
181
+ peer , err := c .getShardOwner ( ctx , request .PollRequest .TaskList .GetName ())
166
182
if err != nil {
167
183
return nil , err
168
184
}
@@ -199,7 +215,7 @@ func (c *clientImpl) QueryWorkflow(
199
215
"" ,
200
216
)
201
217
request .TaskList .Name = partition
202
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
218
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
203
219
if err != nil {
204
220
return nil , err
205
221
}
@@ -211,7 +227,7 @@ func (c *clientImpl) RespondQueryTaskCompleted(
211
227
request * types.MatchingRespondQueryTaskCompletedRequest ,
212
228
opts ... yarpc.CallOption ,
213
229
) error {
214
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
230
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
215
231
if err != nil {
216
232
return err
217
233
}
@@ -223,7 +239,7 @@ func (c *clientImpl) CancelOutstandingPoll(
223
239
request * types.CancelOutstandingPollRequest ,
224
240
opts ... yarpc.CallOption ,
225
241
) error {
226
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
242
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
227
243
if err != nil {
228
244
return err
229
245
}
@@ -235,7 +251,7 @@ func (c *clientImpl) DescribeTaskList(
235
251
request * types.MatchingDescribeTaskListRequest ,
236
252
opts ... yarpc.CallOption ,
237
253
) (* types.DescribeTaskListResponse , error ) {
238
- peer , err := c .peerResolver . FromTaskList ( request .DescRequest .TaskList .GetName ())
254
+ peer , err := c .getShardOwner ( ctx , request .DescRequest .TaskList .GetName ())
239
255
if err != nil {
240
256
return nil , err
241
257
}
@@ -247,7 +263,7 @@ func (c *clientImpl) ListTaskListPartitions(
247
263
request * types.MatchingListTaskListPartitionsRequest ,
248
264
opts ... yarpc.CallOption ,
249
265
) (* types.ListTaskListPartitionsResponse , error ) {
250
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
266
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
251
267
if err != nil {
252
268
return nil , err
253
269
}
@@ -305,7 +321,7 @@ func (c *clientImpl) UpdateTaskListPartitionConfig(
305
321
request * types.MatchingUpdateTaskListPartitionConfigRequest ,
306
322
opts ... yarpc.CallOption ,
307
323
) (* types.MatchingUpdateTaskListPartitionConfigResponse , error ) {
308
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
324
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
309
325
if err != nil {
310
326
return nil , err
311
327
}
@@ -317,9 +333,39 @@ func (c *clientImpl) RefreshTaskListPartitionConfig(
317
333
request * types.MatchingRefreshTaskListPartitionConfigRequest ,
318
334
opts ... yarpc.CallOption ,
319
335
) (* types.MatchingRefreshTaskListPartitionConfigResponse , error ) {
320
- peer , err := c .peerResolver . FromTaskList ( request .TaskList .GetName ())
336
+ peer , err := c .getShardOwner ( ctx , request .TaskList .GetName ())
321
337
if err != nil {
322
338
return nil , err
323
339
}
324
340
return c .client .RefreshTaskListPartitionConfig (ctx , request , append (opts , yarpc .WithShardKey (peer ))... )
325
341
}
342
+
343
+ func (c * clientImpl ) getShardOwner (ctx context.Context , taskListName string ) (string , error ) {
344
+ sharddistributorMode := c .shardDistributionMode ()
345
+ if sharddistributorMode == common .ShardModeShardDistributor && c .shardDistributorClient != nil {
346
+ request := & types.GetShardOwnerRequest {
347
+ ShardKey : taskListName ,
348
+ Namespace : constants .MatchingNamespace ,
349
+ }
350
+
351
+ resp , err := c .shardDistributorClient .GetShardOwner (ctx , request )
352
+ if err != nil {
353
+ return "" , fmt .Errorf ("find shard in shard distributor: %w" , err )
354
+ }
355
+
356
+ return resp .Owner , nil
357
+ }
358
+
359
+ if sharddistributorMode == common .ShardModeShardDistributor && c .shardDistributorClient == nil {
360
+ c .logger .Warn ("ShardDistributor mode enabled, but shard distributor is not available, falling back to hash-ring" )
361
+ } else if c .shardDistributionMode () != common .ShardModeHashRing {
362
+ c .logger .Warn ("Unknown hash distribution mode, falling back to hash-ring" , tag .Mode (c .shardDistributionMode ()))
363
+ }
364
+
365
+ owner , err := c .peerResolver .FromTaskList (taskListName )
366
+ if err != nil {
367
+ return "" , fmt .Errorf ("find shard in hash ring: %w" , err )
368
+ }
369
+
370
+ return owner , nil
371
+ }
0 commit comments