Make XLog storage extensible
and allow extensions to override it For now, it extends on `pread` and `pwrite` from/into segment files. This is the minimum we need for full XLog encryption with pg_de.
This commit is contained in:
parent
4a3f56c5f8
commit
8e1dd620fb
@ -61,6 +61,7 @@
|
|||||||
#include "access/xloginsert.h"
|
#include "access/xloginsert.h"
|
||||||
#include "access/xlogreader.h"
|
#include "access/xlogreader.h"
|
||||||
#include "access/xlogrecovery.h"
|
#include "access/xlogrecovery.h"
|
||||||
|
#include "access/xlog_smgr.h"
|
||||||
#include "access/xlogutils.h"
|
#include "access/xlogutils.h"
|
||||||
#include "backup/basebackup.h"
|
#include "backup/basebackup.h"
|
||||||
#include "catalog/catversion.h"
|
#include "catalog/catversion.h"
|
||||||
@ -2442,7 +2443,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
|
|||||||
INSTR_TIME_SET_ZERO(start);
|
INSTR_TIME_SET_ZERO(start);
|
||||||
|
|
||||||
pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE);
|
pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE);
|
||||||
written = pg_pwrite(openLogFile, from, nleft, startoffset);
|
written = xlog_smgr->seg_write(openLogFile, from, nleft, startoffset);
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "access/xlog_internal.h"
|
#include "access/xlog_internal.h"
|
||||||
#include "access/xlogreader.h"
|
#include "access/xlogreader.h"
|
||||||
#include "access/xlogrecord.h"
|
#include "access/xlogrecord.h"
|
||||||
|
#include "access/xlog_smgr.h"
|
||||||
#include "catalog/pg_control.h"
|
#include "catalog/pg_control.h"
|
||||||
#include "common/pg_lzcompress.h"
|
#include "common/pg_lzcompress.h"
|
||||||
#include "replication/origin.h"
|
#include "replication/origin.h"
|
||||||
@ -63,6 +64,21 @@ static void WALOpenSegmentInit(WALOpenSegment *seg, WALSegmentContext *segcxt,
|
|||||||
*/
|
*/
|
||||||
#define DEFAULT_DECODE_BUFFER_SIZE (64 * 1024)
|
#define DEFAULT_DECODE_BUFFER_SIZE (64 * 1024)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XLog storage manager
|
||||||
|
*
|
||||||
|
* TODO: should be in xlog.c or new xlog_smgr.c ?
|
||||||
|
* Now it's here because pg_rewind and other tools compile only
|
||||||
|
* w/ xlogreader.c
|
||||||
|
*/
|
||||||
|
XLogSmgr *xlog_smgr = &xlog_smgr_standard;
|
||||||
|
|
||||||
|
void
|
||||||
|
SetXLogSmgr(XLogSmgr *xlsmgr)
|
||||||
|
{
|
||||||
|
xlog_smgr = xlsmgr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Construct a string in state->errormsg_buf explaining what's wrong with
|
* Construct a string in state->errormsg_buf explaining what's wrong with
|
||||||
* the current record being read.
|
* the current record being read.
|
||||||
@ -1557,7 +1573,7 @@ WALRead(XLogReaderState *state,
|
|||||||
|
|
||||||
/* Reset errno first; eases reporting non-errno-affecting errors */
|
/* Reset errno first; eases reporting non-errno-affecting errors */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
readbytes = pg_pread(state->seg.ws_file, p, segbytes, (off_t) startoff);
|
readbytes = xlog_smgr->seg_read(state->seg.ws_file, p, segbytes, (off_t) startoff);
|
||||||
|
|
||||||
#ifndef FRONTEND
|
#ifndef FRONTEND
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "access/xlogprefetcher.h"
|
#include "access/xlogprefetcher.h"
|
||||||
#include "access/xlogreader.h"
|
#include "access/xlogreader.h"
|
||||||
#include "access/xlogrecovery.h"
|
#include "access/xlogrecovery.h"
|
||||||
|
#include "access/xlog_smgr.h"
|
||||||
#include "access/xlogutils.h"
|
#include "access/xlogutils.h"
|
||||||
#include "backup/basebackup.h"
|
#include "backup/basebackup.h"
|
||||||
#include "catalog/pg_control.h"
|
#include "catalog/pg_control.h"
|
||||||
@ -3397,7 +3398,7 @@ retry:
|
|||||||
readOff = targetPageOff;
|
readOff = targetPageOff;
|
||||||
|
|
||||||
pgstat_report_wait_start(WAIT_EVENT_WAL_READ);
|
pgstat_report_wait_start(WAIT_EVENT_WAL_READ);
|
||||||
r = pg_pread(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff);
|
r = xlog_smgr->seg_read(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff);
|
||||||
if (r != XLOG_BLCKSZ)
|
if (r != XLOG_BLCKSZ)
|
||||||
{
|
{
|
||||||
char fname[MAXFNAMELEN];
|
char fname[MAXFNAMELEN];
|
||||||
|
@ -57,6 +57,7 @@
|
|||||||
#include "access/xlog_internal.h"
|
#include "access/xlog_internal.h"
|
||||||
#include "access/xlogarchive.h"
|
#include "access/xlogarchive.h"
|
||||||
#include "access/xlogrecovery.h"
|
#include "access/xlogrecovery.h"
|
||||||
|
#include "access/xlog_smgr.h"
|
||||||
#include "catalog/pg_authid.h"
|
#include "catalog/pg_authid.h"
|
||||||
#include "funcapi.h"
|
#include "funcapi.h"
|
||||||
#include "libpq/pqformat.h"
|
#include "libpq/pqformat.h"
|
||||||
@ -941,7 +942,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli)
|
|||||||
/* OK to write the logs */
|
/* OK to write the logs */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
byteswritten = pg_pwrite(recvFile, buf, segbytes, (off_t) startoff);
|
byteswritten = xlog_smgr->seg_write(recvFile, buf, segbytes, (off_t) startoff);
|
||||||
if (byteswritten <= 0)
|
if (byteswritten <= 0)
|
||||||
{
|
{
|
||||||
char xlogfname[MAXFNAMELEN];
|
char xlogfname[MAXFNAMELEN];
|
||||||
|
@ -78,8 +78,10 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader;
|
|||||||
#define XLP_BKP_REMOVABLE 0x0004
|
#define XLP_BKP_REMOVABLE 0x0004
|
||||||
/* Replaces a missing contrecord; see CreateOverwriteContrecordRecord */
|
/* Replaces a missing contrecord; see CreateOverwriteContrecordRecord */
|
||||||
#define XLP_FIRST_IS_OVERWRITE_CONTRECORD 0x0008
|
#define XLP_FIRST_IS_OVERWRITE_CONTRECORD 0x0008
|
||||||
|
/* The page is encrypted */
|
||||||
|
#define XLP_ENCRYPTED 0x0010
|
||||||
/* All defined flag bits in xlp_info (used for validity checking of header) */
|
/* All defined flag bits in xlp_info (used for validity checking of header) */
|
||||||
#define XLP_ALL_FLAGS 0x000F
|
#define XLP_ALL_FLAGS 0x001F
|
||||||
|
|
||||||
#define XLogPageHeaderSize(hdr) \
|
#define XLogPageHeaderSize(hdr) \
|
||||||
(((hdr)->xlp_info & XLP_LONG_HEADER) ? SizeOfXLogLongPHD : SizeOfXLogShortPHD)
|
(((hdr)->xlp_info & XLP_LONG_HEADER) ? SizeOfXLogLongPHD : SizeOfXLogShortPHD)
|
||||||
|
24
src/include/access/xlog_smgr.h
Normal file
24
src/include/access/xlog_smgr.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef XLOG_SMGR_H
|
||||||
|
#define XLOG_SMGR_H
|
||||||
|
|
||||||
|
#include "postgres.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* XLog storage manager interface */
|
||||||
|
typedef struct XLogSmgr {
|
||||||
|
ssize_t (*seg_read) (int fd, void *buf, size_t count, off_t offset);
|
||||||
|
|
||||||
|
ssize_t (*seg_write) (int fd, const void *buf, size_t count, off_t offset);
|
||||||
|
} XLogSmgr;
|
||||||
|
|
||||||
|
/* Default (standard) XLog storage manager */
|
||||||
|
static const XLogSmgr xlog_smgr_standard = {
|
||||||
|
.seg_read = pg_pread,
|
||||||
|
.seg_write = pg_pwrite,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern XLogSmgr *xlog_smgr;
|
||||||
|
extern void SetXLogSmgr(XLogSmgr *xlsmgr);
|
||||||
|
|
||||||
|
#endif /* XLOG_SMGR_H */
|
Loading…
x
Reference in New Issue
Block a user