@@ -29,6 +29,9 @@ import (
29
29
log "github.com/sirupsen/logrus"
30
30
"github.com/stretchr/testify/require"
31
31
32
+ "github.com/uber/cadence/common"
33
+ "github.com/uber/cadence/common/cluster"
34
+ "github.com/uber/cadence/common/config"
32
35
p "github.com/uber/cadence/common/persistence"
33
36
"github.com/uber/cadence/common/types"
34
37
)
@@ -102,6 +105,9 @@ func (s *ShardPersistenceSuite) TestGetShard() {
102
105
103
106
// TestUpdateShard test
104
107
func (s * ShardPersistenceSuite ) TestUpdateShard () {
108
+ // TODO: remove after cross-cluster queue states is persisted in SQL
109
+ skipCrossClusterQueueCheck := s .TestBase .Config ().DefaultStore != config .StoreTypeCassandra
110
+
105
111
ctx , cancel := context .WithTimeout (context .Background (), testContextTimeout )
106
112
defer cancel ()
107
113
@@ -121,17 +127,45 @@ func (s *ShardPersistenceSuite) TestUpdateShard() {
121
127
122
128
updatedOwner := "updatedOwner"
123
129
updatedRangeID := int64 (142 )
124
- updatedTransferAckLevel := int64 (1000 )
130
+ updatedCurrentClusterTransferAckLevel := int64 (1000 )
131
+ updatedAlternativeClusterTransferAckLevel := int64 (2000 )
132
+ updatedCurrentClusterTimerAckLevel := time .Now ()
133
+ updatedAlternativeClusterTimerAckLevel := updatedCurrentClusterTimerAckLevel .Add (time .Minute )
134
+ updatedAlternativeClusterCrossClusterAckLevel := int64 (1000 )
125
135
updatedReplicationAckLevel := int64 (2000 )
136
+ updatedAlternativeClusterDLQAckLevel := int64 (100 )
126
137
updatedStolenSinceRenew := 10
127
- updatedInfo := copyShardInfo (shardInfo )
138
+
139
+ updatedInfo := shardInfo .Copy ()
128
140
updatedInfo .Owner = updatedOwner
129
141
updatedInfo .RangeID = updatedRangeID
130
- updatedInfo .TransferAckLevel = updatedTransferAckLevel
142
+ updatedInfo .TransferAckLevel = updatedCurrentClusterTransferAckLevel
143
+ updatedInfo .ClusterTransferAckLevel = map [string ]int64 {
144
+ cluster .TestCurrentClusterName : updatedCurrentClusterTransferAckLevel ,
145
+ cluster .TestAlternativeClusterName : updatedAlternativeClusterTransferAckLevel ,
146
+ }
147
+ updatedInfo .TransferProcessingQueueStates = createProcessingQueueStates (
148
+ cluster .TestCurrentClusterName , 0 , updatedCurrentClusterTransferAckLevel ,
149
+ cluster .TestAlternativeClusterName , 1 , updatedAlternativeClusterTransferAckLevel ,
150
+ )
151
+ updatedInfo .TimerAckLevel = updatedCurrentClusterTimerAckLevel
152
+ updatedInfo .ClusterTimerAckLevel = map [string ]time.Time {
153
+ cluster .TestCurrentClusterName : updatedCurrentClusterTimerAckLevel ,
154
+ cluster .TestAlternativeClusterName : updatedAlternativeClusterTimerAckLevel ,
155
+ }
156
+ updatedInfo .TimerProcessingQueueStates = createProcessingQueueStates (
157
+ cluster .TestCurrentClusterName , 0 , updatedCurrentClusterTimerAckLevel .UnixNano (),
158
+ cluster .TestAlternativeClusterName , 1 , updatedAlternativeClusterTimerAckLevel .UnixNano (),
159
+ )
160
+ updatedInfo .CrossClusterProcessQueueStates = createProcessingQueueStates (
161
+ cluster .TestAlternativeClusterName , 1 , updatedAlternativeClusterCrossClusterAckLevel , "" , 0 , 0 ,
162
+ )
163
+ updatedInfo .ReplicationDLQAckLevel = map [string ]int64 {
164
+ cluster .TestAlternativeClusterName : updatedAlternativeClusterDLQAckLevel ,
165
+ }
131
166
updatedInfo .ReplicationAckLevel = updatedReplicationAckLevel
132
167
updatedInfo .StolenSinceRenew = updatedStolenSinceRenew
133
- updatedTimerAckLevel := time .Now ()
134
- updatedInfo .TimerAckLevel = updatedTimerAckLevel
168
+
135
169
err2 := s .UpdateShard (ctx , updatedInfo , shardInfo .RangeID )
136
170
s .Nil (err2 )
137
171
@@ -140,12 +174,21 @@ func (s *ShardPersistenceSuite) TestUpdateShard() {
140
174
s .NotNil (info1 )
141
175
s .Equal (updatedOwner , info1 .Owner )
142
176
s .Equal (updatedRangeID , info1 .RangeID )
143
- s .Equal (updatedTransferAckLevel , info1 .TransferAckLevel )
177
+ s .Equal (updatedCurrentClusterTransferAckLevel , info1 .TransferAckLevel )
178
+ s .Equal (updatedInfo .ClusterTransferAckLevel , info1 .ClusterTransferAckLevel )
179
+ s .Equal (updatedInfo .TransferProcessingQueueStates , info1 .TransferProcessingQueueStates )
180
+ s .EqualTimes (updatedCurrentClusterTimerAckLevel , info1 .TimerAckLevel )
181
+ s .EqualTimes (updatedCurrentClusterTimerAckLevel , info1 .ClusterTimerAckLevel [cluster .TestCurrentClusterName ])
182
+ s .EqualTimes (updatedAlternativeClusterTimerAckLevel , info1 .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ])
183
+ s .Equal (updatedInfo .TimerProcessingQueueStates , info1 .TimerProcessingQueueStates )
184
+ if ! skipCrossClusterQueueCheck {
185
+ s .Equal (updatedInfo .CrossClusterProcessQueueStates , info1 .CrossClusterProcessQueueStates )
186
+ }
144
187
s .Equal (updatedReplicationAckLevel , info1 .ReplicationAckLevel )
188
+ s .Equal (updatedInfo .ReplicationDLQAckLevel , info1 .ReplicationDLQAckLevel )
145
189
s .Equal (updatedStolenSinceRenew , info1 .StolenSinceRenew )
146
- s .EqualTimes (updatedTimerAckLevel , info1 .TimerAckLevel )
147
190
148
- failedUpdateInfo := copyShardInfo ( shardInfo )
191
+ failedUpdateInfo := shardInfo . Copy ( )
149
192
failedUpdateInfo .Owner = "failed_owner"
150
193
failedUpdateInfo .TransferAckLevel = int64 (4000 )
151
194
failedUpdateInfo .ReplicationAckLevel = int64 (5000 )
@@ -159,20 +202,236 @@ func (s *ShardPersistenceSuite) TestUpdateShard() {
159
202
s .NotNil (info2 )
160
203
s .Equal (updatedOwner , info2 .Owner )
161
204
s .Equal (updatedRangeID , info2 .RangeID )
162
- s .Equal (updatedTransferAckLevel , info2 .TransferAckLevel )
205
+ s .Equal (updatedCurrentClusterTransferAckLevel , info2 .TransferAckLevel )
206
+ s .Equal (updatedInfo .ClusterTransferAckLevel , info2 .ClusterTransferAckLevel )
207
+ s .Equal (updatedInfo .TransferProcessingQueueStates , info2 .TransferProcessingQueueStates )
208
+ s .EqualTimes (updatedCurrentClusterTimerAckLevel , info2 .TimerAckLevel )
209
+ s .EqualTimes (updatedCurrentClusterTimerAckLevel , info2 .ClusterTimerAckLevel [cluster .TestCurrentClusterName ])
210
+ s .EqualTimes (updatedAlternativeClusterTimerAckLevel , info2 .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ])
211
+ s .Equal (updatedInfo .TimerProcessingQueueStates , info2 .TimerProcessingQueueStates )
212
+ if ! skipCrossClusterQueueCheck {
213
+ s .Equal (updatedInfo .CrossClusterProcessQueueStates , info2 .CrossClusterProcessQueueStates )
214
+ }
163
215
s .Equal (updatedReplicationAckLevel , info2 .ReplicationAckLevel )
216
+ s .Equal (updatedInfo .ReplicationDLQAckLevel , info2 .ReplicationDLQAckLevel )
164
217
s .Equal (updatedStolenSinceRenew , info2 .StolenSinceRenew )
165
- s .EqualTimes (updatedTimerAckLevel , info1 .TimerAckLevel )
166
218
}
167
219
168
- func copyShardInfo (sourceInfo * p.ShardInfo ) * p.ShardInfo {
169
- return & p.ShardInfo {
170
- ShardID : sourceInfo .ShardID ,
171
- Owner : sourceInfo .Owner ,
172
- RangeID : sourceInfo .RangeID ,
173
- TransferAckLevel : sourceInfo .TransferAckLevel ,
174
- ReplicationAckLevel : sourceInfo .ReplicationAckLevel ,
175
- StolenSinceRenew : sourceInfo .StolenSinceRenew ,
176
- TimerAckLevel : sourceInfo .TimerAckLevel ,
220
+ func (s * ShardPersistenceSuite ) TestCreateGetShardBackfill () {
221
+ ctx , cancel := context .WithTimeout (context .Background (), testContextTimeout )
222
+ defer cancel ()
223
+
224
+ shardID := 4
225
+ rangeID := int64 (59 )
226
+
227
+ // test create && get
228
+ currentReplicationAck := int64 (27 )
229
+ currentClusterTransferAck := int64 (21 )
230
+ currentClusterTimerAck := timestampConvertor (time .Now ().Add (- 10 * time .Second ))
231
+ shardInfo := & p.ShardInfo {
232
+ ShardID : shardID ,
233
+ Owner : "some random owner" ,
234
+ RangeID : rangeID ,
235
+ StolenSinceRenew : 12 ,
236
+ UpdatedAt : timestampConvertor (time .Now ()),
237
+ ReplicationAckLevel : currentReplicationAck ,
238
+ TransferAckLevel : currentClusterTransferAck ,
239
+ TimerAckLevel : currentClusterTimerAck ,
240
+ ClusterReplicationLevel : map [string ]int64 {},
241
+ ReplicationDLQAckLevel : map [string ]int64 {},
242
+ }
243
+ createRequest := & p.CreateShardRequest {
244
+ ShardInfo : shardInfo ,
245
+ }
246
+
247
+ s .Nil (s .ShardMgr .CreateShard (ctx , createRequest ))
248
+
249
+ // ClusterTransfer/TimerAckLevel will be backfilled if not exists when getting shard
250
+ currentClusterName := s .ClusterMetadata .GetCurrentClusterName ()
251
+ shardInfo .ClusterTransferAckLevel = map [string ]int64 {
252
+ currentClusterName : currentClusterTransferAck ,
177
253
}
254
+ shardInfo .ClusterTimerAckLevel = map [string ]time.Time {
255
+ currentClusterName : currentClusterTimerAck ,
256
+ }
257
+ resp , err := s .GetShard (ctx , shardID )
258
+ s .NoError (err )
259
+ s .EqualTimes (shardInfo .UpdatedAt , resp .UpdatedAt )
260
+ s .EqualTimes (shardInfo .TimerAckLevel , resp .TimerAckLevel )
261
+ s .EqualTimes (shardInfo .ClusterTimerAckLevel [currentClusterName ], resp .ClusterTimerAckLevel [currentClusterName ])
262
+
263
+ resp .TimerAckLevel = shardInfo .TimerAckLevel
264
+ resp .UpdatedAt = shardInfo .UpdatedAt
265
+ resp .ClusterTimerAckLevel = shardInfo .ClusterTimerAckLevel
266
+ s .Equal (shardInfo , resp )
267
+ }
268
+
269
+ func (s * ShardPersistenceSuite ) TestCreateGetUpdateGetShard () {
270
+ // TODO: remove after cross-cluster queue states is persisted in SQL
271
+ skipCrossClusterQueueCheck := s .TestBase .Config ().DefaultStore != config .StoreTypeCassandra
272
+
273
+ ctx , cancel := context .WithTimeout (context .Background (), testContextTimeout )
274
+ defer cancel ()
275
+
276
+ shardID := 8
277
+ rangeID := int64 (59 )
278
+
279
+ // test create && get
280
+ currentReplicationAck := int64 (27 )
281
+ currentClusterTransferAck := int64 (21 )
282
+ alternativeClusterTransferAck := int64 (32 )
283
+ alternativeClusterCrossClusterAck := int64 (45 )
284
+ currentClusterTimerAck := timestampConvertor (time .Now ().Add (- 10 * time .Second ))
285
+ alternativeClusterTimerAck := timestampConvertor (time .Now ().Add (- 20 * time .Second ))
286
+ domainNotificationVersion := int64 (8192 )
287
+ transferPQS := createProcessingQueueStates (
288
+ cluster .TestCurrentClusterName , 0 , currentClusterTransferAck ,
289
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterTransferAck ,
290
+ )
291
+ crossClusterPQS := createProcessingQueueStates (
292
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterCrossClusterAck , "" , 0 , 0 ,
293
+ )
294
+ timerPQS := createProcessingQueueStates (
295
+ cluster .TestCurrentClusterName , 0 , currentClusterTimerAck .UnixNano (),
296
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterTimerAck .UnixNano (),
297
+ )
298
+ shardInfo := & p.ShardInfo {
299
+ ShardID : shardID ,
300
+ Owner : "some random owner" ,
301
+ RangeID : rangeID ,
302
+ StolenSinceRenew : 12 ,
303
+ UpdatedAt : timestampConvertor (time .Now ()),
304
+ ReplicationAckLevel : currentReplicationAck ,
305
+ TransferAckLevel : currentClusterTransferAck ,
306
+ TimerAckLevel : currentClusterTimerAck ,
307
+ ClusterTransferAckLevel : map [string ]int64 {
308
+ cluster .TestCurrentClusterName : currentClusterTransferAck ,
309
+ cluster .TestAlternativeClusterName : alternativeClusterTransferAck ,
310
+ },
311
+ ClusterTimerAckLevel : map [string ]time.Time {
312
+ cluster .TestCurrentClusterName : currentClusterTimerAck ,
313
+ cluster .TestAlternativeClusterName : alternativeClusterTimerAck ,
314
+ },
315
+ TransferProcessingQueueStates : transferPQS ,
316
+ CrossClusterProcessQueueStates : crossClusterPQS ,
317
+ TimerProcessingQueueStates : timerPQS ,
318
+ DomainNotificationVersion : domainNotificationVersion ,
319
+ ClusterReplicationLevel : map [string ]int64 {},
320
+ ReplicationDLQAckLevel : map [string ]int64 {},
321
+ }
322
+ createRequest := & p.CreateShardRequest {
323
+ ShardInfo : shardInfo ,
324
+ }
325
+ s .Nil (s .ShardMgr .CreateShard (ctx , createRequest ))
326
+ resp , err := s .GetShard (ctx , shardID )
327
+ s .NoError (err )
328
+ s .EqualTimes (shardInfo .UpdatedAt , resp .UpdatedAt )
329
+ s .EqualTimes (shardInfo .TimerAckLevel , resp .TimerAckLevel )
330
+ s .EqualTimes (shardInfo .ClusterTimerAckLevel [cluster .TestCurrentClusterName ], resp .ClusterTimerAckLevel [cluster .TestCurrentClusterName ])
331
+ s .EqualTimes (shardInfo .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ], resp .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ])
332
+
333
+ if skipCrossClusterQueueCheck {
334
+ resp .CrossClusterProcessQueueStates = shardInfo .CrossClusterProcessQueueStates
335
+ }
336
+ resp .TimerAckLevel = shardInfo .TimerAckLevel
337
+ resp .UpdatedAt = shardInfo .UpdatedAt
338
+ resp .ClusterTimerAckLevel = shardInfo .ClusterTimerAckLevel
339
+ s .Equal (shardInfo , resp )
340
+
341
+ // test update && get
342
+ currentReplicationAck = int64 (270 )
343
+ currentClusterTransferAck = int64 (210 )
344
+ alternativeClusterTransferAck = int64 (320 )
345
+ alternativeClusterCrossClusterAck = int64 (450 )
346
+ currentClusterTimerAck = timestampConvertor (time .Now ().Add (- 100 * time .Second ))
347
+ alternativeClusterTimerAck = timestampConvertor (time .Now ().Add (- 200 * time .Second ))
348
+ domainNotificationVersion = int64 (16384 )
349
+ transferPQS = createProcessingQueueStates (
350
+ cluster .TestCurrentClusterName , 0 , currentClusterTransferAck ,
351
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterTransferAck ,
352
+ )
353
+ crossClusterPQS = createProcessingQueueStates (
354
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterCrossClusterAck , "" , 0 , 0 ,
355
+ )
356
+ timerPQS = createProcessingQueueStates (
357
+ cluster .TestCurrentClusterName , 0 , currentClusterTimerAck .UnixNano (),
358
+ cluster .TestAlternativeClusterName , 1 , alternativeClusterTimerAck .UnixNano (),
359
+ )
360
+ shardInfo = & p.ShardInfo {
361
+ ShardID : shardID ,
362
+ Owner : "some random owner" ,
363
+ RangeID : int64 (28 ),
364
+ StolenSinceRenew : 4 ,
365
+ UpdatedAt : timestampConvertor (time .Now ()),
366
+ ReplicationAckLevel : currentReplicationAck ,
367
+ TransferAckLevel : currentClusterTransferAck ,
368
+ TimerAckLevel : currentClusterTimerAck ,
369
+ ClusterTransferAckLevel : map [string ]int64 {
370
+ cluster .TestCurrentClusterName : currentClusterTransferAck ,
371
+ cluster .TestAlternativeClusterName : alternativeClusterTransferAck ,
372
+ },
373
+ ClusterTimerAckLevel : map [string ]time.Time {
374
+ cluster .TestCurrentClusterName : currentClusterTimerAck ,
375
+ cluster .TestAlternativeClusterName : alternativeClusterTimerAck ,
376
+ },
377
+ TransferProcessingQueueStates : transferPQS ,
378
+ CrossClusterProcessQueueStates : crossClusterPQS ,
379
+ TimerProcessingQueueStates : timerPQS ,
380
+ DomainNotificationVersion : domainNotificationVersion ,
381
+ ClusterReplicationLevel : map [string ]int64 {cluster .TestAlternativeClusterName : 12345 },
382
+ ReplicationDLQAckLevel : map [string ]int64 {},
383
+ }
384
+ updateRequest := & p.UpdateShardRequest {
385
+ ShardInfo : shardInfo ,
386
+ PreviousRangeID : rangeID ,
387
+ }
388
+ s .Nil (s .ShardMgr .UpdateShard (ctx , updateRequest ))
389
+
390
+ resp , err = s .GetShard (ctx , shardID )
391
+ s .NoError (err )
392
+ s .EqualTimes (shardInfo .UpdatedAt , resp .UpdatedAt )
393
+ s .EqualTimes (shardInfo .TimerAckLevel , resp .TimerAckLevel )
394
+ s .EqualTimes (shardInfo .ClusterTimerAckLevel [cluster .TestCurrentClusterName ], resp .ClusterTimerAckLevel [cluster .TestCurrentClusterName ])
395
+ s .EqualTimes (shardInfo .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ], resp .ClusterTimerAckLevel [cluster .TestAlternativeClusterName ])
396
+
397
+ if skipCrossClusterQueueCheck {
398
+ resp .CrossClusterProcessQueueStates = shardInfo .CrossClusterProcessQueueStates
399
+ }
400
+ resp .UpdatedAt = shardInfo .UpdatedAt
401
+ resp .TimerAckLevel = shardInfo .TimerAckLevel
402
+ resp .ClusterTimerAckLevel = shardInfo .ClusterTimerAckLevel
403
+ s .Equal (shardInfo , resp )
404
+ }
405
+
406
+ func createProcessingQueueStates (
407
+ cluster1 string , level1 int32 , ackLevel1 int64 ,
408
+ cluster2 string , level2 int32 , ackLevel2 int64 ,
409
+ ) * types.ProcessingQueueStates {
410
+ domainFilter := & types.DomainFilter {
411
+ DomainIDs : nil ,
412
+ ReverseMatch : true ,
413
+ }
414
+ processingQueueStateMap := map [string ][]* types.ProcessingQueueState {}
415
+ if len (cluster1 ) != 0 {
416
+ processingQueueStateMap [cluster1 ] = []* types.ProcessingQueueState {
417
+ {
418
+ Level : common .Int32Ptr (level1 ),
419
+ AckLevel : common .Int64Ptr (ackLevel1 ),
420
+ MaxLevel : common .Int64Ptr (ackLevel1 ),
421
+ DomainFilter : domainFilter ,
422
+ },
423
+ }
424
+ }
425
+ if len (cluster2 ) != 0 {
426
+ processingQueueStateMap [cluster2 ] = []* types.ProcessingQueueState {
427
+ {
428
+ Level : common .Int32Ptr (level2 ),
429
+ AckLevel : common .Int64Ptr (ackLevel2 ),
430
+ MaxLevel : common .Int64Ptr (ackLevel2 ),
431
+ DomainFilter : domainFilter ,
432
+ },
433
+ }
434
+ }
435
+
436
+ return & types.ProcessingQueueStates {StatesByCluster : processingQueueStateMap }
178
437
}
0 commit comments