@@ -2244,7 +2244,7 @@ def test_merge_multiple_descendants(self):
22442244repr (e .message ),self .cmd ))
22452245
22462246# Clean after yourself
2247- self .del_test_dir (module_name ,fname )
2247+ self .del_test_dir (module_name ,fname , [ node ] )
22482248
22492249# @unittest.skip("skip")
22502250def test_smart_merge (self ):
@@ -2304,7 +2304,7 @@ def test_smart_merge(self):
23042304logfile_content = f .read ()
23052305
23062306# Clean after yourself
2307- self .del_test_dir (module_name ,fname )
2307+ self .del_test_dir (module_name ,fname , [ node ] )
23082308
23092309def test_idempotent_merge (self ):
23102310"""
@@ -2379,8 +2379,7 @@ def test_idempotent_merge(self):
23792379self .assertEqual (
23802380page_id_2 ,self .show_pb (backup_dir ,'node' )[0 ]['id' ])
23812381
2382-
2383- self .del_test_dir (module_name ,fname )
2382+ self .del_test_dir (module_name ,fname , [node ])
23842383
23852384def test_merge_correct_inheritance (self ):
23862385"""
@@ -2435,7 +2434,7 @@ def test_merge_correct_inheritance(self):
24352434page_meta ['expire-time' ],
24362435self .show_pb (backup_dir ,'node' ,page_id )['expire-time' ])
24372436
2438- self .del_test_dir (module_name ,fname )
2437+ self .del_test_dir (module_name ,fname , [ node ] )
24392438
24402439def test_merge_correct_inheritance_1 (self ):
24412440"""
@@ -2485,7 +2484,7 @@ def test_merge_correct_inheritance_1(self):
24852484'expire-time' ,
24862485self .show_pb (backup_dir ,'node' ,page_id ))
24872486
2488- self .del_test_dir (module_name ,fname )
2487+ self .del_test_dir (module_name ,fname , [ node ] )
24892488
24902489# @unittest.skip("skip")
24912490# @unittest.expectedFailure
@@ -2603,6 +2602,56 @@ def test_multi_timeline_merge(self):
26032602'--amcheck' ,
26042603'-d' ,'postgres' ,'-p' ,str (node_restored .port )])
26052604
2605+ # Clean after yourself
2606+ self .del_test_dir (module_name ,fname , [node ,node_restored ])
2607+
2608+ # @unittest.skip("skip")
2609+ # @unittest.expectedFailure
2610+ def test_merge_page_header_map_retry (self ):
2611+ """
2612+ page header map cannot be trusted when
2613+ running retry
2614+ """
2615+ fname = self .id ().split ('.' )[3 ]
2616+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
2617+ node = self .make_simple_node (
2618+ base_dir = os .path .join (module_name ,fname ,'node' ),
2619+ set_replication = True ,
2620+ initdb_params = ['--data-checksums' ],
2621+ pg_options = {'autovacuum' :'off' })
2622+
2623+ self .init_pb (backup_dir )
2624+ self .add_instance (backup_dir ,'node' ,node )
2625+ node .slow_start ()
2626+
2627+ node .pgbench_init (scale = 20 )
2628+ self .backup_node (backup_dir ,'node' ,node ,options = ['--stream' ])
2629+
2630+ pgbench = node .pgbench (options = ['-T' ,'10' ,'-c' ,'1' ,'--no-vacuum' ])
2631+ pgbench .wait ()
2632+
2633+ delta_id = self .backup_node (
2634+ backup_dir ,'node' ,node ,
2635+ backup_type = 'delta' ,options = ['--stream' ])
2636+
2637+ pgdata = self .pgdata_content (node .data_dir )
2638+
2639+ gdb = self .merge_backup (backup_dir ,'node' ,delta_id ,gdb = True )
2640+
2641+ # our goal here is to get full backup with merged data files,
2642+ # but with old page header map
2643+ gdb .set_breakpoint ('cleanup_header_map' )
2644+ gdb .run_until_break ()
2645+ gdb ._execute ('signal SIGKILL' )
2646+
2647+ self .merge_backup (backup_dir ,'node' ,delta_id )
2648+
2649+ node .cleanup ()
2650+
2651+ self .restore_node (backup_dir ,'node' ,node )
2652+ pgdata_restored = self .pgdata_content (node .data_dir )
2653+ self .compare_pgdata (pgdata ,pgdata_restored )
2654+
26062655# Clean after yourself
26072656self .del_test_dir (module_name ,fname )
26082657