PostgreSQL Source Code  git master
xlogbackup.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * xlogbackup.c
4  * Internal routines for base backups.
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/backend/access/transam/xlogbackup.c
11  *-------------------------------------------------------------------------
12  */
13 
14 #include "postgres.h"
15 
16 #include "access/xlog.h"
17 #include "access/xlog_internal.h"
18 #include "access/xlogbackup.h"
19 
20 /*
21  * Build contents for backup_label or backup history file.
22  *
23  * When ishistoryfile is true, it creates the contents for a backup history
24  * file, otherwise it creates contents for a backup_label file.
25  *
26  * Returns the result generated as a palloc'd string.
27  */
28 char *
29 build_backup_content(BackupState *state, bool ishistoryfile)
30 {
31  char startstrbuf[128];
32  char startxlogfile[MAXFNAMELEN]; /* backup start WAL file */
33  XLogSegNo startsegno;
34  StringInfo result = makeStringInfo();
35  char *data;
36 
37  Assert(state != NULL);
38 
39  /* Use the log timezone here, not the session timezone */
40  pg_strftime(startstrbuf, sizeof(startstrbuf), "%Y-%m-%d %H:%M:%S %Z",
41  pg_localtime(&state->starttime, log_timezone));
42 
43  XLByteToSeg(state->startpoint, startsegno, wal_segment_size);
44  XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size);
45  appendStringInfo(result, "START WAL LOCATION: %X/%X (file %s)\n",
46  LSN_FORMAT_ARGS(state->startpoint), startxlogfile);
47 
48  if (ishistoryfile)
49  {
50  char stopxlogfile[MAXFNAMELEN]; /* backup stop WAL file */
51  XLogSegNo stopsegno;
52 
53  XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size);
54  XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size);
55  appendStringInfo(result, "STOP WAL LOCATION: %X/%X (file %s)\n",
56  LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile);
57  }
58 
59  appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n",
60  LSN_FORMAT_ARGS(state->checkpointloc));
61  appendStringInfoString(result, "BACKUP METHOD: streamed\n");
62  appendStringInfo(result, "BACKUP FROM: %s\n",
63  state->started_in_recovery ? "standby" : "primary");
64  appendStringInfo(result, "START TIME: %s\n", startstrbuf);
65  appendStringInfo(result, "LABEL: %s\n", state->name);
66  appendStringInfo(result, "START TIMELINE: %u\n", state->starttli);
67 
68  if (ishistoryfile)
69  {
70  char stopstrfbuf[128];
71 
72  /* Use the log timezone here, not the session timezone */
73  pg_strftime(stopstrfbuf, sizeof(stopstrfbuf), "%Y-%m-%d %H:%M:%S %Z",
74  pg_localtime(&state->stoptime, log_timezone));
75 
76  appendStringInfo(result, "STOP TIME: %s\n", stopstrfbuf);
77  appendStringInfo(result, "STOP TIMELINE: %u\n", state->stoptli);
78  }
79 
80  /* either both istartpoint and istarttli should be set, or neither */
81  Assert(XLogRecPtrIsInvalid(state->istartpoint) == (state->istarttli == 0));
82  if (!XLogRecPtrIsInvalid(state->istartpoint))
83  {
84  appendStringInfo(result, "INCREMENTAL FROM LSN: %X/%X\n",
85  LSN_FORMAT_ARGS(state->istartpoint));
86  appendStringInfo(result, "INCREMENTAL FROM TLI: %u\n",
87  state->istarttli);
88  }
89 
90  data = result->data;
91  pfree(result);
92 
93  return data;
94 }
#define Assert(condition)
Definition: c.h:858
void pfree(void *pointer)
Definition: mcxt.c:1520
const void * data
struct pg_tm * pg_localtime(const pg_time_t *timep, const pg_tz *tz)
Definition: localtime.c:1344
size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t)
Definition: strftime.c:128
PGDLLIMPORT pg_tz * log_timezone
Definition: pgtz.c:31
StringInfo makeStringInfo(void)
Definition: stringinfo.c:41
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:97
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:182
Definition: regguts.h:323
int wal_segment_size
Definition: xlog.c:143
#define MAXFNAMELEN
#define XLByteToSeg(xlrp, logSegNo, wal_segsz_bytes)
static void XLogFileName(char *fname, TimeLineID tli, XLogSegNo logSegNo, int wal_segsz_bytes)
char * build_backup_content(BackupState *state, bool ishistoryfile)
Definition: xlogbackup.c:29
#define LSN_FORMAT_ARGS(lsn)
Definition: xlogdefs.h:43
#define XLogRecPtrIsInvalid(r)
Definition: xlogdefs.h:29
uint64 XLogSegNo
Definition: xlogdefs.h:48