You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-06-25 00:16:54 +02:00
Disable query parallelism in PostgreSQL sessions used for backup control.
There is no need to have parallelism enabled in a backup control session. In particular, 9.6 marks pg_stop_backup() as parallel-safe but an error will be thrown if pg_stop_backup() is run in a worker.
This commit is contained in:
@ -19,6 +19,10 @@
|
|||||||
<p>Asynchronous S3 multipart upload.</p>
|
<p>Asynchronous S3 multipart upload.</p>
|
||||||
</release-item>
|
</release-item>
|
||||||
|
|
||||||
|
<release-item>
|
||||||
|
<p>Disable query parallelism in <postgres/> sessions used for backup control.</p>
|
||||||
|
</release-item>
|
||||||
|
|
||||||
<release-item>
|
<release-item>
|
||||||
<release-item-contributor-list>
|
<release-item-contributor-list>
|
||||||
<release-item-reviewer id="cynthia.shang"/>
|
<release-item-reviewer id="cynthia.shang"/>
|
||||||
|
@ -236,6 +236,11 @@ dbOpen(Db *this)
|
|||||||
// Set application name to help identify the backup session
|
// Set application name to help identify the backup session
|
||||||
if (this->pgVersion >= PG_VERSION_APPLICATION_NAME)
|
if (this->pgVersion >= PG_VERSION_APPLICATION_NAME)
|
||||||
dbExec(this, strNewFmt("set application_name = '%s'", strPtr(this->applicationName)));
|
dbExec(this, strNewFmt("set application_name = '%s'", strPtr(this->applicationName)));
|
||||||
|
|
||||||
|
// There is no need to have parallelism enabled in a backup session. In particular, 9.6 marks pg_stop_backup() as
|
||||||
|
// parallel-safe but an error will be thrown if pg_stop_backup() is run in a worker.
|
||||||
|
if (this->pgVersion >= PG_VERSION_PARALLEL_QUERY)
|
||||||
|
dbExec(this, STRDEF("set max_parallel_workers_per_gather = 0"));
|
||||||
}
|
}
|
||||||
MEM_CONTEXT_TEMP_END();
|
MEM_CONTEXT_TEMP_END();
|
||||||
|
|
||||||
|
@ -52,6 +52,9 @@ Version where various PostgreSQL capabilities were introduced
|
|||||||
// recovery target action supported
|
// recovery target action supported
|
||||||
#define PG_VERSION_RECOVERY_TARGET_ACTION PG_VERSION_95
|
#define PG_VERSION_RECOVERY_TARGET_ACTION PG_VERSION_95
|
||||||
|
|
||||||
|
// parallel query supported
|
||||||
|
#define PG_VERSION_PARALLEL_QUERY PG_VERSION_96
|
||||||
|
|
||||||
// xlog was renamed to wal
|
// xlog was renamed to wal
|
||||||
#define PG_VERSION_WAL_RENAME PG_VERSION_10
|
#define PG_VERSION_WAL_RENAME PG_VERSION_10
|
||||||
|
|
||||||
|
@ -433,6 +433,13 @@ sub clusterStart
|
|||||||
$strCommand .= ' -c wal_level=hot_standby -c hot_standby=' . ($bHotStandby ? 'on' : 'off');
|
$strCommand .= ' -c wal_level=hot_standby -c hot_standby=' . ($bHotStandby ? 'on' : 'off');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Force parallel mode on to make sure we are disabling it and there are no issues. This is important for testing that 9.6
|
||||||
|
# works since pg_stop_backup() is marked parallel safe and will error if run in a worker.
|
||||||
|
if ($self->pgVersion() >= PG_VERSION_96)
|
||||||
|
{
|
||||||
|
$strCommand .= " -c force_parallel_mode='on' -c max_parallel_workers_per_gather=2";
|
||||||
|
}
|
||||||
|
|
||||||
$strCommand .=
|
$strCommand .=
|
||||||
($self->pgVersion() >= PG_VERSION_HOT_STANDBY ? ' -c max_wal_senders=3' : '') .
|
($self->pgVersion() >= PG_VERSION_HOT_STANDBY ? ' -c max_wal_senders=3' : '') .
|
||||||
' -c listen_addresses=\'*\'' .
|
' -c listen_addresses=\'*\'' .
|
||||||
|
@ -100,6 +100,16 @@ Macros for defining groups of functions that implement various queries and comma
|
|||||||
{.session = sessionParam, .function = HRNPQ_CLEAR}, \
|
{.session = sessionParam, .function = HRNPQ_CLEAR}, \
|
||||||
{.session = sessionParam, .function = HRNPQ_GETRESULT, .resultNull = true}
|
{.session = sessionParam, .function = HRNPQ_GETRESULT, .resultNull = true}
|
||||||
|
|
||||||
|
#define HRNPQ_MACRO_SET_MAX_PARALLEL_WORKERS_PER_GATHER(sessionParam) \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_SENDQUERY, .param = "[\"set max_parallel_workers_per_gather = 0\"]", \
|
||||||
|
.resultInt = 1}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_CONSUMEINPUT}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_ISBUSY}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_GETRESULT}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_RESULTSTATUS, .resultInt = PGRES_COMMAND_OK}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_CLEAR}, \
|
||||||
|
{.session = sessionParam, .function = HRNPQ_GETRESULT, .resultNull = true}
|
||||||
|
|
||||||
#define HRNPQ_MACRO_IS_STANDBY_QUERY(sessionParam, standbyParam) \
|
#define HRNPQ_MACRO_IS_STANDBY_QUERY(sessionParam, standbyParam) \
|
||||||
{.session = sessionParam, .function = HRNPQ_SENDQUERY, .param = "[\"select pg_catalog.pg_is_in_recovery()\"]", .resultInt = 1},\
|
{.session = sessionParam, .function = HRNPQ_SENDQUERY, .param = "[\"select pg_catalog.pg_is_in_recovery()\"]", .resultInt = 1},\
|
||||||
{.session = sessionParam, .function = HRNPQ_CONSUMEINPUT}, \
|
{.session = sessionParam, .function = HRNPQ_CONSUMEINPUT}, \
|
||||||
@ -506,6 +516,15 @@ Macros to simplify dbOpen() for specific database versions
|
|||||||
HRNPQ_MACRO_SET_APPLICATION_NAME(sessionParam), \
|
HRNPQ_MACRO_SET_APPLICATION_NAME(sessionParam), \
|
||||||
HRNPQ_MACRO_IS_STANDBY_QUERY(sessionParam, standbyParam)
|
HRNPQ_MACRO_IS_STANDBY_QUERY(sessionParam, standbyParam)
|
||||||
|
|
||||||
|
#define HRNPQ_MACRO_OPEN_GE_96(sessionParam, connectParam, pgVersion, pgPathParam, standbyParam, archiveMode, archiveCommand) \
|
||||||
|
HRNPQ_MACRO_OPEN(sessionParam, connectParam), \
|
||||||
|
HRNPQ_MACRO_SET_SEARCH_PATH(sessionParam), \
|
||||||
|
HRNPQ_MACRO_SET_CLIENT_ENCODING(sessionParam), \
|
||||||
|
HRNPQ_MACRO_VALIDATE_QUERY(sessionParam, pgVersion, pgPathParam, archiveMode, archiveCommand), \
|
||||||
|
HRNPQ_MACRO_SET_APPLICATION_NAME(sessionParam), \
|
||||||
|
HRNPQ_MACRO_SET_MAX_PARALLEL_WORKERS_PER_GATHER(sessionParam), \
|
||||||
|
HRNPQ_MACRO_IS_STANDBY_QUERY(sessionParam, standbyParam)
|
||||||
|
|
||||||
/***********************************************************************************************************************************
|
/***********************************************************************************************************************************
|
||||||
Data type constants
|
Data type constants
|
||||||
***********************************************************************************************************************************/
|
***********************************************************************************************************************************/
|
||||||
|
@ -353,10 +353,10 @@ testBackupPqScript(unsigned int pgVersion, time_t backupTimeStart, TestBackupPqS
|
|||||||
harnessPqScriptSet((HarnessPq [])
|
harnessPqScriptSet((HarnessPq [])
|
||||||
{
|
{
|
||||||
// Connect to primary
|
// Connect to primary
|
||||||
HRNPQ_MACRO_OPEN_GE_92(1, "dbname='postgres' port=5432", PG_VERSION_96, pg1Path, false, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(1, "dbname='postgres' port=5432", PG_VERSION_96, pg1Path, false, NULL, NULL),
|
||||||
|
|
||||||
// Connect to standby
|
// Connect to standby
|
||||||
HRNPQ_MACRO_OPEN_GE_92(2, "dbname='postgres' port=5433", PG_VERSION_96, pg2Path, true, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(2, "dbname='postgres' port=5433", PG_VERSION_96, pg2Path, true, NULL, NULL),
|
||||||
|
|
||||||
// Get start time
|
// Get start time
|
||||||
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
||||||
@ -393,7 +393,7 @@ testBackupPqScript(unsigned int pgVersion, time_t backupTimeStart, TestBackupPqS
|
|||||||
harnessPqScriptSet((HarnessPq [])
|
harnessPqScriptSet((HarnessPq [])
|
||||||
{
|
{
|
||||||
// Connect to primary
|
// Connect to primary
|
||||||
HRNPQ_MACRO_OPEN_GE_92(1, "dbname='postgres' port=5432", PG_VERSION_11, pg1Path, false, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(1, "dbname='postgres' port=5432", PG_VERSION_11, pg1Path, false, NULL, NULL),
|
||||||
|
|
||||||
// Get start time
|
// Get start time
|
||||||
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
||||||
@ -416,7 +416,7 @@ testBackupPqScript(unsigned int pgVersion, time_t backupTimeStart, TestBackupPqS
|
|||||||
harnessPqScriptSet((HarnessPq [])
|
harnessPqScriptSet((HarnessPq [])
|
||||||
{
|
{
|
||||||
// Connect to primary
|
// Connect to primary
|
||||||
HRNPQ_MACRO_OPEN_GE_92(1, "dbname='postgres' port=5432", PG_VERSION_11, pg1Path, false, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(1, "dbname='postgres' port=5432", PG_VERSION_11, pg1Path, false, NULL, NULL),
|
||||||
|
|
||||||
// Get start time
|
// Get start time
|
||||||
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
HRNPQ_MACRO_TIME_QUERY(1, (int64_t)backupTimeStart * 1000),
|
||||||
|
@ -273,7 +273,7 @@ testRun(void)
|
|||||||
harnessPqScriptSet((HarnessPq [])
|
harnessPqScriptSet((HarnessPq [])
|
||||||
{
|
{
|
||||||
// Connect to primary
|
// Connect to primary
|
||||||
HRNPQ_MACRO_OPEN_GE_92(1, "dbname='postgres' port=5432", PG_VERSION_96, "/pg1", false, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(1, "dbname='postgres' port=5432", PG_VERSION_96, "/pg1", false, NULL, NULL),
|
||||||
|
|
||||||
// Start backup
|
// Start backup
|
||||||
HRNPQ_MACRO_ADVISORY_LOCK(1, true),
|
HRNPQ_MACRO_ADVISORY_LOCK(1, true),
|
||||||
@ -351,10 +351,10 @@ testRun(void)
|
|||||||
harnessPqScriptSet((HarnessPq [])
|
harnessPqScriptSet((HarnessPq [])
|
||||||
{
|
{
|
||||||
// Connect to primary
|
// Connect to primary
|
||||||
HRNPQ_MACRO_OPEN_GE_92(1, "dbname='postgres' port=5432", PG_VERSION_10, "/pg1", false, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(1, "dbname='postgres' port=5432", PG_VERSION_10, "/pg1", false, NULL, NULL),
|
||||||
|
|
||||||
// Connect to standby
|
// Connect to standby
|
||||||
HRNPQ_MACRO_OPEN_GE_92(2, "dbname='postgres' port=5433", PG_VERSION_10, "/pg2", true, NULL, NULL),
|
HRNPQ_MACRO_OPEN_GE_96(2, "dbname='postgres' port=5433", PG_VERSION_10, "/pg2", true, NULL, NULL),
|
||||||
|
|
||||||
// Start backup
|
// Start backup
|
||||||
HRNPQ_MACRO_ADVISORY_LOCK(1, true),
|
HRNPQ_MACRO_ADVISORY_LOCK(1, true),
|
||||||
|
Reference in New Issue
Block a user