Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/backend/access/transam/xlog.c
Original file line number Diff line number Diff line change
Expand Up @@ -8967,6 +8967,12 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces,
WALInsertLockRelease();
} while (!gotUniqueStartpoint);

/* TODO: we should rather check if the last WAL key is encrypted */
if (access("pg_tde/wal_keys", F_OK) == 0)
{
state->tde_have_wal_keys = true;
}

/*
* Construct tablespace_map file.
*/
Expand Down
1 change: 1 addition & 0 deletions src/backend/backup/basebackup.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink,

state.startptr = backup_state->startpoint;
state.starttli = backup_state->starttli;
state.tde_have_wal_keys = backup_state->tde_have_wal_keys;

/*
* Once do_pg_backup_start has been called, ensure that any failure causes
Expand Down
18 changes: 11 additions & 7 deletions src/backend/backup/basebackup_copy.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ static void bbsink_copystream_cleanup(bbsink *sink);

static void SendCopyOutResponse(void);
static void SendCopyDone(void);
static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli);
static void SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli, bool wal_keys);
static void SendTablespaceList(List *tablespaces);

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

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

/* Send client a list of tablespaces. */
SendTablespaceList(state->tablespaces);
Expand Down Expand Up @@ -298,7 +298,7 @@ bbsink_copystream_end_backup(bbsink *sink, XLogRecPtr endptr,
TimeLineID endtli)
{
SendCopyDone();
SendXlogRecPtrResult(endptr, endtli);
SendXlogRecPtrResult(endptr, endtli, false);
}

/*
Expand Down Expand Up @@ -338,17 +338,17 @@ SendCopyDone(void)
* XLogRecPtr record (in text format)
*/
static void
SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli)
SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli, bool wal_keys)
{
DestReceiver *dest;
TupOutputState *tstate;
TupleDesc tupdesc;
Datum values[2];
bool nulls[2] = {0};
Datum values[3];
bool nulls[3] = {0};

dest = CreateDestReceiver(DestRemoteSimple);

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

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


TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 3, "walkeys", INT4OID, -1, 0);

/* send RowDescription */
tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsVirtual);

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

end_tup_output(tstate);
Expand Down
15 changes: 15 additions & 0 deletions src/bin/pg_basebackup/pg_basebackup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1794,6 +1794,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
serverMajor;
int writing_to_stdout;
bool use_new_option_syntax = false;
bool tde_src_wal_keys = false;
PQExpBufferData buf;

Assert(conn != NULL);
Expand Down Expand Up @@ -2058,6 +2059,10 @@ BaseBackup(char *compression_algorithm, char *compression_detail,
starttli = atoi(PQgetvalue(res, 0, 1));
else
starttli = latesttli;

if (PQnfields(res) >= 3)
tde_src_wal_keys = atoi(PQgetvalue(res, 0, 2));

PQclear(res);

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

#ifdef PERCONA_EXT
{
char tde_wal_keys_file[MAXPGPATH];

snprintf(tde_wal_keys_file, sizeof(tde_wal_keys_file), "%s/%s/%s", basedir, PG_TDE_DATA_DIR, "wal_keys");

if (tde_src_wal_keys && access(tde_wal_keys_file, F_OK) != 0)
pg_fatal("could not start WAL receiver, copy pg_tde from the source to the destination dir");
}
#endif
if (client_compress->algorithm == PG_COMPRESSION_GZIP)
{
wal_compress_algorithm = PG_COMPRESSION_GZIP;
Expand Down
1 change: 1 addition & 0 deletions src/include/access/xlogbackup.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ typedef struct BackupState
bool started_in_recovery; /* backup started in recovery? */
XLogRecPtr istartpoint; /* incremental based on backup at this LSN */
TimeLineID istarttli; /* incremental based on backup on this TLI */
bool tde_have_wal_keys;

/* Fields saved at the end of backup */
XLogRecPtr stoppoint; /* backup stop WAL location */
Expand Down
1 change: 1 addition & 0 deletions src/include/backup/basebackup_sink.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ typedef struct bbsink_state
bool bytes_total_is_valid;
XLogRecPtr startptr;
TimeLineID starttli;
bool tde_have_wal_keys;
} bbsink_state;

/*
Expand Down