@@ -199,6 +199,16 @@ func TestMoveTablesComplete(t *testing.T) {
199199 defer cancel ()
200200
201201 workflowName := "wf1"
202+ stopReverseStreamQueries := []* queryResult {
203+ {
204+ query : "update _vt.vreplication set state='Stopped', message='stopped for complete' where id=1" ,
205+ result : & querypb.QueryResult {},
206+ },
207+ {
208+ query : "update _vt.vreplication set state='Stopped', message='stopped for complete' where id=2" ,
209+ result : & querypb.QueryResult {},
210+ },
211+ }
202212 table1Name := "t1"
203213 table2Name := "t1_2"
204214 table3Name := "t1_3"
@@ -259,25 +269,25 @@ func TestMoveTablesComplete(t *testing.T) {
259269 TargetKeyspace : targetKeyspaceName ,
260270 Workflow : workflowName ,
261271 },
262- expectedSourceQueries : [] * queryResult {
263- {
272+ expectedSourceQueries : append ( slices . Clone ( stopReverseStreamQueries ),
273+ & queryResult {
264274 query : fmt .Sprintf ("drop table `vt_%s`.`%s`" , sourceKeyspaceName , table1Name ),
265275 result : & querypb.QueryResult {},
266276 },
267- {
277+ & queryResult {
268278 query : fmt .Sprintf ("drop table `vt_%s`.`%s`" , sourceKeyspaceName , table2Name ),
269279 result : & querypb.QueryResult {},
270280 },
271- {
281+ & queryResult {
272282 query : fmt .Sprintf ("drop table `vt_%s`.`%s`" , sourceKeyspaceName , table3Name ),
273283 result : & querypb.QueryResult {},
274284 },
275- {
285+ & queryResult {
276286 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
277287 sourceKeyspaceName , ReverseWorkflowName (workflowName )),
278288 result : & querypb.QueryResult {},
279289 },
280- } ,
290+ ) ,
281291 expectedTargetQueries : []* queryResult {
282292 {
283293 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
@@ -306,13 +316,13 @@ func TestMoveTablesComplete(t *testing.T) {
306316 KeepRoutingRules : true ,
307317 KeepData : new (true ),
308318 },
309- expectedSourceQueries : [] * queryResult {
310- {
319+ expectedSourceQueries : append ( slices . Clone ( stopReverseStreamQueries ),
320+ & queryResult {
311321 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
312322 sourceKeyspaceName , ReverseWorkflowName (workflowName )),
313323 result : & querypb.QueryResult {},
314324 },
315- } ,
325+ ) ,
316326 expectedTargetQueries : []* queryResult {
317327 {
318328 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
@@ -343,25 +353,25 @@ func TestMoveTablesComplete(t *testing.T) {
343353 Workflow : workflowName ,
344354 RenameTables : true ,
345355 },
346- expectedSourceQueries : [] * queryResult {
347- {
356+ expectedSourceQueries : append ( slices . Clone ( stopReverseStreamQueries ),
357+ & queryResult {
348358 query : fmt .Sprintf ("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`" , sourceKeyspaceName , table1Name , sourceKeyspaceName , table1Name ),
349359 result : & querypb.QueryResult {},
350360 },
351- {
361+ & queryResult {
352362 query : fmt .Sprintf ("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`" , sourceKeyspaceName , table2Name , sourceKeyspaceName , table2Name ),
353363 result : & querypb.QueryResult {},
354364 },
355- {
365+ & queryResult {
356366 query : fmt .Sprintf ("rename table `vt_%s`.`%s` TO `vt_%s`.`_%s_old`" , sourceKeyspaceName , table3Name , sourceKeyspaceName , table3Name ),
357367 result : & querypb.QueryResult {},
358368 },
359- {
369+ & queryResult {
360370 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
361371 sourceKeyspaceName , ReverseWorkflowName (workflowName )),
362372 result : & querypb.QueryResult {},
363373 },
364- } ,
374+ ) ,
365375 expectedTargetQueries : []* queryResult {
366376 {
367377 query : fmt .Sprintf ("delete from _vt.vreplication where db_name = 'vt_%s' and workflow = '%s'" ,
@@ -374,6 +384,46 @@ func TestMoveTablesComplete(t *testing.T) {
374384 workflowName , targetKeyspaceName ),
375385 },
376386 },
387+ {
388+ name : "reverse workflow in error state" ,
389+ sourceKeyspace : & testKeyspace {
390+ KeyspaceName : sourceKeyspaceName ,
391+ ShardNames : []string {"0" },
392+ },
393+ targetKeyspace : & testKeyspace {
394+ KeyspaceName : targetKeyspaceName ,
395+ ShardNames : []string {"-80" , "80-" },
396+ },
397+ req : & vtctldatapb.MoveTablesCompleteRequest {
398+ TargetKeyspace : targetKeyspaceName ,
399+ Workflow : workflowName ,
400+ },
401+ preFunc : func (t * testing.T , env * testEnv ) {
402+ for _ , tablet := range env .tablets [sourceKeyspaceName ] {
403+ env .tmc .expectReadVReplicationWorkflowRequest (tablet .Alias .Uid , & readVReplicationWorkflowRequestResponse {
404+ req : & tabletmanagerdatapb.ReadVReplicationWorkflowRequest {
405+ Workflow : ReverseWorkflowName (workflowName ),
406+ },
407+ res : & tabletmanagerdatapb.ReadVReplicationWorkflowResponse {
408+ Workflow : ReverseWorkflowName (workflowName ),
409+ Streams : []* tabletmanagerdatapb.ReadVReplicationWorkflowResponse_Stream {
410+ {
411+ Id : 1 ,
412+ State : binlogdatapb .VReplicationWorkflowState_Error ,
413+ Bls : & binlogdatapb.BinlogSource {
414+ Keyspace : targetKeyspaceName ,
415+ Shard : "-80" ,
416+ },
417+ },
418+ },
419+ },
420+ })
421+ }
422+ },
423+ wantErr : "reverse vreplication stream 1 is in error state on tablet 100" ,
424+ postFunc : func (t * testing.T , env * testEnv ) {
425+ },
426+ },
377427 {
378428 name : "ignore source keyspace" ,
379429 sourceKeyspace : & testKeyspace {
0 commit comments