Prevent BASE_BACKUP in the middle of another backup in the same session.
authorFujii Masao <fujii@postgresql.org>
Tue, 12 Jul 2022 00:31:57 +0000 (09:31 +0900)
committerFujii Masao <fujii@postgresql.org>
Wed, 20 Jul 2022 00:56:42 +0000 (09:56 +0900)
Multiple non-exclusive backups are able to be run conrrently in different
sessions. But, in the same session, only one non-exclusive backup can be
run at the same moment. If pg_backup_start (pg_start_backup in v14 or before)
is called in the middle of another non-exclusive backup in the same session,
an error is thrown.

However, previously, in logical replication walsender mode, even if that
walsender session had already called pg_backup_start and started
a non-exclusive backup, it could execute BASE_BACKUP command and
start another non-exclusive backup. Which caused subsequent pg_backup_stop
to throw an error because BASE_BACKUP unexpectedly reset the session state
marked by pg_backup_start.

This commit prevents BASE_BACKUP command in the middle of another
non-exclusive backup in the same session.

Back-patch to all supported branches.

Author: Fujii Masao
Reviewed-by: Kyotaro Horiguchi, Masahiko Sawada, Michael Paquier, Robert Haas
Discussion: https://postgr.es/m/3374718f-9fbf-a950-6d66-d973e027f44c@oss.nttdata.com

src/backend/replication/basebackup.c

index 95440013c05c0d9f81bfbbcddd9da78f39fd7810..637c0ce459766a3aaa24a9b0fd9468a60cb7244c 100644 (file)
@@ -949,6 +949,12 @@ SendBaseBackup(BaseBackupCmd *cmd)
 {
    basebackup_options opt;
    bbsink     *sink;
+   SessionBackupState status = get_backup_status();
+
+   if (status == SESSION_BACKUP_RUNNING)
+       ereport(ERROR,
+               (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+                errmsg("a backup is already in progress in this session")));
 
    parse_basebackup_options(cmd->options, &opt);