1
0
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:
David Steele
2020-07-09 17:32:36 -04:00
parent 2f7823c627
commit d5df3974b5
8 changed files with 65 additions and 26 deletions

View File

@ -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));

View File

@ -106,6 +106,7 @@ PostgreSQL WAL Info
typedef struct PgWal
{
unsigned int version;
unsigned int size;
uint64_t systemId;
} PgWal;

View File

@ -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