@@ -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 ):
0 commit comments