@@ -3459,3 +3459,115 @@ def test_basic_backup_default_transaction_read_only(self):
3459
3459
3460
3460
# Clean after yourself
3461
3461
self .del_test_dir (module_name ,fname )
3462
+
3463
+ # @unittest.skip("skip")
3464
+ def test_backup_atexit (self ):
3465
+ """"""
3466
+ fname = self .id ().split ('.' )[3 ]
3467
+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
3468
+ node = self .make_simple_node (
3469
+ base_dir = os .path .join (module_name ,fname ,'node' ),
3470
+ set_replication = True ,
3471
+ ptrack_enable = self .ptrack ,
3472
+ initdb_params = ['--data-checksums' ])
3473
+
3474
+ self .init_pb (backup_dir )
3475
+ self .add_instance (backup_dir ,'node' ,node )
3476
+ self .set_archiving (backup_dir ,'node' ,node )
3477
+ node .slow_start ()
3478
+
3479
+ node .pgbench_init (scale = 5 )
3480
+
3481
+ # Full backup in streaming mode
3482
+ gdb = self .backup_node (
3483
+ backup_dir ,'node' ,node ,
3484
+ options = ['--stream' ,'--log-level-file=VERBOSE' ],gdb = True )
3485
+
3486
+ # break at streaming start
3487
+ gdb .set_breakpoint ('backup_data_file' )
3488
+ gdb .run_until_break ()
3489
+
3490
+ gdb .remove_all_breakpoints ()
3491
+ gdb ._execute ('signal SIGINT' )
3492
+ sleep (1 )
3493
+
3494
+ self .assertEqual (
3495
+ self .show_pb (
3496
+ backup_dir ,'node' )[0 ]['status' ],'ERROR' )
3497
+
3498
+ with open (os .path .join (backup_dir ,'log' ,'pg_probackup.log' ))as f :
3499
+ log_content = f .read ()
3500
+ #print(log_content)
3501
+ self .assertIn (
3502
+ 'WARNING: backup in progress, stop backup' ,
3503
+ log_content )
3504
+
3505
+ self .assertIn (
3506
+ 'FROM pg_catalog.pg_stop_backup' ,
3507
+ log_content )
3508
+
3509
+ self .assertIn (
3510
+ 'setting its status to ERROR' ,
3511
+ log_content )
3512
+
3513
+ # Clean after yourself
3514
+ self .del_test_dir (module_name ,fname )
3515
+
3516
+ # @unittest.skip("skip")
3517
+ def test_pg_stop_backup_missing_permissions (self ):
3518
+ """"""
3519
+ fname = self .id ().split ('.' )[3 ]
3520
+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
3521
+ node = self .make_simple_node (
3522
+ base_dir = os .path .join (module_name ,fname ,'node' ),
3523
+ set_replication = True ,
3524
+ ptrack_enable = self .ptrack ,
3525
+ initdb_params = ['--data-checksums' ])
3526
+
3527
+ self .init_pb (backup_dir )
3528
+ self .add_instance (backup_dir ,'node' ,node )
3529
+ self .set_archiving (backup_dir ,'node' ,node )
3530
+ node .slow_start ()
3531
+
3532
+ node .pgbench_init (scale = 5 )
3533
+
3534
+ self .simple_bootstrap (node ,'backup' )
3535
+
3536
+ if self .get_version (node )< 90600 :
3537
+ node .safe_psql (
3538
+ 'postgres' ,
3539
+ 'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_stop_backup() FROM backup' )
3540
+ elif self .get_version (node )> 90600 and self .get_version (node )< 100000 :
3541
+ node .safe_psql (
3542
+ 'postgres' ,
3543
+ 'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) FROM backup' )
3544
+ else :
3545
+ node .safe_psql (
3546
+ 'postgres' ,
3547
+ 'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) FROM backup' )
3548
+
3549
+ # Full backup in streaming mode
3550
+ try :
3551
+ self .backup_node (
3552
+ backup_dir ,'node' ,node ,
3553
+ options = ['--stream' ,'-U' ,'backup' ])
3554
+ # we should die here because exception is what we expect to happen
3555
+ self .assertEqual (
3556
+ 1 ,0 ,
3557
+ "Expecting Error because of missing permissions on pg_stop_backup "
3558
+ "\n Output: {0}\n CMD: {1}" .format (
3559
+ repr (self .output ),self .cmd ))
3560
+ except ProbackupException as e :
3561
+ self .assertIn (
3562
+ "ERROR: permission denied for function pg_stop_backup" ,
3563
+ e .message ,
3564
+ "\n Unexpected Error Message: {0}\n CMD: {1}" .format (
3565
+ repr (e .message ),self .cmd ))
3566
+ self .assertIn (
3567
+ "query was: SELECT pg_catalog.txid_snapshot_xmax" ,
3568
+ e .message ,
3569
+ "\n Unexpected Error Message: {0}\n CMD: {1}" .format (
3570
+ repr (e .message ),self .cmd ))
3571
+
3572
+ # Clean after yourself
3573
+ self .del_test_dir (module_name ,fname )