postgres.git / summary / log / commit / refs

commit    dd831afc44bf77dd1fd8095d684153bbf5544e1c
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Tue Jul 12 00:31:57 2022 +0000
First released in: 16.0, 10.22, 11.17, 12.12, 13.8, 14.5, 15.0

    Prevent BASE_BACKUP in the middle of another backup in the same session.
    
    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 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index dfb0f4741fe..9ba3e3f2cd9 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -705,6 +705,12 @@ SendBaseBackup(BaseBackupCmd *cmd) { DIR *dir; basebackup_options opt; + SessionBackupState status = get_backup_status(); + + if (status == SESSION_BACKUP_NON_EXCLUSIVE) + 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); [parent: 26c9e1bd8846]