@@ -3443,6 +3443,119 @@ def test_validate_corrupt_tablespace_map(self):
3443
3443
'\n Unexpected Error Message: {0}\n CMD: {1}' .format (
3444
3444
repr (e .message ), self .cmd ))
3445
3445
3446
+ # @unittest.expectedFailure
3447
+ # @unittest.skip("skip")
3448
+ def test_validate_target_lsn (self ):
3449
+ """
3450
+ Check validation to specific LSN
3451
+ """
3452
+ fname = self .id ().split ('.' )[3 ]
3453
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
3454
+ node = self .make_simple_node (
3455
+ base_dir = os .path .join (module_name , fname , 'node' ),
3456
+ set_replication = True ,
3457
+ initdb_params = ['--data-checksums' ])
3458
+
3459
+ self .init_pb (backup_dir )
3460
+ self .add_instance (backup_dir , 'node' , node )
3461
+ self .set_archiving (backup_dir , 'node' , node )
3462
+ node .slow_start ()
3463
+
3464
+ # FULL backup
3465
+ self .backup_node (backup_dir , 'node' , node )
3466
+
3467
+ node .safe_psql (
3468
+ "postgres" ,
3469
+ "create table t_heap as select 1 as id, md5(i::text) as text, "
3470
+ "md5(repeat(i::text,10))::tsvector as tsvector "
3471
+ "from generate_series(0,10000) i" )
3472
+
3473
+ node_restored = self .make_simple_node (
3474
+ base_dir = os .path .join (module_name , fname , 'node_restored' ))
3475
+ node_restored .cleanup ()
3476
+
3477
+ self .restore_node (backup_dir , 'node' , node_restored )
3478
+
3479
+ node_restored .append_conf (
3480
+ "postgresql.auto.conf" , "port = {0}" .format (node_restored .port ))
3481
+
3482
+ node_restored .slow_start ()
3483
+
3484
+ self .switch_wal_segment (node )
3485
+
3486
+ backup_id = self .backup_node (
3487
+ backup_dir , 'node' , node_restored ,
3488
+ data_dir = node_restored .data_dir )
3489
+
3490
+ target_lsn = self .show_pb (backup_dir , 'node' )[1 ]['stop-lsn' ]
3491
+
3492
+ self .delete_pb (backup_dir , 'node' , backup_id )
3493
+
3494
+ self .validate_pb (
3495
+ backup_dir , 'node' ,
3496
+ options = [
3497
+ '--recovery-target-timeline=2' ,
3498
+ '--recovery-target-lsn={0}' .format (target_lsn )])
3499
+
3500
+ # @unittest.expectedFailure
3501
+ # @unittest.skip("skip")
3502
+ def test_recovery_target_backup_victim (self ):
3503
+ """
3504
+ Check that for validation to recovery target
3505
+ probackup chooses valid backup
3506
+ https://github.com/postgrespro/pg_probackup/issues/104
3507
+ """
3508
+ fname = self .id ().split ('.' )[3 ]
3509
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
3510
+ node = self .make_simple_node (
3511
+ base_dir = os .path .join (module_name , fname , 'node' ),
3512
+ set_replication = True ,
3513
+ initdb_params = ['--data-checksums' ])
3514
+
3515
+ self .init_pb (backup_dir )
3516
+ self .add_instance (backup_dir , 'node' , node )
3517
+ self .set_archiving (backup_dir , 'node' , node )
3518
+ node .slow_start ()
3519
+
3520
+ # FULL backup
3521
+ self .backup_node (backup_dir , 'node' , node )
3522
+
3523
+ node .safe_psql (
3524
+ "postgres" ,
3525
+ "create table t_heap as select 1 as id, md5(i::text) as text, "
3526
+ "md5(repeat(i::text,10))::tsvector as tsvector "
3527
+ "from generate_series(0,10000) i" )
3528
+
3529
+ target_time = node .safe_psql (
3530
+ "postgres" ,
3531
+ "select now()" ).rstrip ()
3532
+
3533
+ node .safe_psql (
3534
+ "postgres" ,
3535
+ "create table t_heap1 as select 1 as id, md5(i::text) as text, "
3536
+ "md5(repeat(i::text,10))::tsvector as tsvector "
3537
+ "from generate_series(0,100) i" )
3538
+
3539
+ gdb = self .backup_node (backup_dir , 'node' , node , gdb = True )
3540
+
3541
+ gdb .set_breakpoint ('pg_stop_backup' )
3542
+ gdb .run_until_break ()
3543
+ gdb .remove_all_breakpoints ()
3544
+ gdb ._execute ('signal SIGINT' )
3545
+ gdb .continue_execution_until_error ()
3546
+
3547
+ backup_id = self .show_pb (backup_dir , 'node' )[1 ]['id' ]
3548
+
3549
+ self .assertEqual (
3550
+ 'ERROR' ,
3551
+ self .show_pb (backup_dir , 'node' , backup_id )['status' ],
3552
+ 'Backup STATUS should be "ERROR"' )
3553
+
3554
+ self .validate_pb (
3555
+ backup_dir , 'node' ,
3556
+ options = ['--recovery-target-time={0}' .format (target_time )])
3557
+
3558
+
3446
3559
# validate empty backup list
3447
3560
# page from future during validate
3448
3561
# page from future during backup
0 commit comments