diff --git a/tests/helpers/ptrack_helpers.py b/tests/helpers/ptrack_helpers.py index 23796130..6a05787c 100644 --- a/tests/helpers/ptrack_helpers.py +++ b/tests/helpers/ptrack_helpers.py @@ -1432,6 +1432,7 @@ class GDBobj(ProbackupTest): print(repr(line)) if line == '^done\n' or line.startswith('*stopped'): break - if running and line.startswith('*running'): + if running and (line.startswith('*running') or line.startswith('^running')): +# if running and line.startswith('*running'): break return output diff --git a/tests/locking.py b/tests/locking.py index ae5431a8..ebe32496 100644 --- a/tests/locking.py +++ b/tests/locking.py @@ -12,7 +12,11 @@ class LockingTest(ProbackupTest, unittest.TestCase): # @unittest.skip("skip") # @unittest.expectedFailure def test_locking_simple_1(self): - """""" + """ + make node, take full backup, stop it in the middle + run validate, expect it to successfully executed, + concurrect RUNNING backup with pid file and active process is legal + """ fname = self.id().split('.')[3] node = self.make_simple_node( base_dir=os.path.join(module_name, fname, 'node'), @@ -36,6 +40,12 @@ class LockingTest(ProbackupTest, unittest.TestCase): if gdb.continue_execution_until_break(20) != 'breakpoint-hit': self.AssertTrue(False, 'Failed to hit breakpoint') + self.assertEqual( + 'OK', self.show_pb(backup_dir, 'node')[0]['status']) + + self.assertEqual( + 'RUNNING', self.show_pb(backup_dir, 'node')[1]['status']) + self.validate_pb(backup_dir) self.assertEqual( @@ -48,7 +58,13 @@ class LockingTest(ProbackupTest, unittest.TestCase): self.del_test_dir(module_name, fname) def test_locking_simple_2(self): - """""" + """ + make node, take full backup, stop it in the middle, + kill process so no cleanup is done - pid file is in place, + run validate, expect it to not successfully executed, + RUNNING backup with pid file AND without active pid is legal, + but his status must be changed to ERROR and pid file is deleted + """ fname = self.id().split('.')[3] node = self.make_simple_node( base_dir=os.path.join(module_name, fname, 'node'), @@ -72,7 +88,78 @@ class LockingTest(ProbackupTest, unittest.TestCase): if gdb.continue_execution_until_break(20) != 'breakpoint-hit': self.AssertTrue(False, 'Failed to hit breakpoint') + gdb._execute('signal SIGKILL') + gdb.continue_execution_until_running() + + self.assertEqual( + 'OK', self.show_pb(backup_dir, 'node')[0]['status']) + + self.assertEqual( + 'RUNNING', self.show_pb(backup_dir, 'node')[1]['status']) + self.validate_pb(backup_dir) + self.assertEqual( + 'OK', self.show_pb(backup_dir, 'node')[0]['status']) + + self.assertEqual( + 'ERROR', self.show_pb(backup_dir, 'node')[1]['status']) + + # Clean after yourself + self.del_test_dir(module_name, fname) + + def test_locking_simple_3(self): + """ + make node, take full backup, stop it in the middle, + terminate process, delete pid file, + run validate, expect it to not successfully executed, + RUNNING backup without pid file AND without active pid is legal, + his status must be changed to ERROR + """ + fname = self.id().split('.')[3] + node = self.make_simple_node( + base_dir=os.path.join(module_name, fname, 'node'), + initdb_params=['--data-checksums'], + pg_options={'wal_level': 'replica'}) + + backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup') + self.init_pb(backup_dir) + self.add_instance(backup_dir, 'node', node) + self.set_archiving(backup_dir, 'node', node) + node.slow_start() + + self.backup_node(backup_dir, 'node', node) + + gdb = self.backup_node( + backup_dir, 'node', node, gdb=True) + + gdb.set_breakpoint('copy_file') + gdb.run_until_break() + + if gdb.continue_execution_until_break(20) != 'breakpoint-hit': + self.AssertTrue(False, 'Failed to hit breakpoint') + + gdb._execute('signal SIGKILL') + gdb.continue_execution_until_running() + + self.assertEqual( + 'OK', self.show_pb(backup_dir, 'node')[0]['status']) + + self.assertEqual( + 'RUNNING', self.show_pb(backup_dir, 'node')[1]['status']) + + backup_id = self.show_pb(backup_dir, 'node')[1]['id'] + + os.remove( + os.path.join(backup_dir, 'backups', 'node', backup_id, 'backup.pid')) + + self.validate_pb(backup_dir) + + self.assertEqual( + 'OK', self.show_pb(backup_dir, 'node')[0]['status']) + + self.assertEqual( + 'ERROR', self.show_pb(backup_dir, 'node')[1]['status']) + # Clean after yourself self.del_test_dir(module_name, fname) \ No newline at end of file