diff options
author | Michael Paquier <michael@paquier.xyz> | 2022-09-26 11:15:47 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2022-09-26 11:15:47 +0900 |
commit | 7d708093b7400327658a30d1aa1d5e284d37622c (patch) | |
tree | ee2cbc99967484634c55100d4c8399f4452a8cef /src/backend/access/transam/xlogbackup.c | |
parent | 216f9c1ab3a4f333632ce576e1dc1e3643427eb8 (diff) | |
download | postgresql-7d708093b7400327658a30d1aa1d5e284d37622c.tar.gz postgresql-7d708093b7400327658a30d1aa1d5e284d37622c.zip |
Refactor creation of backup_label and backup history files
This change simplifies some of the logic related to the generation and
creation of the backup_label and backup history files, which has become
unnecessarily complicated since the removal of the exclusive backup mode
in commit 39969e2. The code was previously generating the contents of
these files as a string (start phase for the backup_label and stop phase
for the backup history file), one problem being that the contents of the
backup_label string were scanned to grab some of its internal contents
at the stop phase.
This commit changes the logic so as we store the data required to build
these files in an intermediate structure named BackupState. The
backup_label file and backup history file strings are generated when
they are ready to be sent back to the client. Both files are now
generated with the same code path. While on it, this commit renames
some variables for clarity.
Two new files named xlogbackup.{c,h} are introduced in this commit, to
remove from xlog.c some of the logic around base backups. Note that
more could be moved to this new set of files.
Author: Bharath Rupireddy, Michael Paquier
Reviewed-by: Fujii Masao
Discussion: https://postgr.es/m/CALj2ACXWwTDgJqCjdaPyfR7djwm6SrybGcrZyrvojzcsmt4FFw@mail.gmail.com
Diffstat (limited to 'src/backend/access/transam/xlogbackup.c')
-rw-r--r-- | src/backend/access/transam/xlogbackup.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlogbackup.c b/src/backend/access/transam/xlogbackup.c new file mode 100644 index 00000000000..c01c1f90102 --- /dev/null +++ b/src/backend/access/transam/xlogbackup.c @@ -0,0 +1,80 @@ +/*------------------------------------------------------------------------- + * + * xlogbackup.c + * Internal routines for base backups. + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/access/transam/xlogbackup.c + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/xlog.h" +#include "access/xlog_internal.h" +#include "access/xlogbackup.h" + +/* + * Build contents for backup_label or backup history file. + * + * When ishistoryfile is true, it creates the contents for a backup history + * file, otherwise it creates contents for a backup_label file. + * + * Returns the result generated as a palloc'd StringInfo. + */ +StringInfo +build_backup_content(BackupState *state, bool ishistoryfile) +{ + char startstrbuf[128]; + char startxlogfile[MAXFNAMELEN]; /* backup start WAL file */ + XLogSegNo startsegno; + StringInfo result = makeStringInfo(); + + Assert(state != NULL); + + /* Use the log timezone here, not the session timezone */ + pg_strftime(startstrbuf, sizeof(startstrbuf), "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&state->starttime, log_timezone)); + + XLByteToSeg(state->startpoint, startsegno, wal_segment_size); + XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size); + appendStringInfo(result, "START WAL LOCATION: %X/%X (file %s)\n", + LSN_FORMAT_ARGS(state->startpoint), startxlogfile); + + if (ishistoryfile) + { + char stopxlogfile[MAXFNAMELEN]; /* backup stop WAL file */ + XLogSegNo stopsegno; + + XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size); + XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size); + appendStringInfo(result, "STOP WAL LOCATION: %X/%X (file %s)\n", + LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile); + } + + appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n", + LSN_FORMAT_ARGS(state->checkpointloc)); + appendStringInfo(result, "BACKUP METHOD: streamed\n"); + appendStringInfo(result, "BACKUP FROM: %s\n", + state->started_in_recovery ? "standby" : "primary"); + appendStringInfo(result, "START TIME: %s\n", startstrbuf); + appendStringInfo(result, "LABEL: %s\n", state->name); + appendStringInfo(result, "START TIMELINE: %u\n", state->starttli); + + if (ishistoryfile) + { + char stopstrfbuf[128]; + + /* Use the log timezone here, not the session timezone */ + pg_strftime(stopstrfbuf, sizeof(stopstrfbuf), "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&state->stoptime, log_timezone)); + + appendStringInfo(result, "STOP TIME: %s\n", stopstrfbuf); + appendStringInfo(result, "STOP TIMELINE: %u\n", state->stoptli); + } + + return result; +} |