Fix recently added incorrect assertion
authorAlvaro Herrera <[email protected]>
Mon, 24 Oct 2022 10:02:33 +0000 (12:02 +0200)
committerAlvaro Herrera <[email protected]>
Mon, 24 Oct 2022 10:02:33 +0000 (12:02 +0200)
Commit df3737a651f4 added an incorrect assertion about the preconditions
for invoking the backup cleanup callback: it misfires at session end in
case a backup completes successfully.  Fix it, using coding from MichaĆ«l
Paquier.  Also add some tests for the various cases.

Reported by Kyotaro Horiguchi <[email protected]>
Discussion: https://postgr.es/m/20221021.161038.1277961198945653224[email protected]

src/backend/access/transam/xlog.c
src/test/recovery/t/020_archive_status.pl

index dea978a962a953f60d896a5df23bfdeeb10d7134..8f10effe3a4c34e18e924aced41e5c38a80febf1 100644 (file)
@@ -8841,9 +8841,8 @@ do_pg_abort_backup(int code, Datum arg)
 {
    bool        during_backup_start = DatumGetBool(arg);
 
-   /* Only one of these conditions can be true */
-   Assert(during_backup_start ^
-          (sessionBackupState == SESSION_BACKUP_RUNNING));
+   /* If called during backup start, there shouldn't be one already running */
+   Assert(!during_backup_start || sessionBackupState == SESSION_BACKUP_NONE);
 
    if (during_backup_start || sessionBackupState != SESSION_BACKUP_NONE)
    {
index 2108d50073abf6291033187448997ccd64e1b75f..fe9ac06b32d3d7809417111e616320c3cb41b379 100644 (file)
@@ -248,4 +248,18 @@ my $logfile = slurp_file($standby2->logfile, $log_location);
 ok( $logfile =~ qr/archiver process shutting down/,
    'check shutdown callback of shell archive module');
 
+# Test that we can enter and leave backup mode without crashes
+my ($stderr, $cmdret);
+$cmdret = $primary->psql(
+   'postgres',
+   "SELECT pg_backup_start('onebackup'); "
+     . "SELECT pg_backup_stop();"
+     . "SELECT pg_backup_start(repeat('x', 1026))",
+   stderr => \$stderr);
+is($cmdret, 3, "psql fails correctly");
+like($stderr, qr/backup label too long/, "pg_backup_start fails gracefully");
+$primary->safe_psql('postgres',
+   "SELECT pg_backup_start('onebackup'); SELECT pg_backup_stop();");
+$primary->safe_psql('postgres', "SELECT pg_backup_start('twobackup')");
+
 done_testing();