mirror of
https://github.com/postgres/postgres.git
synced 2026-01-26 09:41:40 +03:00
Allow bgworkers to be terminated for database-related commands
Background workers gain a new flag, called BGWORKER_INTERRUPTIBLE, that offers the possibility to terminate the workers when these are connected to a database that is involved in one of the following commands: ALTER DATABASE RENAME TO ALTER DATABASE SET TABLESPACE CREATE DATABASE DROP DATABASE This is useful to give background workers the same behavior as backends and autovacuum workers, which are stopped when these commands are executed. The default behavior, that exists since 9.3, is still to never terminate bgworkers connected to the database involved in any of these commands. The new flag has to be set to terminate the workers. A couple of tests are added to worker_spi to track the commands that impact the termination of the workers. There is a test case for a non-interruptible worker, additionally, that relies on an injection point to make the wait time in CountOtherDBBackends() reduced from 5s to 0.3s for faster test runs. The tests rely on the contents of the server logs to check if a worker has been started or terminated: - LOG generated by worker_spi_main() at startup, once connection to database is done. - FATAL in bgworker_die() when terminated. A couple of tests run in the CI have showed that this method is stable enough. The safe_psql() calls that scan pg_stat_activity could be replaced with some poll_query_until() for more stability, if the current method proves to be an issue in the buildfarm. Author: Aya Iwata <iwata.aya@fujitsu.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Reviewed-by: Ryo Matsumura <matsumura.ryo@fujitsu.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Reviewed-by: Peter Smith <smithpb2250@gmail.com> Discussion: https://postgr.es/m/OS7PR01MB11964335F36BE41021B62EAE8EAE4A@OS7PR01MB11964.jpnprd01.prod.outlook.com
This commit is contained in:
@@ -59,6 +59,13 @@
|
||||
*/
|
||||
#define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002
|
||||
|
||||
/*
|
||||
* Exit the bgworker if its database is involved in a CREATE, ALTER or DROP
|
||||
* database command. It requires BGWORKER_SHMEM_ACCESS and
|
||||
* BGWORKER_BACKEND_DATABASE_CONNECTION.
|
||||
*/
|
||||
#define BGWORKER_INTERRUPTIBLE 0x0004
|
||||
|
||||
/*
|
||||
* This class is used internally for parallel queries, to keep track of the
|
||||
* number of active parallel workers and make sure we never launch more than
|
||||
@@ -129,6 +136,9 @@ extern const char *GetBackgroundWorkerTypeByPid(pid_t pid);
|
||||
/* Terminate a bgworker */
|
||||
extern void TerminateBackgroundWorker(BackgroundWorkerHandle *handle);
|
||||
|
||||
/* Terminate background workers connected to database */
|
||||
extern void TerminateBackgroundWorkersForDatabase(Oid databaseId);
|
||||
|
||||
/* This is valid in a running worker */
|
||||
extern PGDLLIMPORT BackgroundWorker *MyBgworkerEntry;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user