You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-11-05 04:30:41 +03: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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user