Skip to content

Commit 1e1daa0

Browse files
committed
tests: added tests.external.ExternalTest.test_smart_restore_externals
1 parent c9c5559 commit 1e1daa0

File tree

3 files changed

+87
-21
lines changed

3 files changed

+87
-21
lines changed

Diff for: tests/external.py

+80-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def test_external_simple(self):
3838

3939
# take FULL backup with external directory pointing to a file
4040
file_path = os.path.join(core_dir, 'file')
41-
open(file_path,"w+")
41+
open(file_path, "w+")
4242

4343
try:
4444
self.backup_node(
@@ -2284,3 +2284,82 @@ def test_merge_external_dir_string_order(self):
22842284

22852285
# Clean after yourself
22862286
self.del_test_dir(module_name, fname)
2287+
2288+
# @unittest.skip("skip")
2289+
def test_smart_restore_externals(self):
2290+
"""
2291+
make node, create database, take full backup with externals,
2292+
take incremental backup without externals and restore it,
2293+
make sure that files from externals are not copied during restore
2294+
https://github.com/postgrespro/pg_probackup/issues/63
2295+
"""
2296+
fname = self.id().split('.')[3]
2297+
node = self.make_simple_node(
2298+
base_dir=os.path.join(module_name, fname, 'node'),
2299+
set_replication=True,
2300+
initdb_params=['--data-checksums'])
2301+
2302+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
2303+
self.init_pb(backup_dir)
2304+
self.add_instance(backup_dir, 'node', node)
2305+
self.set_archiving(backup_dir, 'node', node)
2306+
node.slow_start()
2307+
2308+
# fill external directories with data
2309+
tmp_id = self.backup_node(backup_dir, 'node', node)
2310+
2311+
external_dir_1 = self.get_tblspace_path(node, 'external_dir_1')
2312+
external_dir_2 = self.get_tblspace_path(node, 'external_dir_2')
2313+
2314+
self.restore_node(
2315+
backup_dir, 'node', node, backup_id=tmp_id,
2316+
data_dir=external_dir_1, options=["-j", "4"])
2317+
2318+
self.restore_node(
2319+
backup_dir, 'node', node, backup_id=tmp_id,
2320+
data_dir=external_dir_2, options=["-j", "4"])
2321+
2322+
self.delete_pb(backup_dir, 'node', backup_id=tmp_id)
2323+
2324+
# create database
2325+
node.safe_psql(
2326+
"postgres",
2327+
"CREATE DATABASE testdb")
2328+
2329+
# take FULL backup
2330+
full_id = self.backup_node(backup_dir, 'node', node)
2331+
2332+
# drop database
2333+
node.safe_psql(
2334+
"postgres",
2335+
"DROP DATABASE testdb")
2336+
2337+
# take PAGE backup
2338+
page_id = self.backup_node(
2339+
backup_dir, 'node', node, backup_type='page')
2340+
2341+
# restore PAGE backup
2342+
node.cleanup()
2343+
self.restore_node(
2344+
backup_dir, 'node', node, backup_id=page_id,
2345+
options=['--no-validate', '--log-level-file=VERBOSE'])
2346+
2347+
logfile = os.path.join(backup_dir, 'log', 'pg_probackup.log')
2348+
with open(logfile, 'r') as f:
2349+
logfile_content = f.read()
2350+
2351+
# get delta between FULL and PAGE filelists
2352+
filelist_full = self.get_backup_filelist(
2353+
backup_dir, 'node', full_id)
2354+
2355+
filelist_page = self.get_backup_filelist(
2356+
backup_dir, 'node', page_id)
2357+
2358+
filelist_diff = self.get_backup_filelist_diff(
2359+
filelist_full, filelist_page)
2360+
2361+
for file in filelist_diff:
2362+
self.assertNotIn(file, logfile_content)
2363+
2364+
# Clean after yourself
2365+
self.del_test_dir(module_name, fname)

Diff for: tests/restore.py

-3
Original file line numberDiff line numberDiff line change
@@ -2168,6 +2168,3 @@ def test_smart_restore(self):
21682168

21692169
# Clean after yourself
21702170
self.del_test_dir(module_name, fname)
2171-
2172-
2173-
# smart restore of external dirs

Diff for: tests/retention.py

+7-17
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_retention_redundancy_1(self):
6767
# Clean after yourself
6868
self.del_test_dir(module_name, fname)
6969

70-
#@unittest.skip("skip")
70+
# @unittest.skip("skip")
7171
def test_retention_window_2(self):
7272
"""purge backups using window-based retention policy"""
7373
fname = self.id().split('.')[3]
@@ -120,7 +120,7 @@ def test_retention_window_2(self):
120120
# Clean after yourself
121121
self.del_test_dir(module_name, fname)
122122

123-
#@unittest.skip("skip")
123+
# @unittest.skip("skip")
124124
def test_retention_window_3(self):
125125
"""purge all backups using window-based retention policy"""
126126
fname = self.id().split('.')[3]
@@ -134,8 +134,7 @@ def test_retention_window_3(self):
134134
self.set_archiving(backup_dir, 'node', node)
135135
node.slow_start()
136136

137-
138-
# Take FULL BACKUP
137+
# take FULL BACKUP
139138
backup_id_1 = self.backup_node(backup_dir, 'node', node)
140139

141140
# Take second FULL BACKUP
@@ -144,7 +143,6 @@ def test_retention_window_3(self):
144143
# Take third FULL BACKUP
145144
backup_id_3 = self.backup_node(backup_dir, 'node', node)
146145

147-
148146
backups = os.path.join(backup_dir, 'backups', 'node')
149147
for backup in os.listdir(backups):
150148
if backup == 'pg_probackup.conf':
@@ -183,8 +181,7 @@ def test_retention_window_4(self):
183181
self.set_archiving(backup_dir, 'node', node)
184182
node.slow_start()
185183

186-
187-
# Take FULL BACKUPs
184+
# take FULL BACKUPs
188185
backup_id_1 = self.backup_node(backup_dir, 'node', node)
189186

190187
backup_id_2 = self.backup_node(backup_dir, 'node', node)
@@ -245,9 +242,7 @@ def test_window_expire_interleaved_incremental_chains(self):
245242
self.set_archiving(backup_dir, 'node', node)
246243
node.slow_start()
247244

248-
249-
# Take FULL BACKUPs
250-
245+
# take FULL BACKUPs
251246
backup_id_a = self.backup_node(backup_dir, 'node', node)
252247
backup_id_b = self.backup_node(backup_dir, 'node', node)
253248

@@ -334,7 +329,6 @@ def test_window_expire_interleaved_incremental_chains(self):
334329
conf.write("recovery_time='{:%Y-%m-%d %H:%M:%S}'\n".format(
335330
datetime.now() - timedelta(days=3)))
336331

337-
338332
self.delete_expired(
339333
backup_dir, 'node',
340334
options=['--retention-window=1', '--expired'])
@@ -361,8 +355,7 @@ def test_redundancy_expire_interleaved_incremental_chains(self):
361355
self.set_archiving(backup_dir, 'node', node)
362356
node.slow_start()
363357

364-
365-
# Take FULL BACKUPs
358+
# take FULL BACKUPs
366359
backup_id_a = self.backup_node(backup_dir, 'node', node)
367360
backup_id_b = self.backup_node(backup_dir, 'node', node)
368361

@@ -710,7 +703,6 @@ def test_window_merge_interleaved_incremental_chains_1(self):
710703
backup_dir, 'node',
711704
options=['--retention-window=1', '--expired', '--merge-expired'])
712705

713-
714706
self.assertEqual(len(self.show_pb(backup_dir, 'node')), 2)
715707

716708
self.assertEqual(
@@ -1004,7 +996,6 @@ def test_window_merge_multiple_descendants(self):
1004996
"INFO: Delete: {0}".format(
1005997
page_id_a1), output)
1006998

1007-
1008999
self.assertEqual(
10091000
self.show_pb(backup_dir, 'node')[2]['id'],
10101001
page_id_b3)
@@ -1119,7 +1110,6 @@ def test_window_chains(self):
11191110
# Clean after yourself
11201111
self.del_test_dir(module_name, fname)
11211112

1122-
11231113
# @unittest.skip("skip")
11241114
def test_window_chains_1(self):
11251115
"""
@@ -1245,4 +1235,4 @@ def test_window_error_backups(self):
12451235
backup_dir, 'node', node, backup_type='page')
12461236

12471237
# Change FULLb backup status to ERROR
1248-
#self.change_backup_status(backup_dir, 'node', backup_id_b, 'ERROR')
1238+
# self.change_backup_status(backup_dir, 'node', backup_id_b, 'ERROR')

0 commit comments

Comments
 (0)