@@ -722,6 +722,103 @@ def test_page_backup_with_lost_wal_segment(self):
722
722
self .show_pb (backup_dir , 'node' )[1 ]['status' ],
723
723
'Backup {0} should have STATUS "ERROR"' )
724
724
725
+ # Multi-thread PAGE backup
726
+ try :
727
+ self .backup_node (
728
+ backup_dir , 'node' , node ,
729
+ backup_type = 'page' ,
730
+ options = ["-j" , "4" , '--log-level-file=verbose' ])
731
+ self .assertEqual (
732
+ 1 , 0 ,
733
+ "Expecting Error because of wal segment disappearance.\n "
734
+ "Output: {0} \n CMD: {1}" .format (
735
+ self .output , self .cmd ))
736
+ except ProbackupException as e :
737
+ self .assertTrue (
738
+ 'INFO: Wait for LSN' in e .message and
739
+ 'in archived WAL segment' in e .message and
740
+ 'WARNING: could not read WAL record at' in e .message and
741
+ 'ERROR: WAL segment "{0}" is absent\n ' .format (
742
+ file ) in e .message ,
743
+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
744
+ repr (e .message ), self .cmd ))
745
+
746
+ self .assertEqual (
747
+ 'ERROR' ,
748
+ self .show_pb (backup_dir , 'node' )[2 ]['status' ],
749
+ 'Backup {0} should have STATUS "ERROR"' )
750
+
751
+ # Clean after yourself
752
+ self .del_test_dir (module_name , fname )
753
+
754
+ # @unittest.skip("skip")
755
+ def test_page_backup_with_corrupted_wal_segment (self ):
756
+ """
757
+ make node with archiving
758
+ make archive backup, then generate some wals with pgbench,
759
+ corrupt latest archived wal segment
760
+ run page backup, expecting error because of missing wal segment
761
+ make sure that backup status is 'ERROR'
762
+ """
763
+ fname = self .id ().split ('.' )[3 ]
764
+ node = self .make_simple_node (
765
+ base_dir = "{0}/{1}/node" .format (module_name , fname ),
766
+ initdb_params = ['--data-checksums' ],
767
+ pg_options = {'wal_level' : 'replica' }
768
+ )
769
+ backup_dir = os .path .join (self .tmp_path , module_name , fname , 'backup' )
770
+ self .init_pb (backup_dir )
771
+ self .add_instance (backup_dir , 'node' , node )
772
+ self .set_archiving (backup_dir , 'node' , node )
773
+ node .start ()
774
+
775
+ self .backup_node (backup_dir , 'node' , node )
776
+
777
+ # make some wals
778
+ node .pgbench_init (scale = 3 )
779
+
780
+ # delete last wal segment
781
+ wals_dir = os .path .join (backup_dir , 'wal' , 'node' )
782
+ wals = [f for f in os .listdir (wals_dir ) if os .path .isfile (os .path .join (
783
+ wals_dir , f )) and not f .endswith ('.backup' )]
784
+ wals = map (str , wals )
785
+ file = os .path .join (wals_dir , max (wals ))
786
+ # file = os.path.join(wals_dir, '000000010000000000000004')
787
+ print (file )
788
+ with open (file , "rb+" , 0 ) as f :
789
+ f .seek (42 )
790
+ f .write (b"blah" )
791
+ f .flush ()
792
+ f .close
793
+
794
+ if self .archive_compress :
795
+ file = file [:- 3 ]
796
+
797
+ # Single-thread PAGE backup
798
+ try :
799
+ self .backup_node (
800
+ backup_dir , 'node' , node ,
801
+ backup_type = 'page' , options = ['--log-level-file=verbose' ])
802
+ self .assertEqual (
803
+ 1 , 0 ,
804
+ "Expecting Error because of wal segment disappearance.\n "
805
+ "Output: {0} \n CMD: {1}" .format (
806
+ self .output , self .cmd ))
807
+ except ProbackupException as e :
808
+ self .assertTrue (
809
+ 'INFO: Wait for LSN' in e .message and
810
+ 'in archived WAL segment' in e .message and
811
+ 'WARNING: could not read WAL record at' in e .message and
812
+ 'ERROR: WAL segment "{0}" is absent\n ' .format (
813
+ file ) in e .message ,
814
+ '\n Unexpected Error Message: {0}\n CMD: {1}' .format (
815
+ repr (e .message ), self .cmd ))
816
+
817
+ self .assertEqual (
818
+ 'ERROR' ,
819
+ self .show_pb (backup_dir , 'node' )[1 ]['status' ],
820
+ 'Backup {0} should have STATUS "ERROR"' )
821
+
725
822
# Multi-thread PAGE backup
726
823
try :
727
824
self .backup_node (
0 commit comments