diff options
author | Fujii Masao <fujii@postgresql.org> | 2022-07-12 09:31:57 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2022-07-20 09:52:23 +0900 |
commit | 5630f39b31eac67a1bd56b0e6254d7724b7bbaeb (patch) | |
tree | 2acd060ff4dcf629796b80d1afdfbaa8f1d5c828 | |
parent | b2c8d56618b86ba41db950e437e5abcbf085f186 (diff) | |
download | postgresql-5630f39b31eac67a1bd56b0e6254d7724b7bbaeb.tar.gz postgresql-5630f39b31eac67a1bd56b0e6254d7724b7bbaeb.zip |
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
-rw-r--r-- | src/backend/replication/basebackup.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c index 50ae1f16d0b..dcdbc1cd999 100644 --- a/src/backend/replication/basebackup.c +++ b/src/backend/replication/basebackup.c @@ -927,6 +927,12 @@ void SendBaseBackup(BaseBackupCmd *cmd) { 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); |