@@ -657,6 +657,112 @@ def test_multiple_segments(self):
657
657
self .assertEqual (page_result ,self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap" ),'Lost data after restore' )
658
658
659
659
660
+ # @unittest.expectedFailure
661
+ # @unittest.skip("skip")
662
+ def test_multiple_segments_in_multiple_tablespaces (self ):
663
+ """
664
+ Case: Make full backup before created table in the tablespace.
665
+ Make ptrack backup after create table.
666
+ Check: incremental backup will not greater as full
667
+ """
668
+ tblspace_name_1 = 'tblspace_name_1'
669
+ tblspace_name_2 = 'tblspace_name_2'
670
+
671
+ self .create_tblspace_in_node (self .node ,tblspace_name_1 ,True )
672
+ self .create_tblspace_in_node (self .node ,tblspace_name_2 ,True )
673
+
674
+ self .node .safe_psql (
675
+ "postgres" ,
676
+ "CREATE TABLE {0} TABLESPACE {1}\
677
+ AS SELECT i AS id, MD5(i::text) AS text,\
678
+ MD5(repeat(i::text,10))::tsvector AS tsvector\
679
+ FROM generate_series(0,10050000) i" .format ('t_heap_1' ,tblspace_name_1 )
680
+ )
681
+
682
+ self .node .safe_psql (
683
+ "postgres" ,
684
+ "CREATE TABLE {0} TABLESPACE {1}\
685
+ AS SELECT i AS id, MD5(i::text) AS text,\
686
+ MD5(repeat(i::text,10))::tsvector AS tsvector\
687
+ FROM generate_series(0,10050000) i" .format ('t_heap_2' ,tblspace_name_2 )
688
+ )
689
+
690
+ full_result_1 = self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_1" )
691
+ full_result_2 = self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_2" )
692
+
693
+ try :
694
+ backup_id_full = self .backup_node (self .backup_dir ,'node' ,self .node ,backup_type = 'full' )
695
+ except ProbackupException as e :
696
+ self .fail (
697
+ "ERROR: Full backup failed.\n {0}\n {1}" .format (
698
+ repr (self .cmd ),
699
+ repr (e .message )
700
+ )
701
+ )
702
+
703
+ self .node .safe_psql (
704
+ "postgres" ,
705
+ 'INSERT INTO {0}\
706
+ SELECT i AS id, MD5(i::text) AS text,\
707
+ MD5(repeat(i::text,10))::tsvector AS tsvector\
708
+ FROM generate_series(0,10050000) i' .format ('t_heap_1' )
709
+ )
710
+
711
+ self .node .safe_psql (
712
+ "postgres" ,
713
+ 'INSERT INTO {0}\
714
+ SELECT i AS id, MD5(i::text) AS text,\
715
+ MD5(repeat(i::text,10))::tsvector AS tsvector\
716
+ FROM generate_series(0,10050000) i' .format ('t_heap_2' )
717
+ )
718
+
719
+ page_result_1 = self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_1" )
720
+ page_result_2 = self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_2" )
721
+
722
+ try :
723
+ backup_id_page = self .backup_node (self .backup_dir ,'node' ,self .node ,backup_type = 'page' )
724
+ except ProbackupException as e :
725
+ self .fail (
726
+ "ERROR: Incremental backup failed.\n {0}\n {1}" .format (
727
+ repr (self .cmd ),
728
+ repr (e .message )
729
+ )
730
+ )
731
+
732
+ show_backup_full = self .show_pb (self .backup_dir ,'node' ,backup_id_full )
733
+ show_backup_page = self .show_pb (self .backup_dir ,'node' ,backup_id_page )
734
+ self .assertGreater (
735
+ show_backup_page ["data-bytes" ],
736
+ show_backup_full ["data-bytes" ],
737
+ "ERROR: Size of incremental backup greater as full.\n INFO: {0} >{1}" .format (
738
+ show_backup_page ["data-bytes" ],
739
+ show_backup_full ["data-bytes" ]
740
+ )
741
+ )
742
+
743
+ # CHECK FULL BACKUP
744
+ self .node .stop ()
745
+ self .node .cleanup ()
746
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name ),ignore_errors = True )
747
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name_1 ),ignore_errors = True )
748
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name_2 ),ignore_errors = True )
749
+ self .restore_node (self .backup_dir ,'node' ,self .node ,backup_id = backup_id_full ,options = ["-j" ,"4" ])
750
+ self .node .start ()
751
+ self .assertEqual (full_result_1 ,self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_1" ),'Lost data after restore' )
752
+ self .assertEqual (full_result_2 ,self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_2" ),'Lost data after restore' )
753
+
754
+ # CHECK PAGE BACKUP
755
+ self .node .stop ()
756
+ self .node .cleanup ()
757
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name ),ignore_errors = True )
758
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name_1 ),ignore_errors = True )
759
+ shutil .rmtree (self .get_tblspace_path (self .node ,tblspace_name_2 ),ignore_errors = True )
760
+ self .restore_node (self .backup_dir ,'node' ,self .node ,backup_id = backup_id_page ,options = ["-j" ,"4" ])
761
+ self .node .start ()
762
+ self .assertEqual (page_result_1 ,self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_1" ),'Lost data after restore' )
763
+ self .assertEqual (page_result_2 ,self .node .safe_psql ("postgres" ,"SELECT * FROM t_heap_2" ),'Lost data after restore' )
764
+
765
+
660
766
# @unittest.expectedFailure
661
767
# @unittest.skip("skip")
662
768
def test_fullbackup_after_create_table_page_after_create_table_stream (self ):