Skip to content

Commit d986221

Browse files
committed
PG-1857 Do not start basebackup w/o WAL keys
1 parent d83b36e commit d986221

File tree

6 files changed

+35
-7
lines changed

6 files changed

+35
-7
lines changed

src/backend/access/transam/xlog.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8967,6 +8967,12 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces,
89678967
WALInsertLockRelease();
89688968
} while (!gotUniqueStartpoint);
89698969

8970+
/* TODO: we should rather check if the last WAL key is encrypted */
8971+
if (access("pg_tde/wal_keys", F_OK) == 0)
8972+
{
8973+
state->tde_have_wal_keys = true;
8974+
}
8975+
89708976
/*
89718977
* Construct tablespace_map file.
89728978
*/

src/backend/backup/basebackup.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink,
269269

270270
state.startptr = backup_state->startpoint;
271271
state.starttli = backup_state->starttli;
272+
state.tde_have_wal_keys = backup_state->tde_have_wal_keys;
272273

273274
/*
274275
* Once do_pg_backup_start has been called, ensure that any failure causes

src/backend/backup/basebackup_copy.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static void bbsink_copystream_cleanup(bbsink *sink);
8686

8787
static void SendCopyOutResponse(void);
8888
static void SendCopyDone(void);
89-
static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli);
89+
static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli, bool wal_keys);
9090
static void SendTablespaceList(List *tablespaces);
9191

9292
static const bbsink_ops bbsink_copystream_ops = {
@@ -146,7 +146,7 @@ bbsink_copystream_begin_backup(bbsink *sink)
146146
mysink->msgbuffer[0] = 'd'; /* archive or manifest data */
147147

148148
/* Tell client the backup start location. */
149-
SendXlogRecPtrResult(state->startptr, state->starttli);
149+
SendXlogRecPtrResult(state->startptr, state->starttli, state->tde_have_wal_keys);
150150

151151
/* Send client a list of tablespaces. */
152152
SendTablespaceList(state->tablespaces);
@@ -298,7 +298,7 @@ bbsink_copystream_end_backup(bbsink *sink, XLogRecPtr endptr,
298298
TimeLineID endtli)
299299
{
300300
SendCopyDone();
301-
SendXlogRecPtrResult(endptr, endtli);
301+
SendXlogRecPtrResult(endptr, endtli, false);
302302
}
303303

304304
/*
@@ -338,17 +338,17 @@ SendCopyDone(void)
338338
* XLogRecPtr record (in text format)
339339
*/
340340
static void
341-
SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
341+
SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli, bool wal_keys)
342342
{
343343
DestReceiver *dest;
344344
TupOutputState *tstate;
345345
TupleDesc tupdesc;
346-
Datum values[2];
347-
bool nulls[2] = {0};
346+
Datum values[3];
347+
bool nulls[3] = {0};
348348

349349
dest = CreateDestReceiver(DestRemoteSimple);
350350

351-
tupdesc = CreateTemplateTupleDesc(2);
351+
tupdesc = CreateTemplateTupleDesc(3);
352352
TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 1, "recptr", TEXTOID, -1, 0);
353353

354354
/*
@@ -357,12 +357,16 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
357357
*/
358358
TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 2, "tli", INT8OID, -1, 0);
359359

360+
361+
TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 3, "walkeys", INT4OID, -1, 0);
362+
360363
/* send RowDescription */
361364
tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsVirtual);
362365

363366
/* Data row */
364367
values[0] = CStringGetTextDatum(psprintf("%X/%X", LSN_FORMAT_ARGS(ptr)));
365368
values[1] = Int64GetDatum(tli);
369+
values[2] = BoolGetDatum(wal_keys);
366370
do_tup_output(tstate, values, nulls);
367371

368372
end_tup_output(tstate);

src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,6 +1794,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
17941794
serverMajor;
17951795
int writing_to_stdout;
17961796
bool use_new_option_syntax = false;
1797+
bool tde_src_wal_keys = false;
17971798
PQExpBufferData buf;
17981799

17991800
Assert(conn != NULL);
@@ -2058,6 +2059,10 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
20582059
starttli = atoi(PQgetvalue(res, 0, 1));
20592060
else
20602061
starttli = latesttli;
2062+
2063+
if (PQnfields(res) >= 3)
2064+
tde_src_wal_keys = atoi(PQgetvalue(res, 0, 2));
2065+
20612066
PQclear(res);
20622067

20632068
if (verbose && includewal != NO_WAL)
@@ -2130,6 +2135,16 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
21302135
if (verbose)
21312136
pg_log_info("starting background WAL receiver");
21322137

2138+
#ifdef PERCONA_EXT
2139+
{
2140+
char tde_wal_keys_file[MAXPGPATH];
2141+
2142+
snprintf(tde_wal_keys_file, sizeof(tde_wal_keys_file), "%s/%s/%s", basedir, PG_TDE_DATA_DIR, "wal_keys");
2143+
2144+
if (tde_src_wal_keys && access(tde_wal_keys_file, F_OK) != 0)
2145+
pg_fatal("could not start WAL receiver, copy pg_tde from the source to the destination dir");
2146+
}
2147+
#endif
21332148
if (client_compress->algorithm == PG_COMPRESSION_GZIP)
21342149
{
21352150
wal_compress_algorithm = PG_COMPRESSION_GZIP;

src/include/access/xlogbackup.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ typedef struct BackupState
3030
bool started_in_recovery; /* backup started in recovery? */
3131
XLogRecPtr istartpoint; /* incremental based on backup at this LSN */
3232
TimeLineID istarttli; /* incremental based on backup on this TLI */
33+
bool tde_have_wal_keys;
3334

3435
/* Fields saved at the end of backup */
3536
XLogRecPtr stoppoint; /* backup stop WAL location */

src/include/backup/basebackup_sink.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ typedef struct bbsink_state
7272
bool bytes_total_is_valid;
7373
XLogRecPtr startptr;
7474
TimeLineID starttli;
75+
bool tde_have_wal_keys;
7576
} bbsink_state;
7677

7778
/*

0 commit comments

Comments
 (0)