8000 Add tests for --start-time option on the one and few nodes · postgrespro/pg_probackup@1b75b4e · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 1b75b4e

Browse files
committed
Add tests for --start-time option on the one and few nodes
1 parent c81c54b commit 1b75b4e

File tree

2 files changed

+374
-2
lines changed

2 files changed

+374
-2
lines changed

tests/backup.py

Lines changed: 370 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import unittest
22
import os
3-
from time import sleep
3+
from time import sleep, time
44
from .helpers.ptrack_helpers import ProbackupTest, ProbackupException
55
import shutil
66
from distutils.dir_util import copy_tree
@@ -3400,3 +3400,372 @@ def test_pg_stop_backup_missing_permissions(self):
34003400

34013401
# Clean after yourself
34023402
self.del_test_dir(module_name, fname)
3403+
3404+
# @unittest.skip("skip")
3405+
def test_start_time(self):
3406+
3407+
fname = self.id().split('.')[3]
3408+
node = self.make_simple_node(
3409+
base_dir=os.path.join(module_name, fname, 'node'),
3410+
ptrack_enable=self.ptrack,
3411+
initdb_params=['--data-checksums'])
3412+
3413+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3414+
self.init_pb(backup_dir)
3415+
self.add_instance(backup_dir, 'node', node)
3416+
self.set_archiving(backup_dir, 'node', node)
3417+
node.slow_start()
3418+
3419+
# FULL backup
3420+
startTime = int(time())
3421+
self.backup_node(
3422+
backup_dir, 'node', node, backup_type="full",
3423+
options=['--stream', '--start-time', str(startTime)])
3424+
3425+
# DELTA backup
3426+
startTime = int(time())
3427+
self.backup_node(
3428+
backup_dir, 'node', node, backup_type="delta",
3429+
options=['--stream', '--start-time', str(startTime)])
3430+
3431+
# PAGE backup
3432+
startTime = int(time())
3433+
self.backup_node(
3434+
backup_dir, 'node', node, backup_type="page",
3435+
options=['--stream', '--start-time', str(startTime)])
3436+
3437+
if self.ptrack and node.major_version > 11:
3438+
node.safe_psql(
3439+
"postgres",
3440+
"create extension ptrack")
3441+
3442+
# PTRACK backup
3443+
startTime = int(time())
3444+
self.backup_node(
3445+
backup_dir, 'node', node, backup_type="ptrack",
3446+
options=['--stream', '--start-time', str(startTime)])
3447+
3448+
# Clean after yourself
3449+
self.del_test_dir(module_name, fname)
3450+
3451+
# @unittest.skip("skip")
3452+
def test_start_time_incorrect_time(self):
3453+
3454+
fname = self.id().split('.')[3]
3455+
node = self.make_simple_node(
3456+
base_dir=os.path.join(module_name, fname, 'node'),
3457+
ptrack_enable=self.ptrack,
3458+
initdb_params=['--data-checksums'])
3459+
3460+
backup_dir = os.path.join(self.tmp_path, module_name, fname, 'backup')
3461+
self.init_pb(backup_dir)
3462+
self.add_instance(backup_dir, 'node', node)
3463+
self.set_archiving(backup_dir, 'node', node)
3464+
node.slow_start()
3465+
3466+
startTime = int(time())
3467+
#backup with correct start time
3468+
self.backup_node(
3469+
backup_dir, 'node', node,
3470+
options=['--stream', '--start-time', str(startTime)])
3471+
#backups with incorrect start time
3472+
try:
3473+
self.backup_node(
3474+
backup_dir, 'node', node, backup_type="full",
3475+
options=['--stream', '--start-time', str(startTime-10000)])
3476+
# we should die here because exception is what we expect to happen
3477+
self.assertEqual(
3478+
1, 0,
3479+
"Expecting Error because start time for new backup must be newer "
3480+
"\n Output: {0} \n CMD: {1}".format(
3481+
repr(self.output), self.cmd))
3482+
except ProbackupException as e:
3483+
self.assertRegex(
3484+
e.message,
3485+
"ERROR: Cannot create directory for older backup",
3486+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3487+
repr(e.message), self.cmd))
3488+
3489+
try:
3490+
self.backup_node(
3491+
backup_dir, 'node', node, backup_type="delta",
3492+
options=['--stream', '--start-time', str(startTime-10000)])
3493+
# we should die here because exception is what we expect to happen
3494+
self.assertEqual(
3495+
1, 0,
3496+
"Expecting Error because start time for new backup must be newer "
3497+
"\n Output: {0} \n CMD: {1}".format(
3498+
repr(self.output), self.cmd))
3499+
except ProbackupException as e:
3500+
self.assertRegex(
3501+
e.message,
3502+
"ERROR: Cannot create directory for older backup",
3503+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3504+
repr(e.message), self.cmd))
3505+
3506+
try:
3507+
self.backup_node(
3508+
backup_dir, 'node', node, backup_type="page",
3509+
options=['--stream', '--start-time', str(startTime-10000)])
3510+
# we should die here because exception is what we expect to happen
3511+
self.assertEqual(
3512+
1, 0,
3513+
"Expecting Error because start time for new backup must be newer "
3514+
"\n Output: {0} \n CMD: {1}".format(
3515+
repr(self.output), self.cmd))
3516+
except ProbackupException as e:
3517+
self.assertRegex(
3518+
e.message,
3519+
"ERROR: Cannot create directory for older backup",
3520+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3521+
repr(e.message), self.cmd))
3522+
3523+
if self.ptrack and node.major_version > 11:
3524+
node.safe_psql(
3525+
"postgres",
3526+
"create extension ptrack")
3527+
3528+
try:
3529+
self.backup_node(
3530+
backup_dir, 'node', node, backup_type="page",
3531+
options=['--stream', '--start-time', str(startTime-10000)])
3532+
# we should die here because exception is what we expect to happen
3533+
self.assertEqual(
3534+
1, 0,
3535+
"Expecting Error because start time for new backup must be newer "
3536+
"\n Output: {0} \n CMD: {1}".format(
3537+
repr(self.output), self.cmd))
3538+
except ProbackupException as e:
3539+
self.assertRegex(
3540+
e.message,
3541+
"ERROR: Cannot create directory for older backup",
3542+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3543+
repr(e.message), self.cmd))
3544+
3545+
# Clean after yourself
3546+
self.del_test_dir(module_name, fname)
3547+
3548+
# @unittest.skip("skip")
3549+
def test_start_time_few_nodes(self):
3550+
3551+
fname = self.id().split('.')[3]
3552+
node1 = self.make_simple_node(
3553+
base_dir=os.path.join(module_name, fname, 'node1'),
3554+
ptrack_enable=self.ptrack,
3555+
initdb_params=['--data-checksums'])
3556+
3557+
backup_dir1 = os.path.join(self.tmp_path, module_name, fname, 'backup1')
3558+
self.init_pb(backup_dir1)
3559+
self.add_instance(backup_dir1, 'node1', node1)
3560+
self.set_archiving(backup_dir1, 'node1', node1)
3561+
node1.slow_start()
3562+
3563+
node2 = self.make_simple_node(
3564+
base_dir=os.path.join(module_name, fname, 'node2'),
3565+
ptrack_enable=self.ptrack,
3566+
initdb_params=['--data-checksums'])
3567+
3568+
backup_dir2 = os.path.join(self.tmp_path, module_name, fname, 'backup2')
3569+
self.init_pb(backup_dir2)
3570+
self.add_instance(backup_dir2, 'node2', node2)
3571+
self.set_archiving(backup_dir2, 'node2', node2)
3572+
node2.slow_start()
3573+
3574+
# FULL backup
3575+
startTime = int(time())
3576+
self.backup_node(
3577+
backup_dir1, 'node1', node1, backup_type="full",
3578+
options=['--stream', '--start-time', str(startTime)])
3579+
self.backup_node(
3580+
backup_dir2, 'node2', node2, backup_type="full",
3581+
options=['--stream', '--start-time', str(startTime)])
3582+
3583+
show_backup1 = self.show_pb(backup_dir1, 'node1')[0]
3584+
show_backup2 = self.show_pb(backup_dir2, 'node2')[0]
3585+
self.assertEqual(show_backup1['id'], show_backup2['id'])
3586+
3587+
# DELTA backup
3588+
startTime = int(time())
3589+
self.backup_node(
3590+
backup_dir1, 'node1', node1, backup_type="delta",
3591+
options=['--stream', '--start-time', str(startTime)])
3592+
self.backup_node(
3593+
backup_dir2, 'node2', node2, backup_type="delta",
3594+
options=['--stream', '--start-time', str(startTime)])
3595+
show_backup1 = self.show_pb(backup_dir1, 'node1')[1]
3596+
show_backup2 = self.show_pb(backup_dir2, 'node2')[1]
3597+
self.assertEqual(show_backup1['id'], show_backup2['id'])
3598+
3599+
# PAGE backup
3600+
startTime = int(time())
3601+
self.backup_node(
3602+
backup_dir1, 'node1', node1, backup_type="page",
3603+
options=['--stream', '--start-time', str(startTime)])
3604+
self.backup_node(
3605+
backup_dir2, 'node2', node2, backup_type="page",
3606+
options=['--stream', '--start-time', str(startTime)])
3607+
show_backup1 = self.show_pb(backup_dir1, 'node1')[2]
3608+
show_backup2 = self.show_pb(backup_dir2, 'node2')[2]
3609+
self.assertEqual(show_backup1['id'], show_backup2['id'])
3610+
3611+
# PTRACK backup
3612+
startTime = int(time())
3613+
if self.ptrack and node1.major_version > 11:
3614+
node1.safe_psql(
3615+
"postgres",
3616+
"create extension ptrack")
3617+
self.backup_node(
3618+
backup_dir1, 'node1', node1, backup_type="ptrack",
3619+
options=['--stream', '--start-time', str(startTime)])
3620+
3621+
if self.ptrack and node2.major_version > 11:
3622+
node2.safe_psql(
3623+
"postgres",
3624+
"create extension ptrack")
3625+
self.backup_node(
3626+
backup_dir2, 'node2', node2, backup_type="ptrack",
3627+
options=['--stream', '--start-time', str(startTime)])
3628+
show_backup1 = self.show_pb(backup_dir1, 'node1')[3]
3629+
show_backup2 = self.show_pb(backup_dir2, 'node2')[3]
3630+
self.assertEqual(show_backup1['id'], show_backup2['id'])
3631+
3632+
# Clean after yourself
3633+
self.del_test_dir(module_name, fname)
3634+
3635+
# @unittest.skip("skip")
3636+
def test_start_time_few_nodes_incorrect_time(self):
3637+
3638+
fname = self.id().split('.')[3]
3639+
node1 = self.make_simple_node(
3640+
base_dir=os.path.join(module_name, fname, 'node1'),
3641+
ptrack_enable=self.ptrack,
3642+
initdb_params=['--data-checksums'])
3643+
3644+
backup_dir1 = os.path.join(self.tmp_path, module_name, fname, 'backup1')
3645+
self.init_pb(backup_dir1)
3646+
self.add_instance(backup_dir1, 'node1', node1)
3647+
self.set_archiving(backup_dir1, 'node1', node1)
3648+
node1.slow_start()
3649+
3650+
node2 = self.make_simple_node(
3651+
base_dir=os.path.join(module_name, fname, 'node2'),
3652+
ptrack_enable=self.ptrack,
3653+
initdb_params=['--data-checksums'])
3654+
3655+
backup_dir2 = os.path.join(self.tmp_path, module_name, fname, 'backup2')
3656+
self.init_pb(backup_dir2)
3657+
self.add_instance(backup_dir2, 'node2', node2)
3658+
self.set_archiving(backup_dir2, 'node2', node2)
3659+
node2.slow_start()
3660+
3661+
# FULL backup
3662+
startTime = int(time())
3663+
self.backup_node(
3664+
backup_dir1, 'node1', node1, backup_type="full",
3665+
options=['--stream', '--start-time', str(startTime)])
3666+
self.backup_node(
3667+
backup_dir2, 'node2', node2, backup_type="full",
3668+
options=['--stream', '--start-time', str(startTime-10000)])
3669+
3670+
show_backup1 = self.show_pb(backup_dir1, 'node1')[0]
3671+
show_backup2 = self.show_pb(backup_dir2, 'node2')[0]
3672+
self.assertGreater(show_backup1['id'], show_backup2['id'])
3673+
3674+
# DELTA backup
3675+
startTime = int(time())
3676+
self.backup_node(
3677+
backup_dir1, 'node1', node1, backup_type="delta",
3678+
options=['--stream', '--start-time', str(startTime)])
3679+
# make backup with start time definitelly earlier, than existing
3680+
try:
3681+
self.backup_node(
3682+
backup_dir2, 'node2', node2, backup_type="delta",
3683+
options=['--stream', '--start-time', str(10000)])
3684+
self.assertEqual(
3685+
1, 0,
3686+
"Expecting Error because start time for new backup must be newer "
3687+
"\n Output: {0} \n CMD: {1}".format(
3688+
repr(self.output), self.cmd))
3689+
except ProbackupException as e:
3690+
self.assertRegex(
3691+
e.message,
3692+
"ERROR: Cannot create directory for older backup",
3693+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3694+
repr(e.message), self.cmd))
3695+
3696+
show_backup1 = self.show_pb(backup_dir1, 'node1')[1]
3697+
show_backup2 = self.show_pb(backup_dir2, 'node2')[0]
3698+
self.assertGreater(show_backup1['id'], show_backup2['id'])
3699+
3700+
# PAGE backup
3701+
startTime = int(time())
3702+
self.backup_node(
3703+
backup_dir1, 'node1', node1, backup_type="page",
3704+
options=['--stream', '--start-time', str(startTime)])
3705+
# make backup with start time definitelly earlier, than existing
3706+
try:
3707+
self.backup_node(
3708+
backup_dir2, 'node2', node2, backup_type="page",
3709+
options=['--stream', '--start-time', str(10000)])
3710+
self.assertEqual(
3711+
1, 0,
3712+
"Expecting Error because start time for new backup must be newer "
3713+
"\n Output: {0} \n CMD: {1}".format(
3714+
repr(self.output), self.cmd))
3715+
except ProbackupException as e:
3716+
self.assertRegex(
3717+
e.message,
3718+
"ERROR: Cannot create directory for older backup",
3719+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3720+
repr(e.message), self.cmd))
3721+
3722+
show_backup1 = self.show_pb(backup_dir1, 'node1')[2]
3723+
show_backup2 = self.show_pb(backup_dir2, 'node2')[0]
3724+
self.assertGreater(show_backup1['id'], show_backup2['id'])
3725+
3726+
# PTRACK backup
3727+
startTime = int(time())
3728+
if self.ptrack and node1.major_version > 11:
3729+
node1.safe_psql(
3730+
"postgres",
3731+
"create extension ptrack")
3732+
self.backup_node(
3733+
backup_dir1, 'node1', node1, backup_type="ptrack",
3734+
options=['--stream', '--start-time', str(startTime)])
3735+
3736+
if self.ptrack and node2.major_version > 11:
3737+
node2.safe_psql(
3738+
"postgres",
3739+
"create extension ptrack")
3740+
# make backup with start time definitelly earlier, than existing
3741+
try:
3742+
self.backup_node(
3743+
backup_dir2, 'node2', node2, backup_type="ptrack",
3744+
options=['--stream', '--start-time', str(10000)])
3745+
self.assertEqual(
3746+
1, 0,
3747+
"Expecting Error because start time for new backup must be newer "
3748+
"\n Output: {0} \n CMD: {1}".format(
3749+
repr(self.output), self.cmd))
3750+
except ProbackupException as e:
3751+
self.assertRegex(
3752+
e.message,
3753+
"ERROR: Cannot create directory for older backup",
3754+
"\n Unexpected Error Message: {0}\n CMD: {1}".format(
3755+
repr(e.message), self.cmd))
3756+
3757+
# FULL backup
3758+
startTime = int(time())
3759+
self.backup_node(
3760+
backup_dir1, 'node1', node1, backup_type="full",
3761+
options=['--stream', '--start-time', str(startTime)])
3762+
self.backup_node(
3763+
backup_dir2, 'node2', node2, backup_type="full",
3764+
options=['--stream', '--start-time', str(startTime)])
3765+
3766+
show_backup1 = self.show_pb(backup_dir1, 'node1')[4]
3767+
show_backup2 = self.show_pb(backup_dir2, 'node2')[1]
3768+
self.assertEqual(show_backup1['id'], show_backup2['id'])
3769+
3770+
# Clean after yourself
3771+
self.del_test_dir(module_name, fname)

tests/helpers/ptrack_helpers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ def backup_node(
938938
backup_type='full', datname=False, options=[],
939939
asynchronous=False, gdb=False,
940940
old_binary=False, return_id=True, no_remote=False,
941-
env=None
941+
env=None, startTime=None
942942
):
943943
if not node and not data_dir:
944944
print('You must provide ether node or data_dir for backup')
@@ -971,6 +971,9 @@ def backup_node(
971971
if not old_binary:
972972
cmd_list += ['--no-sync']
973973

974+
if startTime:
975+
cmd_list += ['--start-time', startTime]
976+
974977
return self.run_pb(cmd_list + options, asynchronous, gdb, old_binary, return_id, env=env)
975978

976979
def checkdb_node(

0 commit comments

Comments
 (0)
0