@@ -56,7 +56,7 @@ var _ p.ExecutionStore = (*cassandraPersistence)(nil)
56
56
// Where x is any hexadecimal value, E represents the entity type valid values are:
57
57
// E = {DomainID = 1, WorkflowID = 2, RunID = 3}
58
58
// R represents row type in executions table, valid values are:
59
- // R = {Shard = 1, Execution = 2, Transfer = 3, Timer = 4, Replication = 5}
59
+ // R = {Shard = 1, Execution = 2, Transfer = 3, Timer = 4, Replication = 5, Replication_DLQ = 6, CrossCluster = 7 }
60
60
const (
61
61
// Special Domains related constants
62
62
emptyDomainID = "10000000-0000-f000-f000-000000000000"
@@ -82,7 +82,9 @@ const (
82
82
// Row Constants for Replication Task DLQ Row. Source cluster name will be used as WorkflowID.
83
83
rowTypeDLQDomainID = "10000000-6000-f000-f000-000000000000"
84
84
rowTypeDLQRunID = "30000000-6000-f000-f000-000000000000"
85
- // TODO: add rowType for cross-region tasks
85
+ // Row Constants for Cross Cluster Task Row
86
+ rowTypeCrossClusterDomainID = "10000000-7000-f000-f000-000000000000"
87
+ rowTypeCrossClusterRunID = "30000000-7000-f000-f000-000000000000"
86
88
// Special TaskId constants
87
89
rowTypeExecutionTaskID = int64 (- 10 )
88
90
rowTypeShardTaskID = int64 (- 11 )
@@ -99,7 +101,7 @@ const (
99
101
rowTypeTimerTask
100
102
rowTypeReplicationTask
101
103
rowTypeDLQ
102
- // TODO: add row type
104
+ rowTypeCrossClusterTask
103
105
)
104
106
105
107
const (
@@ -181,6 +183,8 @@ const (
181
183
`version: ?` +
182
184
`}`
183
185
186
+ templateCrossClusterTaskType = templateTransferTaskType
187
+
184
188
templateReplicationTaskType = `{` +
185
189
`domain_id: ?, ` +
186
190
`workflow_id: ?, ` +
@@ -324,6 +328,10 @@ workflow_state = ? ` +
324
328
`shard_id, type, domain_id, workflow_id, run_id, transfer, visibility_ts, task_id) ` +
325
329
`VALUES(?, ?, ?, ?, ?, ` + templateTransferTaskType + `, ?, ?)`
326
330
331
+ templateCreateCrossClusterTaskQuery = `INSERT INTO executions (` +
332
+ `shard_id, type, domain_id, workflow_id, run_id, cross_cluster, visibility_ts, task_id) ` +
333
+ `VALUES(?, ?, ?, ?, ?, ` + templateCrossClusterTaskType + `, ?, ?)`
334
+
327
335
templateCreateReplicationTaskQuery = `INSERT INTO executions (` +
328
336
`shard_id, type, domain_id, workflow_id, run_id, replication, visibility_ts, task_id) ` +
329
337
`VALUES(?, ?, ?, ?, ?, ` + templateReplicationTaskType + `, ?, ?)`
@@ -636,6 +644,17 @@ workflow_state = ? ` +
636
644
`and task_id > ? ` +
637
645
`and task_id <= ?`
638
646
647
+ templateGetCrossClusterTasksQuery = `SELECT cross_cluster ` +
648
+ `FROM executions ` +
649
+ `WHERE shard_id = ? ` +
650
+ `and type = ? ` +
651
+ `and domain_id = ? ` +
652
+ `and workflow_id = ? ` +
653
+ `and run_id = ? ` +
654
+ `and visibility_ts = ? ` +
655
+ `and task_id > ? ` +
656
+ `and task_id <= ?`
657
+
639
658
templateGetReplicationTasksQuery = `SELECT replication ` +
640
659
`FROM executions ` +
641
660
`WHERE shard_id = ? ` +
@@ -674,6 +693,10 @@ workflow_state = ? ` +
674
693
`and task_id > ? ` +
675
694
`and task_id <= ?`
676
695
696
+ templateCompleteCrossClusterTaskQuery = templateCompleteTransferTaskQuery
697
+
698
+ templateRangeCompleteCrossClusterTaskQuery = templateRangeCompleteTransferTaskQuery
699
+
677
700
templateCompleteReplicationTaskBeforeQuery = `DELETE FROM executions ` +
678
701
`WHERE shard_id = ? ` +
679
702
`and type = ? ` +
@@ -1663,8 +1686,44 @@ func (d *cassandraPersistence) GetCrossClusterTasks(
1663
1686
ctx context.Context ,
1664
1687
request * p.GetCrossClusterTasksRequest ,
1665
1688
) (* p.GetCrossClusterTasksResponse , error ) {
1666
- // TODO: Implement GetCrossClusterTasks
1667
- panic ("not implemented" )
1689
+
1690
+ // Reading cross-cluster tasks need to be quorum level consistent, otherwise we could loose task
1691
+ query := d .session .Query (templateGetCrossClusterTasksQuery ,
1692
+ d .shardID ,
1693
+ rowTypeCrossClusterTask ,
1694
+ rowTypeCrossClusterDomainID ,
1695
+ request .TargetCluster , // workflowID field is used to store target cluster
1696
+ rowTypeCrossClusterRunID ,
1697
+ defaultVisibilityTimestamp ,
1698
+ request .ReadLevel ,
1699
+ request .MaxReadLevel ,
1700
+ ).PageSize (request .BatchSize ).PageState (request .NextPageToken ).WithContext (ctx )
1701
+
1702
+ iter := query .Iter ()
1703
+ if iter == nil {
1704
+ return nil , & types.InternalServiceError {
1705
+ Message : "GetCrossClusterTasks operation failed. Not able to create query iterator." ,
1706
+ }
1707
+ }
1708
+
1709
+ response := & p.GetCrossClusterTasksResponse {}
1710
+ task := make (map [string ]interface {})
1711
+ for iter .MapScan (task ) {
1712
+ t := createCrossClusterTaskInfo (task ["cross_cluster" ].(map [string ]interface {}))
1713
+ // Reset task map to get it ready for next scan
1714
+ task = make (map [string ]interface {})
1715
+
1716
+ response .Tasks = append (response .Tasks , t )
1717
+ }
1718
+ nextPageToken := iter .PageState ()
1719
+ response .NextPageToken = make ([]byte , len (nextPageToken ))
1720
+ copy (response .NextPageToken , nextPageToken )
1721
+
1722
+ if err := iter .Close (); err != nil {
1723
+ return nil , convertCommonErrors (d .client , "GetCrossClusterTasks" , err )
1724
+ }
1725
+
1726
+ return response , nil
1668
1727
}
1669
1728
1670
1729
func (d * cassandraPersistence ) GetReplicationTasks (
@@ -1766,16 +1825,45 @@ func (d *cassandraPersistence) CompleteCrossClusterTask(
1766
1825
ctx context.Context ,
1767
1826
request * p.CompleteCrossClusterTaskRequest ,
1768
1827
) error {
1769
- // TODO: Implement CompleteCrossClusterTask
1770
- panic ("not implemented" )
1828
+ query := d .session .Query (templateCompleteCrossClusterTaskQuery ,
1829
+ d .shardID ,
1830
+ rowTypeCrossClusterTask ,
1831
+ rowTypeCrossClusterDomainID ,
1832
+ request .TargetCluster ,
1833
+ rowTypeCrossClusterRunID ,
1834
+ defaultVisibilityTimestamp ,
1835
+ request .TaskID ,
1836
+ ).WithContext (ctx )
1837
+
1838
+ err := query .Exec ()
1839
+ if err != nil {
1840
+ return convertCommonErrors (d .client , "CompleteCrossClusterTask" , err )
1841
+ }
1842
+
1843
+ return nil
1771
1844
}
1772
1845
1773
1846
func (d * cassandraPersistence ) RangeCompleteCrossClusterTask (
1774
1847
ctx context.Context ,
1775
1848
request * p.RangeCompleteCrossClusterTaskRequest ,
1776
1849
) error {
1777
- // TODO: Implement RangeCompleteCrossClusterTask
1778
- panic ("not implemented" )
1850
+ query := d .session .Query (templateRangeCompleteCrossClusterTaskQuery ,
1851
+ d .shardID ,
1852
+ rowTypeCrossClusterTask ,
1853
+ rowTypeCrossClusterDomainID ,
1854
+ request .TargetCluster ,
1855
+ rowTypeCrossClusterRunID ,
1856
+ defaultVisibilityTimestamp ,
1857
+ request .ExclusiveBeginTaskID ,
1858
+ request .InclusiveEndTaskID ,
1859
+ ).WithContext (ctx )
1860
+
1861
+ err := query .Exec ()
1862
+ if err != nil {
1863
+ return convertCommonErrors (d .client , "RangeCompleteCrossClusterTask" , err )
1864
+ }
1865
+
1866
+ return nil
1779
1867
}
1780
1868
1781
1869
func (d * cassandraPersistence ) CompleteReplicationTask (
0 commit comments