@@ -2244,7 +2244,7 @@ def test_merge_multiple_descendants(self):
2244
2244
repr (e .message ), self .cmd ))
2245
2245
2246
2246
# Clean after yourself
2247
- self .del_test_dir (module_name , fname )
2247
+ self .del_test_dir (module_name , fname , [ node ] )
2248
2248
2249
2249
# @unittest.skip("skip")
2250
2250
def test_smart_merge (self ):
@@ -2304,7 +2304,7 @@ def test_smart_merge(self):
2304
2304
logfile_content = f .read ()
2305
2305
2306
2306
# Clean after yourself
2307
- self .del_test_dir (module_name , fname )
2307
+ self .del_test_dir (module_name , fname , [ node ] )
2308
2308
2309
2309
def test_idempotent_merge (self ):
2310
2310
"""
@@ -2379,8 +2379,7 @@ def test_idempotent_merge(self):
2379
2379
self .assertEqual (
2380
2380
page_id_2 , self .show_pb (backup_dir , 'node' )[0 ]['id' ])
2381
2381
2382
-
2383
- self .del_test_dir (module_name , fname )
2382
+ self .del_test_dir (module_name , fname , [node ])
2384
2383
2385
2384
def test_merge_correct_inheritance (self ):
2386
2385
"""
@@ -2435,7 +2434,7 @@ def test_merge_correct_inheritance(self):
2435
2434
page_meta ['expire-time' ],
2436
2435
self .show_pb (backup_dir , 'node' , page_id )['expire-time' ])
2437
2436
2438
- self .del_test_dir (module_name , fname )
2437
+ self .del_test_dir (module_name , fname , [ node ] )
2439
2438
2440
2439
def test_merge_correct_inheritance_1 (self ):
2441
2440
"""
@@ -2485,7 +2484,7 @@ def test_merge_correct_inheritance_1(self):
2485
2484
'expire-time' ,
2486
2485
self .show_pb (backup_dir , 'node' , page_id ))
2487
2486
2488
- self .del_test_dir (module_name , fname )
2487
+ self .del_test_dir (module_name , fname , [ node ] )
2489
2488
2490
2489
# @unittest.skip("skip")
2491
2490
# @unittest.expectedFailure
@@ -2603,6 +2602,56 @@ def test_multi_timeline_merge(self):
2603
2602
'--amcheck' ,
2604
2603
'-d' , 'postgres' , '-p' , str (node_restored .port )])
2605
2604
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
+
2606
2655
# Clean after yourself
2607
2656
self .del_test_dir (module_name , fname )
2608
2657
0 commit comments