2019-01-31 11:03:02 +02:00
|
|
|
import unittest
|
|
|
|
import os
|
|
|
|
from time import sleep
|
|
|
|
from .helpers.ptrack_helpers import ProbackupTest, ProbackupException
|
|
|
|
|
|
|
|
|
|
|
|
module_name = 'locking'
|
|
|
|
|
|
|
|
|
|
|
|
class LockingTest(ProbackupTest, unittest.TestCase):
|
|
|
|
|
|
|
|
# @unittest.skip("skip")
|
|
|
|
# @unittest.expectedFailure
|
2019-02-16 14:29:59 +02:00
|
|
|
def test_locking_running_1(self):
|
2019-02-18 15:55:46 +02:00
|
|
|
"""
|
2019-02-16 14:26:37 +02:00
|
|
|
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
|
|
|
|
"""
|
2019-01-31 11:03:02 +02:00
|
|
|
fname = self.id().split('.')[3]
|
|
|
|
node = self.make_simple_node(
|
|
|
|
base_dir=os.path.join(module_name, fname, 'node'),
|
|
|
|
initdb_params=['--data-checksums'],
|
2019-01-31 15:31:11 +02:00
|
|
|
pg_options={'wal_level': 'replica'})
|
|
|
|
|
2019-01-31 11:03:02 +02:00
|
|
|
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)
|
|
|
|
|
2019-01-31 15:31:11 +02:00
|
|
|
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')
|
|
|
|
|
2019-02-16 14:26:37 +02:00
|
|
|
self.assertEqual(
|
|
|
|
'OK', self.show_pb(backup_dir, 'node')[0]['status'])
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
'RUNNING', self.show_pb(backup_dir, 'node')[1]['status'])
|
|
|
|
|
2019-02-18 15:55:46 +02:00
|
|
|
self.validate_pb(backup_dir, options=['--log-level-file=VERBOSE'])
|
2019-01-31 17:44:26 +02:00
|
|
|
|
2019-01-31 15:31:11 +02:00
|
|
|
self.assertEqual(
|
|
|
|
'OK', self.show_pb(backup_dir, 'node')[0]['status'])
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
'ERROR', self.show_pb(backup_dir, 'node')[1]['status'])
|
|
|
|
|
2019-01-31 17:57:28 +02:00
|
|
|
# Clean after yourself
|
|
|
|
self.del_test_dir(module_name, fname)
|
|
|
|
|
2019-02-16 14:29:59 +02:00
|
|
|
def test_locking_running_2(self):
|
2019-02-18 15:55:46 +02:00
|
|
|
"""
|
2019-02-16 14:26:37 +02:00
|
|
|
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
|
|
|
|
"""
|
2019-01-31 17:57:28 +02:00
|
|
|
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')
|
|
|
|
|
2019-02-16 14:26:37 +02:00
|
|
|
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'])
|
|
|
|
|
2019-02-16 14:28:22 +02:00
|
|
|
try:
|
|
|
|
self.validate_pb(backup_dir)
|
|
|
|
except:
|
|
|
|
pass
|
2019-01-31 17:57:28 +02:00
|
|
|
|
2019-02-16 14:26:37 +02:00
|
|
|
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)
|
|
|
|
|
2019-02-16 14:29:59 +02:00
|
|
|
def test_locking_running_3(self):
|
2019-02-18 15:55:46 +02:00
|
|
|
"""
|
2019-02-16 14:26:37 +02:00
|
|
|
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'))
|
|
|
|
|
2019-02-16 14:28:22 +02:00
|
|
|
try:
|
|
|
|
self.validate_pb(backup_dir)
|
|
|
|
except:
|
|
|
|
pass
|
2019-02-16 14:26:37 +02:00
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
'OK', self.show_pb(backup_dir, 'node')[0]['status'])
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
'ERROR', self.show_pb(backup_dir, 'node')[1]['status'])
|
|
|
|
|
2019-01-31 11:03:02 +02:00
|
|
|
# Clean after yourself
|
2019-02-18 15:55:46 +02:00
|
|
|
self.del_test_dir(module_name, fname)
|