1
1
import os
2
2
import unittest
3
3
import random
4
+ import shutil
4
5
5
6
from .helpers .cfs_helpers import find_by_extensions , find_by_name , find_by_pattern , corrupt_file
6
7
from .helpers .ptrack_helpers import ProbackupTest , ProbackupException
@@ -21,9 +22,10 @@ def setUp(self):
21
22
initdb_params = ['--data-checksums' ],
22
23
pg_options = {
23
24
'wal_level' : 'replica' ,
24
- 'ptrack_enable' : 'on' ,
25
+ # 'ptrack_enable': 'on',
25
26
'cfs_encryption' : 'off' ,
26
- 'max_wal_senders' : '2'
27
+ 'max_wal_senders' : '2' ,
28
+ 'shared_buffers' : '200MB'
27
29
}
28
30
)
29
31
@@ -34,7 +36,7 @@ def setUp(self):
34
36
self .node .start ()
35
37
36
38
self .create_tblspace_in_node (self .node , tblspace_name , True )
37
-
39
+
38
40
tblspace = self .node .safe_psql (
39
41
"postgres" ,
40
42
"SELECT * FROM pg_tablespace WHERE spcname='{0}'" .format (tblspace_name )
@@ -95,6 +97,7 @@ def test_fullbackup_empty_tablespace_stream(self):
95
97
repr (e .message )
96
98
)
97
99
)
100
+
98
101
show_backup = self .show_pb (self .backup_dir , 'node' , backup_id )
99
102
self .assertEqual (
100
103
"OK" ,
@@ -105,10 +108,6 @@ def test_fullbackup_empty_tablespace_stream(self):
105
108
find_by_name ([os .path .join (self .backup_dir , 'backups' , 'node' , backup_id )], ['pg_compression' ]),
106
109
"ERROR: File pg_compression not found in backup dir"
107
110
)
108
- self .assertFalse (
109
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
110
- "ERROR: _ptrack files found in backup dir"
111
- )
112
111
113
112
# @unittest.expectedFailure
114
113
# @unittest.skip("skip")
@@ -131,11 +130,12 @@ def test_fullbackup_after_create_table(self):
131
130
backup_id = self .backup_node (self .backup_dir , 'node' , self .node , backup_type = 'full' )
132
131
except ProbackupException as e :
133
132
self .fail (
134
- "ERROR: Full backup failed. \n {0} \n {0 }" .format (
135
- repr (self . cmd ),
136
- repr (e . message )
133
+ "\n ERROR: {0}\n CMD: {1 }" .format (
134
+ repr (e . message ),
135
+ repr (self . cmd )
137
136
)
138
137
)
138
+ return False
139
139
show_backup = self .show_pb (self .backup_dir , 'node' , backup_id )
140
140
self .assertEqual (
141
141
"OK" ,
@@ -147,15 +147,11 @@ def test_fullbackup_after_create_table(self):
147
147
"ERROR: File pg_compression not found in {0}" .format (os .path .join (self .backup_dir , 'node' , backup_id ))
148
148
)
149
149
self .assertTrue (
150
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['.cfm' ]),
150
+ find_by_extensions ([os .path .join (self .backup_dir , 'backups' , ' node' , backup_id )], ['.cfm' ]),
151
151
"ERROR: .cfm files not found in backup dir"
152
152
)
153
- self .assertFalse (
154
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
155
- "ERROR: _ptrack files was found in backup dir"
156
- )
157
153
158
- # @unittest.expectedFailure
154
+ @unittest .expectedFailure
159
155
# @unittest.skip("skip")
160
156
# PGPRO-1018 invalid file size
161
157
def test_fullbackup_after_create_table_stream (self ):
@@ -195,13 +191,9 @@ def test_fullbackup_after_create_table_stream(self):
195
191
find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['.cfm' ]),
196
192
"ERROR: .cfm files not found in backup dir"
197
193
)
198
- self .assertFalse (
199
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
200
- "ERROR: _ptrack files was found in backup dir"
201
- )
202
194
203
195
# --- Section: Incremental from empty tablespace --- #
204
- # @unittest.expectedFailure
196
+ @unittest .expectedFailure
205
197
# @unittest.skip("skip")
206
198
def test_fullbackup_empty_tablespace_ptrack_after_create_table (self ):
207
199
"""
@@ -251,12 +243,8 @@ def test_fullbackup_empty_tablespace_ptrack_after_create_table(self):
251
243
find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['.cfm' ]),
252
244
"ERROR: .cfm files not found in backup dir"
253
245
)
254
- self .assertFalse (
255
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
256
- "ERROR: _ptrack files was found in backup dir"
257
- )
258
246
259
- # @unittest.expectedFailure
247
+ @unittest .expectedFailure
260
248
# @unittest.skip("skip")
261
249
def test_fullbackup_empty_tablespace_ptrack_after_create_table_stream (self ):
262
250
"""
@@ -307,7 +295,7 @@ def test_fullbackup_empty_tablespace_ptrack_after_create_table_stream(self):
307
295
"ERROR: .cfm files not found in backup dir"
308
296
)
309
297
self .assertFalse (
310
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
298
+ find_by_extensions ([os .path .join (self .backup_dir , 'backups' , ' node' , backup_id )], ['_ptrack' ]),
311
299
"ERROR: _ptrack files was found in backup dir"
312
300
)
313
301
@@ -358,13 +346,9 @@ def test_fullbackup_empty_tablespace_page_after_create_table(self):
358
346
"ERROR: File pg_compression not found"
359
347
)
360
348
self .assertTrue (
361
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['.cfm' ]),
349
+ find_by_extensions ([os .path .join (self .backup_dir , 'backups' , ' node' , backup_id )], ['.cfm' ]),
362
350
"ERROR: .cfm files not found in backup dir"
363
351
)
364
- self .assertFalse (
365
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
366
- "ERROR: _ptrack files was found in backup dir"
367
- )
368
352
369
353
# @unittest.expectedFailure
370
354
# @unittest.skip("skip")
@@ -413,16 +397,16 @@ def test_fullbackup_empty_tablespace_page_after_create_table_stream(self):
413
397
"ERROR: File pg_compression not found"
414
398
)
415
399
self .assertTrue (
416
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['.cfm' ]),
400
+ find_by_extensions ([os .path .join (self .backup_dir , 'backups' , ' node' , backup_id )], ['.cfm' ]),
417
401
"ERROR: .cfm files not found in backup dir"
418
402
)
419
403
self .assertFalse (
420
- find_by_extensions ([os .path .join (self .backup_dir , 'node' , backup_id )], ['_ptrack' ]),
404
+ find_by_extensions ([os .path .join (self .backup_dir , 'backups' , ' node' , backup_id )], ['_ptrack' ]),
421
405
"ERROR: _ptrack files was found in backup dir"
422
406
)
423
407
424
408
# --- Section: Incremental from fill tablespace --- #
425
- # @unittest.expectedFailure
409
+ @unittest .expectedFailure
426
410
# @unittest.skip("skip")
427
411
def test_fullbackup_after_create_table_ptrack_after_create_table (self ):
428
412
"""
@@ -480,7 +464,7 @@ def test_fullbackup_after_create_table_ptrack_after_create_table(self):
480
464
)
481
465
)
482
466
483
- # @unittest.expectedFailure
467
+ @unittest .expectedFailure
484
468
# @unittest.skip("skip")
485
469
def test_fullbackup_after_create_table_ptrack_after_create_table_stream (self ):
486
470
"""
@@ -596,6 +580,83 @@ def test_fullbackup_after_create_table_page_after_create_table(self):
596
580
)
597
581
)
598
582
583
+ # @unittest.expectedFailure
584
+ # @unittest.skip("skip")
585
+ def test_multiple_segments (self ):
586
+ """
587
+ Case: Make full backup before created table in the tablespace.
588
+ Make ptrack backup after create table.
589
+ Check: incremental backup will not greater as full
590
+ """
591
+
592
+ self .node .safe_psql (
593
+ "postgres" ,
594
+ "CREATE TABLE {0} TABLESPACE {1} \
595
+ AS SELECT i AS id, MD5(i::text) AS text, \
596
+ MD5(repeat(i::text,10))::tsvector AS tsvector \
597
+ FROM generate_series(0,10050000) i" .format ('t_heap' , tblspace_name )
598
+ )
599
+
600
+ full_result = self .node .safe_psql ("postgres" , "SELECT * FROM t_heap" )
601
+
602
+ try :
603
+ backup_id_full = self .backup_node (self .backup_dir , 'node' , self .node , backup_type = 'full' )
604
+ except ProbackupException as e :
605
+ self .fail (
606
+ "ERROR: Full backup failed.\n {0} \n {1}" .format (
607
+ repr (self .cmd ),
608
+ repr (e .message )
609
+ )
610
+ )
611
+
612
+ self .node .safe_psql (
613
+ "postgres" ,
614
+ 'INSERT INTO {0} \
615
+ SELECT i AS id, MD5(i::text) AS text, \
616
+ MD5(repeat(i::text,10))::tsvector AS tsvector \
617
+ FROM generate_series(0,10050000) i' .format ('t_heap' )
618
+ )
619
+
620
+ page_result = self .node .safe_psql ("postgres" , "SELECT * FROM t_heap" )
621
+
622
+ try :
623
+ backup_id_page = self .backup_node (self .backup_dir , 'node' , self .node , backup_type = 'page' )
624
+ except ProbackupException as e :
625
+ self .fail (
626
+ "ERROR: Incremental backup failed.\n {0} \n {1}" .format (
627
+ repr (self .cmd ),
628
+ repr (e .message )
629
+ )
630
+ )
631
+
632
+ show_backup_full = self .show_pb (self .backup_dir , 'node' , backup_id_full )
633
+ show_backup_page = self .show_pb (self .backup_dir , 'node' , backup_id_page )
634
+ self .assertGreater (
635
+ show_backup_page ["data-bytes" ],
636
+ show_backup_full ["data-bytes" ],
637
+ "ERROR: Size of incremental backup greater as full. \n INFO: {0} >{1}" .format (
638
+ show_backup_page ["data-bytes" ],
639
+ show_backup_full ["data-bytes" ]
640
+ )
641
+ )
642
+
643
+ # CHECK FULL BACKUP
644
+ self .node .stop ()
645
+ self .node .cleanup ()
646
+ shutil .rmtree (self .get_tblspace_path (self .node , tblspace_name ), ignore_errors = True )
647
+ self .restore_node (self .backup_dir , 'node' , self .node , backup_id = backup_id_full , options = ["-j" , "4" ])
648
+ self .node .start ()
649
+ self .assertEqual (full_result , self .node .safe_psql ("postgres" , "SELECT * FROM t_heap" ), 'Lost data after restore' )
650
+
651
+ # CHECK PAGE BACKUP
652
+ self .node .stop ()
653
+ self .node .cleanup ()
654
+ shutil .rmtree (self .get_tblspace_path (self .node , tblspace_name ), ignore_errors = True )
655
+ self .restore_node (self .backup_dir , 'node' , self .node , backup_id = backup_id_page , options = ["-j" , "4" ])
656
+ self .node .start ()
657
+ self .assertEqual (page_result , self .node .safe_psql ("postgres" , "SELECT * FROM t_heap" ), 'Lost data after restore' )
658
+
659
+
599
660
# @unittest.expectedFailure
600
661
# @unittest.skip("skip")
601
662
def test_fullbackup_after_create_table_page_after_create_table_stream (self ):
@@ -655,7 +716,7 @@ def test_fullbackup_after_create_table_page_after_create_table_stream(self):
655
716
)
656
717
657
718
# --- Make backup with not valid data(broken .cfm) --- #
658
- # @unittest.expectedFailure
719
+ @unittest .expectedFailure
659
720
# @unittest.skip("skip")
660
721
def test_delete_random_cfm_file_from_tablespace_dir (self ):
661
722
self .node .safe_psql (
@@ -679,7 +740,7 @@ def test_delete_random_cfm_file_from_tablespace_dir(self):
679
740
self .backup_node ,self .backup_dir , 'node' , self .node , backup_type = 'full'
680
741
)
681
742
682
- # @unittest.expectedFailure
743
+ @unittest .expectedFailure
683
744
# @unittest.skip("skip")
684
745
def test_delete_file_pg_compression_from_tablespace_dir (self ):
685
746
os .remove (find_by_name ([self .get_tblspace_path (self .node , tblspace_name )], ['pg_compression' ])[0 ])
@@ -689,7 +750,7 @@ def test_delete_file_pg_compression_from_tablespace_dir(self):
689
750
self .backup_node ,self .backup_dir , 'node' , self .node , backup_type = 'full'
690
751
)
691
752
692
- # @unittest.expectedFailure
753
+ @unittest .expectedFailure
693
754
# @unittest.skip("skip")
694
755
def test_delete_random_data_file_from_tablespace_dir (self ):
695
756
self .node .safe_psql (
@@ -713,7 +774,7 @@ def test_delete_random_data_file_from_tablespace_dir(self):
713
774
self .backup_node ,self .backup_dir , 'node' , self .node , backup_type = 'full'
714
775
)
715
776
716
- # @unittest.expectedFailure
777
+ @unittest .expectedFailure
717
778
# @unittest.skip("skip")
718
779
def test_broken_random_cfm_file_into_tablespace_dir (self ):
719
780
self .node .safe_psql (
@@ -724,7 +785,7 @@ def test_broken_random_cfm_file_into_tablespace_dir(self):
724
785
FROM generate_series(0,256) i' .format ('t1' , tblspace_name )
725
786
)
726
787
727
- list_cmf = find_by_extensions ([self .get_tblspace_path (self .node ,tblspace_name )],['.cfm' ])
788
+ list_cmf = find_by_extensions ([self .get_tblspace_path (self .node , tblspace_name )],['.cfm' ])
728
789
self .assertTrue (
729
790
list_cmf ,
730
791
"ERROR: .cfm-files not found into tablespace dir"
@@ -737,7 +798,7 @@ def test_broken_random_cfm_file_into_tablespace_dir(self):
737
798
self .backup_node ,self .backup_dir , 'node' , self .node , backup_type = 'full'
738
799
)
739
800
740
- # @unittest.expectedFailure
801
+ @unittest .expectedFailure
741
802
# @unittest.skip("skip")
742
803
def test_broken_random_data_file_into_tablespace_dir (self ):
743
804
self .node .safe_psql (
@@ -761,7 +822,7 @@ def test_broken_random_data_file_into_tablespace_dir(self):
761
822
self .backup_node ,self .backup_dir , 'node' , self .node , backup_type = 'full'
762
823
)
763
824
764
- # @unittest.expectedFailure
825
+ @unittest .expectedFailure
765
826
# @unittest.skip("skip")
766
827
def test_broken_file_pg_compression_into_tablespace_dir (self ):
767
828
@@ -783,8 +844,8 @@ def tearDown(self):
783
844
self .del_test_dir (module_name , self .fname )
784
845
785
846
786
- class CfsBackupEncTest (CfsBackupNoEncTest ):
787
- # --- Begin --- #
788
- def setUp (self ):
789
- os .environ ["PG_CIPHER_KEY" ] = "super_secret_cipher_key"
790
- super (CfsBackupEncTest , self ).setUp ()
847
+ # class CfsBackupEncTest(CfsBackupNoEncTest):
848
+ # # --- Begin --- #
849
+ # def setUp(self):
850
+ # os.environ["PG_CIPHER_KEY"] = "super_secret_cipher_key"
851
+ # super(CfsBackupEncTest, self).setUp()
0 commit comments