This is an automated email from the ASF dual-hosted git repository.

maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit cdf4171c88b871f0f041b72686a9077338348f8c
Author: Fujii Masao <[email protected]>
AuthorDate: Tue Jul 12 09:31:57 2022 +0900

    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/[email protected]
---
 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 486cc3a4b5..2a0e344ced 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -1074,6 +1074,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);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to