@@ -404,7 +404,7 @@ move_primary(Cmd *cmd)
404
404
int32 dst_node = atoi (cmd -> opts [1 ]);
405
405
406
406
CopyPartState * * tasks = palloc (sizeof (CopyPartState * ));
407
- MovePrimaryState * mps = palloc (sizeof (MovePrimaryState ));
407
+ MovePrimaryState * mps = palloc0 (sizeof (MovePrimaryState ));
408
408
tasks [0 ] = (CopyPartState * ) mps ;
409
409
init_mp_state (mps , part_name , dst_node );
410
410
@@ -450,7 +450,6 @@ init_mp_state(MovePrimaryState *mps, const char *part_name, int32 dst_node)
450
450
*/
451
451
mps -> rep_connstr = get_worker_node_connstr (mps -> rep_node );
452
452
}
453
- mps -> rep_conn = NULL ;
454
453
455
454
mps -> create_data_pub_sql = psprintf (
456
455
"select shardman.primary_moved_create_data_pub('%s', %d, %d);" ,
@@ -470,7 +469,8 @@ create_replica(Cmd *cmd)
470
469
int32 dst_node = atoi (cmd -> opts [1 ]);
471
470
472
471
CopyPartState * * tasks = palloc (sizeof (CopyPartState * ));
473
- CreateReplicaState * crs = palloc (sizeof (CreateReplicaState ));
472
+ /* palloc0 is important to set ptrs to NULL */
473
+ CreateReplicaState * crs = palloc0 (sizeof (CreateReplicaState ));
474
474
tasks [0 ] = (CopyPartState * ) crs ;
475
475
init_cr_state (crs , part_name , dst_node );
476
476
@@ -484,6 +484,23 @@ create_replica(Cmd *cmd)
484
484
void
485
485
init_cr_state (CreateReplicaState * crs , const char * part_name , int32 dst_node )
486
486
{
487
+ char * sql ;
488
+ uint64 shard_exists ;
489
+
490
+ /* Check that table with such name is not already exists on dst node */
491
+ sql = psprintf (
492
+ "select owner from shardman.partitions where part_name = '%s' and owner = %d" ,
493
+ part_name , dst_node );
494
+ shard_exists = void_spi (sql );
495
+ if (shard_exists )
496
+ {
497
+ shmn_elog (WARNING ,
498
+ "Shard %s already exists on node %d, won't create replica on it." ,
499
+ part_name , dst_node );
500
+ crs -> cp .res = TASK_FAILED ;
501
+ return ;
502
+ }
503
+
487
504
/* Set up fields neccesary to call init_cp_state */
488
505
crs -> cp .dst_node = dst_node ;
489
506
crs -> cp .part_name = part_name ;
@@ -545,8 +562,6 @@ init_cp_state(CopyPartState *cps)
545
562
cps -> res = TASK_FAILED ;
546
563
return ;
547
564
}
548
- cps -> src_conn = NULL ;
549
- cps -> dst_conn = NULL ;
550
565
551
566
/* constant strings */
552
567
cps -> logname = psprintf ("shardman_copy_%s_%d_%d" ,
0 commit comments