Skip to content

Commit d9716e0

Browse files
committed
tests: added test_locking_restore_locked() and test_locking_concurrent_vaidate_and_backup()
1 parent 2329af3 commit d9716e0

File tree

2 files changed

+94
-2
lines changed

2 files changed

+94
-2
lines changed

tests/helpers/ptrack_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ def show_pb(
806806

807807
def validate_pb(
808808
self, backup_dir, instance=None,
809-
backup_id=None, options=[], old_binary=False
809+
backup_id=None, options=[], old_binary=False, gdb=False
810810
):
811811

812812
cmd_list = [
@@ -818,7 +818,7 @@ def validate_pb(
818818
if backup_id:
819819
cmd_list += ['-i', backup_id]
820820

821-
return self.run_pb(cmd_list + options, old_binary=old_binary)
821+
return self.run_pb(cmd_list + options, old_binary=old_binary, gdb=gdb)
822822

823823
def delete_pb(
824824
self, backup_dir, instance,

tests/locking.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,95 @@ def test_locking_running_3(self):
305305

306306
# Clean after yourself
307307
self.del_test_dir(module_name, fname)
308+
309+
def test_locking_restore_locked(self):
310+
"""
311+
make node, take full backup, take two page backups,
312+
launch validate on PAGE1 and stop it in the middle,
313+
launch restore of PAGE2.
314+
Expect restore to fail because validation of
315+
intermediate backup is impossible
316+
"""
317+
fname = self.id().split('.')[3]
318+
node = self.make_simple_node(
319+
base_dir=os.path.join(module_name, fname, 'node'),
320+
initdb_params=['--data-checksums'],
321+
pg_options={'wal_level': 'replica'})
322+
323+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
324+
self.init_pb(backup_dir)
325+
self.add_instance(backup_dir, 'node', node)
326+
self.set_archiving(backup_dir, 'node', node)
327+
node.slow_start()
328+
329+
# FULL
330+
self.backup_node(backup_dir, 'node', node)
331+
332+
# PAGE1
333+
backup_id = self.backup_node(backup_dir, 'node', node, backup_type='page')
334+
335+
# PAGE2
336+
self.backup_node(backup_dir, 'node', node, backup_type='page')
337+
338+
gdb = self.validate_pb(
339+
backup_dir, 'node', backup_id=backup_id, gdb=True)
340+
341+
gdb.set_breakpoint('pgBackupValidate')
342+
gdb.run_until_break()
343+
344+
node.cleanup()
345+
346+
try:
347+
self.restore_node(backup_dir, 'node', node)
348+
self.assertEqual(
349+
1, 0,
350+
"Expecting Error because restore without whole chain validation "
351+
"is prohibited unless --no-validate provided.\n "
352+
"Output: {0} \n CMD: {1}".format(
353+
repr(self.output), self.cmd))
354+
except ProbackupException as e:
355+
self.assertTrue(
356+
"Insert expected error message".format(
357+
backup_id) in e.message,
358+
e.message,
359+
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
360+
repr(e.message), self.cmd))
361+
362+
# Clean after yourself
363+
self.del_test_dir(module_name, fname)
364+
365+
def test_locking_concurrent_vaidate_and_backup(self):
366+
"""
367+
make node, take full backup, launch validate
368+
and stop it in the middle, take page backup.
369+
Expect PAGE backup to be successfully executed
370+
"""
371+
fname = self.id().split('.')[3]
372+
node = self.make_simple_node(
373+
base_dir=os.path.join(module_name, fname, 'node'),
374+
initdb_params=['--data-checksums'],
375+
pg_options={'wal_level': 'replica'})
376+
377+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
378+
self.init_pb(backup_dir)
379+
self.add_instance(backup_dir, 'node', node)
380+
self.set_archiving(backup_dir, 'node', node)
381+
node.slow_start()
382+
383+
# FULL
384+
self.backup_node(backup_dir, 'node', node)
385+
386+
# PAGE2
387+
backup_id = self.backup_node(backup_dir, 'node', node, backup_type='page')
388+
389+
gdb = self.validate_pb(
390+
backup_dir, 'node', backup_id=backup_id, gdb=True)
391+
392+
gdb.set_breakpoint('pgBackupValidate')
393+
gdb.run_until_break()
394+
395+
# This PAGE backup is expected to be successfull
396+
self.backup_node(backup_dir, 'node', node, backup_type='page')
397+
398+
# Clean after yourself
399+
self.del_test_dir(module_name, fname)

0 commit comments

Comments
 (0)