You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-07-03 00:26:59 +02:00
Read segment size from WAL headers.
This allows validation of the WAL segment size for PostgreSQL versions <= 10.
This commit is contained in:
@ -386,6 +386,27 @@ pgCatalogVersion(unsigned int pgVersion)
|
||||
FUNCTION_TEST_RETURN(pgInterfaceVersion(pgVersion)->catalogVersion());
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Check expected WAL segment size for older PostgreSQL versions
|
||||
***********************************************************************************************************************************/
|
||||
static void
|
||||
pgWalSegmentSizeCheck(unsigned int pgVersion, unsigned int walSegmentSize)
|
||||
{
|
||||
FUNCTION_TEST_BEGIN();
|
||||
FUNCTION_TEST_PARAM(UINT, pgVersion);
|
||||
FUNCTION_TEST_PARAM(UINT, walSegmentSize);
|
||||
FUNCTION_TEST_END();
|
||||
|
||||
if (pgVersion < PG_VERSION_11 && walSegmentSize != PG_WAL_SEGMENT_SIZE_DEFAULT)
|
||||
{
|
||||
THROW_FMT(
|
||||
FormatError, "wal segment size is %u but must be %u for " PG_NAME " <= " PG_VERSION_10_STR, walSegmentSize,
|
||||
PG_WAL_SEGMENT_SIZE_DEFAULT);
|
||||
}
|
||||
|
||||
FUNCTION_TEST_RETURN_VOID();
|
||||
}
|
||||
|
||||
/**********************************************************************************************************************************/
|
||||
PgControl
|
||||
pgControlFromBuffer(const Buffer *controlFile)
|
||||
@ -425,12 +446,7 @@ pgControlFromBuffer(const Buffer *controlFile)
|
||||
result.version = interface->version;
|
||||
|
||||
// Check the segment size
|
||||
if (result.version < PG_VERSION_11 && result.walSegmentSize != PG_WAL_SEGMENT_SIZE_DEFAULT)
|
||||
{
|
||||
THROW_FMT(
|
||||
FormatError, "wal segment size is %u but must be %u for " PG_NAME " <= " PG_VERSION_10_STR, result.walSegmentSize,
|
||||
PG_WAL_SEGMENT_SIZE_DEFAULT);
|
||||
}
|
||||
pgWalSegmentSizeCheck(result.version, result.walSegmentSize);
|
||||
|
||||
// Check the page size
|
||||
if (result.pageSize != PG_PAGE_SIZE_DEFAULT)
|
||||
@ -526,6 +542,9 @@ pgWalFromBuffer(const Buffer *walBuffer)
|
||||
PgWal result = interface->wal(bufPtrConst(walBuffer));
|
||||
result.version = interface->version;
|
||||
|
||||
// Check the segment size
|
||||
pgWalSegmentSizeCheck(result.version, result.size);
|
||||
|
||||
FUNCTION_LOG_RETURN(PG_WAL, result);
|
||||
}
|
||||
|
||||
@ -790,6 +809,10 @@ pgWalTestToBuffer(PgWal pgWal, Buffer *walBuffer)
|
||||
|
||||
ASSERT(walBuffer != NULL);
|
||||
|
||||
// Set default WAL segment size if not specified
|
||||
if (pgWal.size == 0)
|
||||
pgWal.size = PG_WAL_SEGMENT_SIZE_DEFAULT;
|
||||
|
||||
// Generate WAL
|
||||
pgInterfaceVersion(pgWal.version)->walTest(pgWal, bufPtr(walBuffer));
|
||||
|
||||
|
@ -106,6 +106,7 @@ PostgreSQL WAL Info
|
||||
typedef struct PgWal
|
||||
{
|
||||
unsigned int version;
|
||||
unsigned int size;
|
||||
uint64_t systemId;
|
||||
} PgWal;
|
||||
|
||||
|
@ -191,6 +191,7 @@ Read the version specific WAL header into a general data structure
|
||||
return (PgWal) \
|
||||
{ \
|
||||
.systemId = ((XLogLongPageHeaderData *)walFile)->xlp_sysid, \
|
||||
.size = ((XLogLongPageHeaderData *)walFile)->xlp_seg_size, \
|
||||
}; \
|
||||
}
|
||||
|
||||
@ -210,6 +211,7 @@ Create a WAL file file for testing
|
||||
((XLogLongPageHeaderData *)buffer)->std.xlp_magic = XLOG_PAGE_MAGIC; \
|
||||
((XLogLongPageHeaderData *)buffer)->std.xlp_info = XLP_LONG_HEADER; \
|
||||
((XLogLongPageHeaderData *)buffer)->xlp_sysid = pgWal.systemId; \
|
||||
((XLogLongPageHeaderData *)buffer)->xlp_seg_size = pgWal.size; \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user