Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 454eeac

Browse files
committed
tests: added validate.ValidateTest.test_partial_validate_exclude and validate.ValidateTest.test_partial_validate_include
1 parent dc76fb1 commit 454eeac

File tree

2 files changed

+199
-43
lines changed

2 files changed

+199
-43
lines changed

tests/restore.py

-43
Original file line numberDiff line numberDiff line change
@@ -2360,49 +2360,6 @@ def test_lost_non_data_file(self):
23602360
# Clean after yourself
23612361
self.del_test_dir(module_name, fname)
23622362

2363-
@unittest.skip("skip")
2364-
def test_restore_specific_database_proof_of_concept(self):
2365-
""""""
2366-
fname = self.id().split('.')[3]
2367-
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
2368-
node = self.make_simple_node(
2369-
base_dir=os.path.join(module_name, fname, 'node'),
2370-
initdb_params=['--data-checksums'],
2371-
pg_options={
2372-
'autovacuum': 'off',
2373-
'shared_buffers': '512MB'})
2374-
2375-
self.init_pb(backup_dir)
2376-
self.add_instance(backup_dir, 'node', node)
2377-
self.set_archiving(backup_dir, 'node', node)
2378-
node.slow_start()
2379-
2380-
node.pgbench_init(scale=200)
2381-
2382-
exit(1)
2383-
2384-
# FULL backup
2385-
backup_id = self.backup_node(backup_dir, 'node', node)
2386-
2387-
pgbench = node.pgbench(
2388-
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
2389-
options=['-T', '100', '-c8', '-j2', '--no-vacuum'])
2390-
2391-
pgbench.wait()
2392-
pgbench.stdout.close()
2393-
2394-
node_restored = self.make_simple_node(
2395-
base_dir=os.path.join(module_name, fname, 'node_restored'))
2396-
node_restored.cleanup()
2397-
2398-
self.restore_node(backup_dir, 'node', node_restored)
2399-
2400-
node_restored.append_conf(
2401-
"postgresql.auto.conf", "port = {0}".format(node_restored.port))
2402-
2403-
# Clean after yourself
2404-
self.del_test_dir(module_name, fname)
2405-
24062363
def test_partial_restore_exclude(self):
24072364
""""""
24082365
fname = self.id().split('.')[3]

tests/validate.py

+199
Original file line numberDiff line numberDiff line change
@@ -3443,6 +3443,9 @@ def test_validate_corrupt_tablespace_map(self):
34433443
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
34443444
repr(e.message), self.cmd))
34453445

3446+
# Clean after yourself
3447+
self.del_test_dir(module_name, fname)
3448+
34463449
# @unittest.expectedFailure
34473450
# @unittest.skip("skip")
34483451
def test_validate_target_lsn(self):
@@ -3497,6 +3500,9 @@ def test_validate_target_lsn(self):
34973500
'--recovery-target-timeline=2',
34983501
'--recovery-target-lsn={0}'.format(target_lsn)])
34993502

3503+
# Clean after yourself
3504+
self.del_test_dir(module_name, fname)
3505+
35003506
# @unittest.expectedFailure
35013507
# @unittest.skip("skip")
35023508
def test_recovery_target_time_backup_victim(self):
@@ -3555,6 +3561,9 @@ def test_recovery_target_time_backup_victim(self):
35553561
backup_dir, 'node',
35563562
options=['--recovery-target-time={0}'.format(target_time)])
35573563

3564+
# Clean after yourself
3565+
self.del_test_dir(module_name, fname)
3566+
35583567
# @unittest.expectedFailure
35593568
# @unittest.skip("skip")
35603569
def test_recovery_target_lsn_backup_victim(self):
@@ -3611,6 +3620,196 @@ def test_recovery_target_lsn_backup_victim(self):
36113620
backup_dir, 'node',
36123621
options=['--recovery-target-lsn={0}'.format(target_lsn)])
36133622

3623+
# Clean after yourself
3624+
self.del_test_dir(module_name, fname)
3625+
3626+
def test_partial_validate_empty_and_mangled_database_map(self):
3627+
"""
3628+
"""
3629+
fname = self.id().split('.')[3]
3630+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3631+
node = self.make_simple_node(
3632+
base_dir=os.path.join(module_name, fname, 'node'),
3633+
set_replication=True,
3634+
initdb_params=['--data-checksums'])
3635+
3636+
self.init_pb(backup_dir)
3637+
self.add_instance(backup_dir, 'node', node)
3638+
3639+
node.slow_start()
3640+
3641+
# create databases
3642+
for i in range(1, 10, 1):
3643+
node.safe_psql(
3644+
'postgres',
3645+
'CREATE database db{0}'.format(i))
3646+
3647+
# FULL backup with database_map
3648+
backup_id = self.backup_node(
3649+
backup_dir, 'node', node, options=['--stream'])
3650+
pgdata = self.pgdata_content(node.data_dir)
3651+
3652+
# truncate database_map
3653+
path = os.path.join(
3654+
backup_dir, 'backups', 'node',
3655+
backup_id, 'database', 'database_map')
3656+
with open(path, "w") as f:
3657+
f.close()
3658+
3659+
try:
3660+
self.validate_pb(
3661+
backup_dir, 'node',
3662+
options=["--db-include=db1", '--no-validate'])
3663+
self.assertEqual(
3664+
1, 0,
3665+
"Expecting Error because database_map is empty.\n "
3666+
"Output: {0} \n CMD: {1}".format(
3667+
self.output, self.cmd))
3668+
except ProbackupException as e:
3669+
self.assertIn(
3670+
"WARNING: Backup {0} data files are corrupted".format(
3671+
backup_id), e.message,
3672+
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
3673+
repr(e.message), self.cmd))
3674+
3675+
# mangle database_map
3676+
with open(path, "w") as f:
3677+
f.write("42")
3678+
f.close()
3679+
3680+
try:
3681+
self.validate_pb(
3682+
backup_dir, 'node',
3683+
options=["--db-include=db1", '--no-validate'])
3684+
self.assertEqual(
3685+
1, 0,
3686+
"Expecting Error because database_map is empty.\n "
3687+
"Output: {0} \n CMD: {1}".format(
3688+
self.output, self.cmd))
3689+
except ProbackupException as e:
3690+
self.assertIn(
3691+
"WARNING: Backup {0} data files are corrupted".format(
3692+
backup_id), e.message,
3693+
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
3694+
repr(e.message), self.cmd))
3695+
3696+
# Clean after yourself
3697+
self.del_test_dir(module_name, fname)
3698+
3699+
def test_partial_validate_exclude(self):
3700+
""""""
3701+
fname = self.id().split('.')[3]
3702+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3703+
node = self.make_simple_node(
3704+
base_dir=os.path.join(module_name, fname, 'node'),
3705+
initdb_params=['--data-checksums'])
3706+
3707+
self.init_pb(backup_dir)
3708+
self.add_instance(backup_dir, 'node', node)
3709+
self.set_archiving(backup_dir, 'node', node)
3710+
node.slow_start()
3711+
3712+
for i in range(1, 10, 1):
3713+
node.safe_psql(
3714+
'postgres',
3715+
'CREATE database db{0}'.format(i))
3716+
3717+
# FULL backup
3718+
backup_id = self.backup_node(backup_dir, 'node', node)
3719+
3720+
try:
3721+
self.validate_pb(
3722+
backup_dir, 'node',
3723+
options=[
3724+
"--db-include=db1",
3725+
"--db-exclude=db2"])
3726+
self.assertEqual(
3727+
1, 0,
3728+
"Expecting Error because of 'db-exclude' and 'db-include'.\n "
3729+
"Output: {0} \n CMD: {1}".format(
3730+
self.output, self.cmd))
3731+
except ProbackupException as e:
3732+
self.assertIn(
3733+
"ERROR: You cannot specify '--db-include' "
3734+
"and '--db-exclude' together", e.message,
3735+
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
3736+
repr(e.message), self.cmd))
3737+
3738+
output = self.validate_pb(
3739+
backup_dir, 'node',
3740+
options=[
3741+
"--db-exclude=db1",
3742+
"--db-exclude=db5",
3743+
"--log-level-console=verbose"])
3744+
3745+
self.assertIn(
3746+
"VERBOSE: Skip file validation due to partial restore", output)
3747+
3748+
# Clean after yourself
3749+
self.del_test_dir(module_name, fname)
3750+
3751+
def test_partial_validate_include(self):
3752+
"""
3753+
"""
3754+
fname = self.id().split('.')[3]
3755+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3756+
node = self.make_simple_node(
3757+
base_dir=os.path.join(module_name, fname, 'node'),
3758+
initdb_params=['--data-checksums'])
3759+
3760+
self.init_pb(backup_dir)
3761+
self.add_instance(backup_dir, 'node', node)
3762+
self.set_archiving(backup_dir, 'node', node)
3763+
node.slow_start()
3764+
3765+
for i in range(1, 10, 1):
3766+
node.safe_psql(
3767+
'postgres',
3768+
'CREATE database db{0}'.format(i))
3769+
3770+
# FULL backup
3771+
backup_id = self.backup_node(backup_dir, 'node', node)
3772+
3773+
try:
3774+
self.validate_pb(
3775+
backup_dir, 'node',
3776+
options=[
3777+
"--db-include=db1",
3778+
"--db-exclude=db2"])
3779+
self.assertEqual(
3780+
1, 0,
3781+
"Expecting Error because of 'db-exclude' and 'db-include'.\n "
3782+
"Output: {0} \n CMD: {1}".format(
3783+
self.output, self.cmd))
3784+
except ProbackupException as e:
3785+
self.assertIn(
3786+
"ERROR: You cannot specify '--db-include' "
3787+
"and '--db-exclude' together", e.message,
3788+
'\n Unexpected Error Message: {0}\n CMD: {1}'.format(
3789+
repr(e.message), self.cmd))
3790+
3791+
output = self.validate_pb(
3792+
backup_dir, 'node',
3793+
options=[
3794+
"--db-include=db1",
3795+
"--db-include=db5",
3796+
"--db-include=postgres",
3797+
"--log-level-console=verbose"])
3798+
3799+
self.assertIn(
3800+
"VERBOSE: Skip file validation due to partial restore", output)
3801+
3802+
output = self.validate_pb(
3803+
backup_dir, 'node',
3804+
options=[
3805+
"--log-level-console=verbose"])
3806+
3807+
self.assertNotIn(
3808+
"VERBOSE: Skip file validation due to partial restore", output)
3809+
3810+
# Clean after yourself
3811+
self.del_test_dir(module_name, fname)
3812+
36143813
# validate empty backup list
36153814
# page from future during validate
36163815
# page from future during backup

0 commit comments

Comments
 (0)