@@ -2244,7 +2244,7 @@ def test_merge_multiple_descendants(self):
22442244 repr (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")
22502250 def test_smart_merge (self ):
@@ -2304,7 +2304,7 @@ def test_smart_merge(self):
23042304 logfile_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
23092309 def test_idempotent_merge (self ):
23102310 """
@@ -2379,8 +2379,7 @@ def test_idempotent_merge(self):
23792379 self .assertEqual (
23802380 page_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
23852384 def test_merge_correct_inheritance (self ):
23862385 """
@@ -2435,7 +2434,7 @@ def test_merge_correct_inheritance(self):
24352434 page_meta ['expire-time' ],
24362435 self .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
24402439 def test_merge_correct_inheritance_1 (self ):
24412440 """
@@ -2485,7 +2484,7 @@ def test_merge_correct_inheritance_1(self):
24852484 'expire-time' ,
24862485 self .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
26072656 self .del_test_dir (module_name , fname )
26082657
0 commit comments