diff options
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/transam/xlog.c | 32 | ||||
-rw-r--r-- | src/backend/access/transam/xlogfuncs.c | 17 |
2 files changed, 31 insertions, 18 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 18b4d11bd03..01858818724 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -11188,23 +11188,30 @@ do_pg_stop_backup(char *labelfile, bool waitforarchive, TimeLineID *stoptli_p) * system out of backup mode, thus making it a lot more safe to call from * an error handler. * + * The caller can pass 'arg' as 'true' or 'false' to control whether a warning + * is emitted. + * * NB: This is only for aborting a non-exclusive backup that doesn't write * backup_label. A backup started with pg_start_backup() needs to be finished * with pg_stop_backup(). + * + * NB: This gets used as a before_shmem_exit handler, hence the odd-looking + * signature. */ void -do_pg_abort_backup(void) +do_pg_abort_backup(int code, Datum arg) { + bool emit_warning = DatumGetBool(arg); + /* * Quick exit if session is not keeping around a non-exclusive backup * already started. */ - if (sessionBackupState == SESSION_BACKUP_NONE) + if (sessionBackupState != SESSION_BACKUP_NON_EXCLUSIVE) return; WALInsertLockAcquireExclusive(); Assert(XLogCtl->Insert.nonExclusiveBackups > 0); - Assert(sessionBackupState == SESSION_BACKUP_NON_EXCLUSIVE); XLogCtl->Insert.nonExclusiveBackups--; if (XLogCtl->Insert.exclusiveBackupState == EXCLUSIVE_BACKUP_NONE && @@ -11213,6 +11220,25 @@ do_pg_abort_backup(void) XLogCtl->Insert.forcePageWrites = false; } WALInsertLockRelease(); + + if (emit_warning) + ereport(WARNING, + (errmsg("aborting backup due to backend exiting before pg_stop_back up was called"))); +} + +/* + * Register a handler that will warn about unterminated backups at end of + * session, unless this has already been done. + */ +void +register_persistent_abort_backup_handler(void) +{ + static bool already_done = false; + + if (already_done) + return; + before_shmem_exit(do_pg_abort_backup, DatumGetBool(true)); + already_done = true; } /* diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 89c98e55628..228f36ce60a 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -46,18 +46,6 @@ static StringInfo label_file; static StringInfo tblspc_map_file; /* - * Called when the backend exits with a running non-exclusive base backup, - * to clean up state. - */ -static void -nonexclusive_base_backup_cleanup(int code, Datum arg) -{ - do_pg_abort_backup(); - ereport(WARNING, - (errmsg("aborting backup due to backend exiting before pg_stop_backup was called"))); -} - -/* * pg_start_backup: set up for taking an on-line backup dump * * Essentially what this does is to create a backup label file in $PGDATA, @@ -104,10 +92,10 @@ pg_start_backup(PG_FUNCTION_ARGS) tblspc_map_file = makeStringInfo(); MemoryContextSwitchTo(oldcontext); + register_persistent_abort_backup_handler(); + startpoint = do_pg_start_backup(backupidstr, fast, NULL, label_file, NULL, tblspc_map_file, false, true); - - before_shmem_exit(nonexclusive_base_backup_cleanup, (Datum) 0); } PG_RETURN_LSN(startpoint); @@ -249,7 +237,6 @@ pg_stop_backup_v2(PG_FUNCTION_ARGS) * and tablespace map so they can be written to disk by the caller. */ stoppoint = do_pg_stop_backup(label_file->data, waitforarchive, NULL); - cancel_before_shmem_exit(nonexclusive_base_backup_cleanup, (Datum) 0); values[1] = CStringGetTextDatum(label_file->data); values[2] = CStringGetTextDatum(tblspc_map_file->data); |