#define MAXPG_LSNCOMPONENT 8
diff --git a/tests/archive.py b/tests/archive.py
index 52fb225e8..81d013f6b 100644
--- a/tests/archive.py
+++ b/tests/archive.py
@@ -250,6 +250,7 @@ def test_pgpro434_3(self):
"--log-level-file=LOG"],
gdb=True)
+ # Attention! this breakpoint has been set on internal probackup function, not on a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
@@ -314,6 +315,7 @@ def test_pgpro434_4(self):
"--log-level-file=info"],
gdb=True)
+ # Attention! this breakpoint has been set on internal probackup function, not on a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
@@ -341,9 +343,14 @@ def test_pgpro434_4(self):
with open(log_file, 'r') as f:
log_content = f.read()
- self.assertIn(
- "ERROR: pg_stop_backup doesn't answer in 60 seconds, cancel it",
- log_content)
+ if self.get_version(node) < 150000:
+ self.assertIn(
+ "ERROR: pg_stop_backup doesn't answer in 60 seconds, cancel it",
+ log_content)
+ else:
+ self.assertIn(
+ "ERROR: pg_backup_stop doesn't answer in 60 seconds, cancel it",
+ log_content)
log_file = os.path.join(node.logs_dir, 'postgresql.log')
with open(log_file, 'r') as f:
diff --git a/tests/auth_test.py b/tests/auth_test.py
index 78af21be9..39786d7a9 100644
--- a/tests/auth_test.py
+++ b/tests/auth_test.py
@@ -51,16 +51,29 @@ def test_backup_via_unprivileged_user(self):
1, 0,
"Expecting Error due to missing grant on EXECUTE.")
except ProbackupException as e:
- self.assertIn(
- "ERROR: query failed: ERROR: permission denied "
- "for function pg_start_backup", e.message,
- '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
- repr(e.message), self.cmd))
+ if self.get_version(node) < 150000:
+ self.assertIn(
+ "ERROR: query failed: ERROR: permission denied "
+ "for function pg_start_backup", e.message,
+ '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
+ repr(e.message), self.cmd))
+ else:
+ self.assertIn(
+ "ERROR: query failed: ERROR: permission denied "
+ "for function pg_backup_start", e.message,
+ '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
+ repr(e.message), self.cmd))
- node.safe_psql(
- "postgres",
- "GRANT EXECUTE ON FUNCTION"
- " pg_start_backup(text, boolean, boolean) TO backup;")
+ if self.get_version(node) < 150000:
+ node.safe_psql(
+ "postgres",
+ "GRANT EXECUTE ON FUNCTION"
+ " pg_start_backup(text, boolean, boolean) TO backup;")
+ else:
+ node.safe_psql(
+ "postgres",
+ "GRANT EXECUTE ON FUNCTION"
+ " pg_backup_start(text, boolean) TO backup;")
if self.get_version(node) < 100000:
node.safe_psql(
@@ -97,17 +110,24 @@ def test_backup_via_unprivileged_user(self):
1, 0,
"Expecting Error due to missing grant on EXECUTE.")
except ProbackupException as e:
- self.assertIn(
- "ERROR: query failed: ERROR: permission denied "
- "for function pg_stop_backup", e.message,
- '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
- repr(e.message), self.cmd))
+ if self.get_version(node) < 150000:
+ self.assertIn(
+ "ERROR: query failed: ERROR: permission denied "
+ "for function pg_stop_backup", e.message,
+ '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
+ repr(e.message), self.cmd))
+ else:
+ self.assertIn(
+ "ERROR: query failed: ERROR: permission denied "
+ "for function pg_backup_stop", e.message,
+ '\n Unexpected Error Message: {0}\n CMD: {1}'.format(
+ repr(e.message), self.cmd))
if self.get_version(node) < self.version_to_num('10.0'):
node.safe_psql(
"postgres",
"GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup")
- else:
+ elif self.get_vestion(node) < self.version_to_num('15.0'):
node.safe_psql(
"postgres",
"GRANT EXECUTE ON FUNCTION "
@@ -116,6 +136,16 @@ def test_backup_via_unprivileged_user(self):
node.safe_psql(
"postgres",
"GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup")
+ else:
+ node.safe_psql(
+ "postgres",
+ "GRANT EXECUTE ON FUNCTION "
+ "pg_backup_stop(boolean) TO backup")
+ # Do this for ptrack backups
+ node.safe_psql(
+ "postgres",
+ "GRANT EXECUTE ON FUNCTION pg_backup_stop() TO backup")
+
self.backup_node(
backup_dir, 'node', node, options=['-U', 'backup'])
@@ -177,20 +207,37 @@ def setUpClass(cls):
except StartNodeException:
raise unittest.skip("Node hasn't started")
- cls.node.safe_psql(
- "postgres",
- "CREATE ROLE backup WITH LOGIN PASSWORD 'password'; "
- "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
- "GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup; "
- "GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
- "GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;")
+ if cls.pb.get_version(cls.node) < 150000:
+ cls.node.safe_psql(
+ "postgres",
+ "CREATE ROLE backup WITH LOGIN PASSWORD 'password'; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;")
+ else:
+ cls.node.safe_psql(
+ "postgres",
+ "CREATE ROLE backup WITH LOGIN PASSWORD 'password'; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_backup_stop() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_current() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup;")
+
cls.pgpass_file = os.path.join(os.path.expanduser('~'), '.pgpass')
@classmethod
diff --git a/tests/backup.py b/tests/backup.py
index 0cba8fe79..4f447c9bd 100644
--- a/tests/backup.py
+++ b/tests/backup.py
@@ -1927,9 +1927,10 @@ def test_backup_with_least_privileges_role(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"REVOKE ALL ON DATABASE backupdb from PUBLIC; "
@@ -1964,7 +1965,46 @@ def test_backup_with_least_privileges_role(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "REVOKE ALL ON DATABASE backupdb from PUBLIC; "
+ "REVOKE ALL ON SCHEMA public from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA pg_catalog from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA information_schema from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA information_schema FROM PUBLIC; "
+ "CREATE ROLE backup WITH LOGIN REPLICATION; "
+ "GRANT CONNECT ON DATABASE backupdb to backup; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
+ "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
if self.ptrack:
node.safe_psql(
@@ -2266,9 +2306,11 @@ def test_backup_with_less_privileges_role(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
+ "COMMIT;"
+ )
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"CREATE ROLE backup WITH LOGIN; "
@@ -2282,7 +2324,28 @@ def test_backup_with_less_privileges_role(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
+ "COMMIT;"
+ )
+ # >= 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "BEGIN; "
+ "CREATE ROLE backup WITH LOGIN; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup; "
+ "COMMIT;"
+ )
# enable STREAM backup
node.safe_psql(
@@ -3054,8 +3117,8 @@ def test_missing_replication_permission(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"CREATE ROLE backup WITH LOGIN; "
@@ -3075,7 +3138,31 @@ def test_missing_replication_permission(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "CREATE ROLE backup WITH LOGIN; "
+ "GRANT CONNECT ON DATABASE backupdb to backup; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
+ "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
if ProbackupTest.enterprise:
node.safe_psql(
@@ -3183,9 +3270,10 @@ def test_missing_replication_permission_1(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"CREATE ROLE backup WITH LOGIN; "
@@ -3205,7 +3293,31 @@ def test_missing_replication_permission_1(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # > 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "CREATE ROLE backup WITH LOGIN; "
+ "GRANT CONNECT ON DATABASE backupdb to backup; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
+ "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
if ProbackupTest.enterprise:
node.safe_psql(
@@ -3331,7 +3443,7 @@ def test_backup_atexit(self):
log_content)
self.assertIn(
- 'FROM pg_catalog.pg_stop_backup',
+ 'FROM pg_catalog.pg_backup_stop',
log_content)
self.assertIn(
@@ -3369,10 +3481,15 @@ def test_pg_stop_backup_missing_permissions(self):
node.safe_psql(
'postgres',
'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean) FROM backup')
- else:
+ elif self.get_version(node) < 150000:
node.safe_psql(
'postgres',
'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) FROM backup')
+ else:
+ node.safe_psql(
+ 'postgres',
+ 'REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) FROM backup')
+
# Full backup in streaming mode
try:
@@ -3380,17 +3497,32 @@ def test_pg_stop_backup_missing_permissions(self):
backup_dir, 'node', node,
options=['--stream', '-U', 'backup'])
# we should die here because exception is what we expect to happen
- self.assertEqual(
- 1, 0,
- "Expecting Error because of missing permissions on pg_stop_backup "
- "\n Output: {0} \n CMD: {1}".format(
- repr(self.output), self.cmd))
+ if self.get_version(node) < 150000:
+ self.assertEqual(
+ 1, 0,
+ "Expecting Error because of missing permissions on pg_stop_backup "
+ "\n Output: {0} \n CMD: {1}".format(
+ repr(self.output), self.cmd))
+ else:
+ self.assertEqual(
+ 1, 0,
+ "Expecting Error because of missing permissions on pg_backup_stop "
+ "\n Output: {0} \n CMD: {1}".format(
+ repr(self.output), self.cmd))
except ProbackupException as e:
- self.assertIn(
- "ERROR: permission denied for function pg_stop_backup",
- e.message,
- "\n Unexpected Error Message: {0}\n CMD: {1}".format(
- repr(e.message), self.cmd))
+ if self.get_version(node) < 150000:
+ self.assertIn(
+ "ERROR: permission denied for function pg_stop_backup",
+ e.message,
+ "\n Unexpected Error Message: {0}\n CMD: {1}".format(
+ repr(e.message), self.cmd))
+ else:
+ self.assertIn(
+ "ERROR: permission denied for function pg_backup_stop",
+ e.message,
+ "\n Unexpected Error Message: {0}\n CMD: {1}".format(
+ repr(e.message), self.cmd))
+
self.assertIn(
"query was: SELECT pg_catalog.txid_snapshot_xmax",
e.message,
diff --git a/tests/false_positive.py b/tests/false_positive.py
index a101f8107..2ededdf12 100644
--- a/tests/false_positive.py
+++ b/tests/false_positive.py
@@ -198,6 +198,7 @@ def test_recovery_target_time_backup_victim(self):
gdb = self.backup_node(backup_dir, 'node', node, gdb=True)
+ # Attention! This breakpoint is set to a probackup internal fuction, not a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
gdb.remove_all_breakpoints()
@@ -257,6 +258,7 @@ def test_recovery_target_lsn_backup_victim(self):
backup_dir, 'node', node,
options=['--log-level-console=LOG'], gdb=True)
+ # Attention! This breakpoint is set to a probackup internal fuction, not a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
gdb.remove_all_breakpoints()
@@ -308,6 +310,7 @@ def test_streaming_timeout(self):
backup_dir, 'node', node, gdb=True,
options=['--stream', '--log-level-file=LOG'])
+ # Attention! This breakpoint is set to a probackup internal fuction, not a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
diff --git a/tests/helpers/ptrack_helpers.py b/tests/helpers/ptrack_helpers.py
index 59eb12aec..d800f0d3e 100644
--- a/tests/helpers/ptrack_helpers.py
+++ b/tests/helpers/ptrack_helpers.py
@@ -476,8 +476,8 @@ def simple_bootstrap(self, node, role) -> None:
'GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO {0}; '
'GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO {0}; '
'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO {0};'.format(role))
- # >= 10
- else:
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'postgres',
'GRANT USAGE ON SCHEMA pg_catalog TO {0}; '
@@ -492,6 +492,22 @@ def simple_bootstrap(self, node, role) -> None:
'GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO {0}; '
'GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO {0}; '
'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO {0};'.format(role))
+ # >= 15
+ else:
+ node.safe_psql(
+ 'postgres',
+ 'GRANT USAGE ON SCHEMA pg_catalog TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO {0}; '
+ 'GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO {0};'.format(role))
def create_tblspace_in_node(self, node, tblspc_name, tblspc_path=None, cfs=False):
res = node.execute(
diff --git a/tests/ptrack.py b/tests/ptrack.py
index 783d3b3e7..a01405d6a 100644
--- a/tests/ptrack.py
+++ b/tests/ptrack.py
@@ -582,9 +582,10 @@ def test_ptrack_unprivileged(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"REVOKE ALL ON DATABASE backupdb from PUBLIC; "
@@ -617,7 +618,44 @@ def test_ptrack_unprivileged(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "REVOKE ALL ON DATABASE backupdb from PUBLIC; "
+ "REVOKE ALL ON SCHEMA public from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA pg_catalog from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA information_schema from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA information_schema FROM PUBLIC; "
+ "CREATE ROLE backup WITH LOGIN REPLICATION; "
+ "GRANT CONNECT ON DATABASE backupdb to backup; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
+ "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
node.safe_psql(
"backupdb",
diff --git a/tests/replica.py b/tests/replica.py
index 24dbaa39e..ea69e2d01 100644
--- a/tests/replica.py
+++ b/tests/replica.py
@@ -775,6 +775,7 @@ def test_replica_stop_lsn_null_offset_next_record(self):
'--stream'],
gdb=True)
+ # Attention! this breakpoint is set to a probackup internal function, not a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
gdb.remove_all_breakpoints()
diff --git a/tests/restore.py b/tests/restore.py
index ae1c7cbe0..49538bd1f 100644
--- a/tests/restore.py
+++ b/tests/restore.py
@@ -3272,9 +3272,10 @@ def test_missing_database_map(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_xlog() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_xlog_replay_location() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
- # >= 10
- else:
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 10 && < 15
+ elif self.get_version(node) >= 100000 and self.get_version(node) < 150000:
node.safe_psql(
'backupdb',
"REVOKE ALL ON DATABASE backupdb from PUBLIC; "
@@ -3308,7 +3309,45 @@ def test_missing_database_map(self):
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
"GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
- "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;")
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
+ # >= 15
+ else:
+ node.safe_psql(
+ 'backupdb',
+ "REVOKE ALL ON DATABASE backupdb from PUBLIC; "
+ "REVOKE ALL ON SCHEMA public from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA pg_catalog from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA pg_catalog FROM PUBLIC; "
+ "REVOKE ALL ON SCHEMA information_schema from PUBLIC; "
+ "REVOKE ALL ON ALL TABLES IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL FUNCTIONS IN SCHEMA information_schema FROM PUBLIC; "
+ "REVOKE ALL ON ALL SEQUENCES IN SCHEMA information_schema FROM PUBLIC; "
+ "CREATE ROLE backup WITH LOGIN REPLICATION; "
+ "GRANT CONNECT ON DATABASE backupdb to backup; "
+ "GRANT USAGE ON SCHEMA pg_catalog TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_proc TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_extension TO backup; "
+ "GRANT SELECT ON TABLE pg_catalog.pg_database TO backup; " # for partial restore, checkdb and ptrack
+ "GRANT EXECUTE ON FUNCTION pg_catalog.oideq(oid, oid) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.nameeq(name, name) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_system() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup; "
+ "GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;"
+ )
if self.ptrack:
# TODO why backup works without these grants ?
diff --git a/tests/retention.py b/tests/retention.py
index b0399a239..122ab28ad 100644
--- a/tests/retention.py
+++ b/tests/retention.py
@@ -1519,6 +1519,7 @@ def test_window_error_backups_1(self):
gdb = self.backup_node(
backup_dir, 'node', node, backup_type='page', gdb=True)
+ # Attention! this breakpoint has been set on internal probackup function, not on a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
gdb.remove_all_breakpoints()
@@ -1568,6 +1569,7 @@ def test_window_error_backups_2(self):
gdb = self.backup_node(
backup_dir, 'node', node, backup_type='page', gdb=True)
+ # Attention! this breakpoint has been set on internal probackup function, not on a postgres core one
gdb.set_breakpoint('pg_stop_backup')
gdb.run_until_break()
gdb._execute('signal SIGKILL')
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy