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