pg_probackup
117 строк · 4.3 Кб
1import os
2import unittest
3import random
4import shutil
5
6from .helpers.cfs_helpers import find_by_extensions, find_by_name, find_by_pattern, corrupt_file
7from .helpers.ptrack_helpers import ProbackupTest, ProbackupException
8
9
10class CfsCatchupNoEncTest(ProbackupTest, unittest.TestCase):
11
12@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
13def test_full_catchup_with_tablespace(self):
14"""
15Test tablespace transfers
16"""
17# preparation
18src_pg = self.make_simple_node(
19base_dir = os.path.join(self.module_name, self.fname, 'src'),
20set_replication = True
21)
22src_pg.slow_start()
23tblspace1_old_path = self.get_tblspace_path(src_pg, 'tblspace1_old')
24self.create_tblspace_in_node(src_pg, 'tblspace1', tblspc_path = tblspace1_old_path, cfs=True)
25src_pg.safe_psql(
26"postgres",
27"CREATE TABLE ultimate_question TABLESPACE tblspace1 AS SELECT 42 AS answer")
28src_query_result = src_pg.table_checksum("ultimate_question")
29src_pg.safe_psql(
30"postgres",
31"CHECKPOINT")
32
33# do full catchup with tablespace mapping
34dst_pg = self.make_empty_node(os.path.join(self.module_name, self.fname, 'dst'))
35tblspace1_new_path = self.get_tblspace_path(dst_pg, 'tblspace1_new')
36self.catchup_node(
37backup_mode = 'FULL',
38source_pgdata = src_pg.data_dir,
39destination_node = dst_pg,
40options = [
41'-d', 'postgres',
42'-p', str(src_pg.port),
43'--stream',
44'-T', '{0}={1}'.format(tblspace1_old_path, tblspace1_new_path)
45]
46)
47
48# 1st check: compare data directories
49self.compare_pgdata(
50self.pgdata_content(src_pg.data_dir),
51self.pgdata_content(dst_pg.data_dir)
52)
53
54# check cfm size
55cfms = find_by_extensions([os.path.join(dst_pg.data_dir)], ['.cfm'])
56self.assertTrue(cfms, "ERROR: .cfm files not found in backup dir")
57for cfm in cfms:
58size = os.stat(cfm).st_size
59self.assertLessEqual(size, 4096,
60"ERROR: {0} is not truncated (has size {1} > 4096)".format(
61cfm, size
62))
63
64# make changes in master tablespace
65src_pg.safe_psql(
66"postgres",
67"UPDATE ultimate_question SET answer = -1")
68src_pg.safe_psql(
69"postgres",
70"CHECKPOINT")
71
72# run&recover catchup'ed instance
73dst_options = {}
74dst_options['port'] = str(dst_pg.port)
75self.set_auto_conf(dst_pg, dst_options)
76dst_pg.slow_start()
77
78# 2nd check: run verification query
79dst_query_result = dst_pg.table_checksum("ultimate_question")
80self.assertEqual(src_query_result, dst_query_result, 'Different answer from copy')
81
82# and now delta backup
83dst_pg.stop()
84
85self.catchup_node(
86backup_mode = 'DELTA',
87source_pgdata = src_pg.data_dir,
88destination_node = dst_pg,
89options = [
90'-d', 'postgres',
91'-p', str(src_pg.port),
92'--stream',
93'-T', '{0}={1}'.format(tblspace1_old_path, tblspace1_new_path)
94]
95)
96
97# check cfm size again
98cfms = find_by_extensions([os.path.join(dst_pg.data_dir)], ['.cfm'])
99self.assertTrue(cfms, "ERROR: .cfm files not found in backup dir")
100for cfm in cfms:
101size = os.stat(cfm).st_size
102self.assertLessEqual(size, 4096,
103"ERROR: {0} is not truncated (has size {1} > 4096)".format(
104cfm, size
105))
106
107# run&recover catchup'ed instance
108dst_options = {}
109dst_options['port'] = str(dst_pg.port)
110self.set_auto_conf(dst_pg, dst_options)
111dst_pg.slow_start()
112
113
114# 3rd check: run verification query
115src_query_result = src_pg.table_checksum("ultimate_question")
116dst_query_result = dst_pg.table_checksum("ultimate_question")
117self.assertEqual(src_query_result, dst_query_result, 'Different answer from copy')
118