@@ -2734,5 +2734,46 @@ def test_merge_pg_filenode_map(self):
2734
2734
'postgres' ,
2735
2735
'select 1' )
2736
2736
2737
+ def test_unfinished_merge (self ):
2738
+ """ Test when parent has unfinished merge with a different backup. """
2739
+ self ._check_gdb_flag_or_skip_test ()
2740
+ cases = [('fail_merged' , 'write_backup_filelist' , ['MERGED' , 'MERGING' , 'OK' ]),
2741
+ ('fail_merging' , 'pgBackupWriteControl' , ['MERGING' , 'OK' , 'OK' ])]
2742
+
2743
+ for name , terminate_at , states in cases :
2744
+ node_name = 'node_' + name
2745
+ backup_dir = os .path .join (self .tmp_path , self .module_name , self .fname , name )
2746
+ node = self .make_simple_node (
2747
+ base_dir = os .path .join (self .module_name , self .fname , node_name ),
2748
+ set_replication = True ,
2749
+ initdb_params = ['--data-checksums' ])
2750
+
2751
+ self .init_pb (backup_dir )
2752
+ self .add_instance (backup_dir , node_name , node )
2753
+ self .set_archiving (backup_dir , node_name , node )
2754
+ node .slow_start ()
2755
+
2756
+ full_id = self .backup_node (backup_dir , node_name , node , options = ['--stream' ])
2757
+
2758
+ backup_id = self .backup_node (backup_dir , node_name , node , backup_type = 'delta' )
2759
+ second_backup_id = self .backup_node (backup_dir , node_name , node , backup_type = 'delta' )
2760
+
2761
+ gdb = self .merge_backup (backup_dir , node_name , backup_id , gdb = True )
2762
+ gdb .set_breakpoint (terminate_at )
2763
+ gdb .run_until_break ()
2764
+
2765
+ gdb .remove_all_breakpoints ()
2766
+ gdb ._execute ('signal SIGINT' )
2767
+ gdb .continue_execution_until_error ()
2768
+
2769
+ print (self .show_pb (backup_dir , node_name , as_json = False , as_text = True ))
2770
+
2771
+ for expected , real in zip (states , self .show_pb (backup_dir , node_name ), strict = True ):
2772
+ self .assertEqual (expected , real ['status' ])
2773
+
2774
+ with self .assertRaisesRegex (ProbackupException ,
2775
+ f"Full backup { full_id } has unfinished merge with backup { backup_id } " ):
2776
+ self .merge_backup (backup_dir , node_name , second_backup_id , gdb = False )
2777
+
2737
2778
# 1. Need new test with corrupted FULL backup
2738
2779
# 2. different compression levels
0 commit comments