PostgreSQL Source Code  git master
bbstreamer_inject.c File Reference
#include "postgres_fe.h"
#include "bbstreamer.h"
#include "common/file_perm.h"
#include "common/logging.h"
Include dependency graph for bbstreamer_inject.c:

Go to the source code of this file.

Data Structures

struct  bbstreamer_recovery_injector
 

Typedefs

typedef struct bbstreamer_recovery_injector bbstreamer_recovery_injector
 

Functions

static void bbstreamer_recovery_injector_content (bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
 
static void bbstreamer_recovery_injector_finalize (bbstreamer *streamer)
 
static void bbstreamer_recovery_injector_free (bbstreamer *streamer)
 
bbstreamerbbstreamer_recovery_injector_new (bbstreamer *next, bool is_recovery_guc_supported, PQExpBuffer recoveryconfcontents)
 
void bbstreamer_inject_file (bbstreamer *streamer, char *pathname, char *data, int len)
 

Variables

const bbstreamer_ops bbstreamer_recovery_injector_ops
 

Typedef Documentation

◆ bbstreamer_recovery_injector

Function Documentation

◆ bbstreamer_inject_file()

void bbstreamer_inject_file ( bbstreamer streamer,
char *  pathname,
char *  data,
int  len 
)

Definition at line 219 of file bbstreamer_inject.c.

221 {
222  bbstreamer_member member;
223 
224  strlcpy(member.pathname, pathname, MAXPGPATH);
225  member.size = len;
226  member.mode = pg_file_create_mode;
227  member.is_directory = false;
228  member.is_link = false;
229  member.linktarget[0] = '\0';
230 
231  /*
232  * There seems to be no principled argument for these values, but they are
233  * what PostgreSQL has historically used.
234  */
235  member.uid = 04000;
236  member.gid = 02000;
237 
238  /*
239  * We don't know here how to generate valid member headers and trailers
240  * for the archiving format in use, so if those are needed, some successor
241  * bbstreamer will have to generate them using the data from 'member'.
242  */
243  bbstreamer_content(streamer, &member, NULL, 0,
245  bbstreamer_content(streamer, &member, data, len,
247  bbstreamer_content(streamer, &member, NULL, 0,
249 }
static void bbstreamer_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)
Definition: bbstreamer.h:126
@ BBSTREAMER_MEMBER_HEADER
Definition: bbstreamer.h:56
@ BBSTREAMER_MEMBER_TRAILER
Definition: bbstreamer.h:58
@ BBSTREAMER_MEMBER_CONTENTS
Definition: bbstreamer.h:57
int pg_file_create_mode
Definition: file_perm.c:19
#define MAXPGPATH
const void size_t len
const void * data
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
char pathname[MAXPGPATH]
Definition: bbstreamer.h:72
char linktarget[MAXPGPATH]
Definition: bbstreamer.h:79

References bbstreamer_content(), BBSTREAMER_MEMBER_CONTENTS, BBSTREAMER_MEMBER_HEADER, BBSTREAMER_MEMBER_TRAILER, data, bbstreamer_member::gid, bbstreamer_member::is_directory, bbstreamer_member::is_link, len, bbstreamer_member::linktarget, MAXPGPATH, bbstreamer_member::mode, bbstreamer_member::pathname, pg_file_create_mode, bbstreamer_member::size, strlcpy(), and bbstreamer_member::uid.

Referenced by bbstreamer_recovery_injector_content(), ReceiveArchiveStream(), and ReceiveTarFile().

◆ bbstreamer_recovery_injector_content()

static void bbstreamer_recovery_injector_content ( bbstreamer streamer,
bbstreamer_member member,
const char *  data,
int  len,
bbstreamer_archive_context  context 
)
static

Definition at line 85 of file bbstreamer_inject.c.

89 {
90  bbstreamer_recovery_injector *mystreamer;
91 
92  mystreamer = (bbstreamer_recovery_injector *) streamer;
93  Assert(member != NULL || context == BBSTREAMER_ARCHIVE_TRAILER);
94 
95  switch (context)
96  {
98  /* Must copy provided data so we have the option to modify it. */
99  memcpy(&mystreamer->member, member, sizeof(bbstreamer_member));
100 
101  /*
102  * On v12+, skip standby.signal and edit postgresql.auto.conf; on
103  * older versions, skip recovery.conf.
104  */
105  if (mystreamer->is_recovery_guc_supported)
106  {
107  mystreamer->skip_file =
108  (strcmp(member->pathname, "standby.signal") == 0);
109  mystreamer->is_postgresql_auto_conf =
110  (strcmp(member->pathname, "postgresql.auto.conf") == 0);
111  if (mystreamer->is_postgresql_auto_conf)
112  {
113  /* Remember we saw it so we don't add it again. */
114  mystreamer->found_postgresql_auto_conf = true;
115 
116  /* Increment length by data to be injected. */
117  mystreamer->member.size +=
118  mystreamer->recoveryconfcontents->len;
119 
120  /*
121  * Zap data and len because the archive header is no
122  * longer valid; some subsequent bbstreamer must
123  * regenerate it if it's necessary.
124  */
125  data = NULL;
126  len = 0;
127  }
128  }
129  else
130  mystreamer->skip_file =
131  (strcmp(member->pathname, "recovery.conf") == 0);
132 
133  /* Do not forward if the file is to be skipped. */
134  if (mystreamer->skip_file)
135  return;
136  break;
137 
139  /* Do not forward if the file is to be skipped. */
140  if (mystreamer->skip_file)
141  return;
142  break;
143 
145  /* Do not forward it the file is to be skipped. */
146  if (mystreamer->skip_file)
147  return;
148 
149  /* Append provided content to whatever we already sent. */
150  if (mystreamer->is_postgresql_auto_conf)
151  bbstreamer_content(mystreamer->base.bbs_next, member,
152  mystreamer->recoveryconfcontents->data,
153  mystreamer->recoveryconfcontents->len,
155  break;
156 
158  if (mystreamer->is_recovery_guc_supported)
159  {
160  /*
161  * If we didn't already find (and thus modify)
162  * postgresql.auto.conf, inject it as an additional archive
163  * member now.
164  */
165  if (!mystreamer->found_postgresql_auto_conf)
167  "postgresql.auto.conf",
168  mystreamer->recoveryconfcontents->data,
169  mystreamer->recoveryconfcontents->len);
170 
171  /* Inject empty standby.signal file. */
173  "standby.signal", "", 0);
174  }
175  else
176  {
177  /* Inject recovery.conf file with specified contents. */
179  "recovery.conf",
180  mystreamer->recoveryconfcontents->data,
181  mystreamer->recoveryconfcontents->len);
182  }
183 
184  /* Nothing to do here. */
185  break;
186 
187  default:
188  /* Shouldn't happen. */
189  pg_fatal("unexpected state while injecting recovery settings");
190  }
191 
192  bbstreamer_content(mystreamer->base.bbs_next, &mystreamer->member,
193  data, len, context);
194 }
@ BBSTREAMER_ARCHIVE_TRAILER
Definition: bbstreamer.h:59
void bbstreamer_inject_file(bbstreamer *streamer, char *pathname, char *data, int len)
Assert(fmt[strlen(fmt) - 1] !='\n')
#define pg_fatal(...)
bbstreamer * bbs_next
Definition: bbstreamer.h:101

References Assert(), bbstreamer_recovery_injector::base, bbstreamer::bbs_next, BBSTREAMER_ARCHIVE_TRAILER, bbstreamer_content(), bbstreamer_inject_file(), BBSTREAMER_MEMBER_CONTENTS, BBSTREAMER_MEMBER_HEADER, BBSTREAMER_MEMBER_TRAILER, PQExpBufferData::data, data, bbstreamer_recovery_injector::found_postgresql_auto_conf, bbstreamer_recovery_injector::is_postgresql_auto_conf, bbstreamer_recovery_injector::is_recovery_guc_supported, PQExpBufferData::len, len, bbstreamer_recovery_injector::member, bbstreamer_member::pathname, pg_fatal, bbstreamer_recovery_injector::recoveryconfcontents, bbstreamer_member::size, and bbstreamer_recovery_injector::skip_file.

◆ bbstreamer_recovery_injector_finalize()

static void bbstreamer_recovery_injector_finalize ( bbstreamer streamer)
static

Definition at line 200 of file bbstreamer_inject.c.

201 {
202  bbstreamer_finalize(streamer->bbs_next);
203 }
static void bbstreamer_finalize(bbstreamer *streamer)
Definition: bbstreamer.h:136

References bbstreamer::bbs_next, and bbstreamer_finalize().

◆ bbstreamer_recovery_injector_free()

static void bbstreamer_recovery_injector_free ( bbstreamer streamer)
static

Definition at line 209 of file bbstreamer_inject.c.

210 {
211  bbstreamer_free(streamer->bbs_next);
212  pfree(streamer);
213 }
static void bbstreamer_free(bbstreamer *streamer)
Definition: bbstreamer.h:144
void pfree(void *pointer)
Definition: mcxt.c:1252

References bbstreamer::bbs_next, bbstreamer_free(), and pfree().

◆ bbstreamer_recovery_injector_new()

bbstreamer* bbstreamer_recovery_injector_new ( bbstreamer next,
bool  is_recovery_guc_supported,
PQExpBuffer  recoveryconfcontents 
)

Definition at line 65 of file bbstreamer_inject.c.

68 {
70 
71  streamer = palloc0(sizeof(bbstreamer_recovery_injector));
72  *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
74  streamer->base.bbs_next = next;
75  streamer->is_recovery_guc_supported = is_recovery_guc_supported;
77 
78  return &streamer->base;
79 }
const bbstreamer_ops bbstreamer_recovery_injector_ops
static int32 next
Definition: blutils.c:219
void * palloc0(Size size)
Definition: mcxt.c:1176
static PQExpBuffer recoveryconfcontents
const bbstreamer_ops * bbs_ops
Definition: bbstreamer.h:100

References bbstreamer_recovery_injector::base, bbstreamer::bbs_next, bbstreamer::bbs_ops, bbstreamer_recovery_injector_ops, bbstreamer_recovery_injector::is_recovery_guc_supported, next, palloc0(), bbstreamer_recovery_injector::recoveryconfcontents, and recoveryconfcontents.

Referenced by CreateBackupStreamer().

Variable Documentation

◆ bbstreamer_recovery_injector_ops

const bbstreamer_ops bbstreamer_recovery_injector_ops
Initial value:
= {
}
static void bbstreamer_recovery_injector_finalize(bbstreamer *streamer)
static void bbstreamer_recovery_injector_free(bbstreamer *streamer)
static void bbstreamer_recovery_injector_content(bbstreamer *streamer, bbstreamer_member *member, const char *data, int len, bbstreamer_archive_context context)

Definition at line 36 of file bbstreamer_inject.c.

Referenced by bbstreamer_recovery_injector_new().