1
0
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:
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));