summaryrefslogtreecommitdiff
path: root/src/include/access/xlog.h
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2020-08-06 13:58:23 -0400
committerRobert Haas <rhaas@postgresql.org>2020-08-06 13:58:23 -0400
commitbcbc27251d35336a6442761f59638138a772b839 (patch)
tree9abd12b225a0804ee37f2608d6ea25b59b4960ed /src/include/access/xlog.h
parentf87f77ec8adf65370c6d35919cd576eae60a5528 (diff)
Fix minor problems with non-exclusive backup cleanup.
The previous coding imagined that it could call before_shmem_exit() when a non-exclusive backup began and then remove the previously-added handler by calling cancel_before_shmem_exit() when that backup ended. However, this only works provided that nothing else in the system has registered a before_shmem_exit() hook in the interim, because cancel_before_shmem_exit() is documented to remove a callback only if it is the latest callback registered. It also only works if nothing can ERROR out between the time that sessionBackupState is reset and the time that cancel_before_shmem_exit(), which doesn't seem to be strictly true. To fix, leave the handler installed for the lifetime of the session, arrange to install it just once, and teach it to quietly do nothing if there isn't a non-exclusive backup in process. This was originally committed to master as 303640199d0436c5e7acdf50b837a027b5726594, but I did not back-patch at the time because the consequences were minor. However, now there's been a second report of this causing trouble with a slightly different test case than the one I reported originally, so now I'm back-patching as far as v11 where JIT was introduced. Patch by me, reviewed by Kyotaro Horiguchi, Michael Paquier (who preferred a different approach, but got outvoted), Fujii Masao, and Tom Lane, and with comments by various others. New problem report from Bharath Rupireddy. Discussion: http://postgr.es/m/CA+TgmobMjnyBfNhGTKQEDbqXYE3_rXWpc4CM63fhyerNCes3mA@mail.gmail.com Discussion: http://postgr.es/m/CALj2ACWk7j4F2v2fxxYfrroOF=AdFNPr1WsV+AGtHAFQOqm_pw@mail.gmail.com
Diffstat (limited to 'src/include/access/xlog.h')
-rw-r--r--src/include/access/xlog.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index d6ab348cb69..0bed7e337ce 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -359,7 +359,8 @@ extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,
bool needtblspcmapfile);
extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive,
TimeLineID *stoptli_p);
-extern void do_pg_abort_backup(void);
+extern void do_pg_abort_backup(int code, Datum arg);
+extern void register_persistent_abort_backup_handler(void);
extern SessionBackupState get_backup_status(void);
/* File path names (all relative to $PGDATA) */