@@ -3459,3 +3459,115 @@ def test_basic_backup_default_transaction_read_only(self):
34593459
34603460# Clean after yourself
34613461self .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 )