PostgreSQL Source Code git master
bgworker.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------
2 * bgworker.h
3 * POSTGRES pluggable background workers interface
4 *
5 * A background worker is a process able to run arbitrary, user-supplied code,
6 * including normal transactions.
7 *
8 * Any external module loaded via shared_preload_libraries can register a
9 * worker. Workers can also be registered dynamically at runtime. In either
10 * case, the worker process is forked from the postmaster and runs the
11 * user-supplied "main" function. This code may connect to a database and
12 * run transactions. Workers can remain active indefinitely, but will be
13 * terminated if a shutdown or crash occurs.
14 *
15 * If the fork() call fails in the postmaster, it will try again later. Note
16 * that the failure can only be transient (fork failure due to high load,
17 * memory pressure, too many processes, etc); more permanent problems, like
18 * failure to connect to a database, are detected later in the worker and dealt
19 * with just by having the worker exit normally. A worker which exits with
20 * a return code of 0 will never be restarted and will be removed from worker
21 * list. A worker which exits with a return code of 1 will be restarted after
22 * the configured restart interval (unless that interval is BGW_NEVER_RESTART).
23 * The TerminateBackgroundWorker() function can be used to terminate a
24 * dynamically registered background worker; the worker will be sent a SIGTERM
25 * and will not be restarted after it exits. Whenever the postmaster knows
26 * that a worker will not be restarted, it unregisters the worker, freeing up
27 * that worker's slot for use by a new worker.
28 *
29 * Note that there might be more than one worker in a database concurrently,
30 * and the same module may request more than one worker running the same (or
31 * different) code.
32 *
33 *
34 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
35 * Portions Copyright (c) 1994, Regents of the University of California
36 *
37 * IDENTIFICATION
38 * src/include/postmaster/bgworker.h
39 *--------------------------------------------------------------------
40 */
41#ifndef BGWORKER_H
42#define BGWORKER_H
43
44/*---------------------------------------------------------------------
45 * External module API.
46 *---------------------------------------------------------------------
47 */
48
49/*
50 * Pass this flag to have your worker be able to connect to shared memory.
51 * This flag is required.
52 */
53#define BGWORKER_SHMEM_ACCESS 0x0001
54
55/*
56 * This flag means the bgworker requires a database connection. The connection
57 * is not established automatically; the worker must establish it later.
58 * It requires that BGWORKER_SHMEM_ACCESS was passed too.
59 */
60#define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002
61
62/*
63 * Exit the bgworker if its database is involved in a CREATE, ALTER or DROP
64 * database command. It requires BGWORKER_SHMEM_ACCESS and
65 * BGWORKER_BACKEND_DATABASE_CONNECTION.
66 */
67#define BGWORKER_INTERRUPTIBLE 0x0004
68
69/*
70 * This class is used internally for parallel queries, to keep track of the
71 * number of active parallel workers and make sure we never launch more than
72 * max_parallel_workers parallel workers at the same time. Third party
73 * background workers should not use this class.
74 */
75#define BGWORKER_CLASS_PARALLEL 0x0010
76/* add additional bgworker classes here */
77
78
79typedef void (*bgworker_main_type) (Datum main_arg);
80
81/*
82 * Points in time at which a bgworker can request to be started
83 */
84typedef enum
85{
90
91#define BGW_DEFAULT_RESTART_INTERVAL 60
92#define BGW_NEVER_RESTART -1
93#define BGW_MAXLEN 96
94#define BGW_EXTRALEN 128
95
96typedef struct BackgroundWorker
97{
102 int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */
107 pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */
109
110typedef enum BgwHandleStatus
111{
112 BGWH_STARTED, /* worker is running */
113 BGWH_NOT_YET_STARTED, /* worker hasn't been started yet */
114 BGWH_STOPPED, /* worker has exited */
115 BGWH_POSTMASTER_DIED, /* postmaster died; worker status unclear */
117
120
121/* Register a new bgworker during shared_preload_libraries */
122extern void RegisterBackgroundWorker(BackgroundWorker *worker);
123
124/* Register a new bgworker from a regular backend */
126 BackgroundWorkerHandle **handle);
127
128/* Query the status of a bgworker */
130 pid_t *pidp);
132extern BgwHandleStatus
134extern const char *GetBackgroundWorkerTypeByPid(pid_t pid);
135
136/* Terminate a bgworker */
138
139/* Terminate background workers connected to database */
140extern void TerminateBackgroundWorkersForDatabase(Oid databaseId);
141
142/* This is valid in a running worker */
144
145/*
146 * Connect to the specified database, as the specified user. Only a worker
147 * that passed BGWORKER_BACKEND_DATABASE_CONNECTION during registration may
148 * call this.
149 *
150 * If username is NULL, bootstrapping superuser is used.
151 * If dbname is NULL, connection is made to no specific database;
152 * only shared catalogs can be accessed.
153 */
154extern void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags);
155
156/* Just like the above, but specifying database and user by OID. */
157extern void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags);
158
159/*
160 * Flags to BackgroundWorkerInitializeConnection et al
161 *
162 *
163 * Allow bypassing datallowconn restrictions and login check when connecting
164 * to database
165 */
166#define BGWORKER_BYPASS_ALLOWCONN 0x0001
167#define BGWORKER_BYPASS_ROLELOGINCHECK 0x0002
168
169
170/* Block/unblock signals in a background worker process */
171extern void BackgroundWorkerBlockSignals(void);
172extern void BackgroundWorkerUnblockSignals(void);
173
174#endif /* BGWORKER_H */
void RegisterBackgroundWorker(BackgroundWorker *worker)
Definition: bgworker.c:955
BgwHandleStatus WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *handle, pid_t *pidp)
Definition: bgworker.c:1228
BgwHandleStatus WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *)
Definition: bgworker.c:1273
void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags)
Definition: bgworker.c:868
#define BGW_EXTRALEN
Definition: bgworker.h:94
void TerminateBackgroundWorker(BackgroundWorkerHandle *handle)
Definition: bgworker.c:1312
void TerminateBackgroundWorkersForDatabase(Oid databaseId)
Definition: bgworker.c:1420
void BackgroundWorkerUnblockSignals(void)
Definition: bgworker.c:942
void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags)
Definition: bgworker.c:902
BgwHandleStatus
Definition: bgworker.h:111
@ BGWH_POSTMASTER_DIED
Definition: bgworker.h:115
@ BGWH_STARTED
Definition: bgworker.h:112
@ BGWH_NOT_YET_STARTED
Definition: bgworker.h:113
@ BGWH_STOPPED
Definition: bgworker.h:114
BgWorkerStartTime
Definition: bgworker.h:85
@ BgWorkerStart_RecoveryFinished
Definition: bgworker.h:88
@ BgWorkerStart_ConsistentState
Definition: bgworker.h:87
@ BgWorkerStart_PostmasterStart
Definition: bgworker.h:86
void BackgroundWorkerBlockSignals(void)
Definition: bgworker.c:936
struct BackgroundWorker BackgroundWorker
BgwHandleStatus GetBackgroundWorkerPid(BackgroundWorkerHandle *handle, pid_t *pidp)
Definition: bgworker.c:1173
PGDLLIMPORT BackgroundWorker * MyBgworkerEntry
Definition: postmaster.c:200
void(* bgworker_main_type)(Datum main_arg)
Definition: bgworker.h:79
#define BGW_MAXLEN
Definition: bgworker.h:93
const char * GetBackgroundWorkerTypeByPid(pid_t pid)
Definition: bgworker.c:1387
bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker, BackgroundWorkerHandle **handle)
Definition: bgworker.c:1061
#define PGDLLIMPORT
Definition: c.h:1297
uint32_t uint32
Definition: c.h:552
static char * username
Definition: initdb.c:153
#define MAXPGPATH
uint64_t Datum
Definition: postgres.h:70
unsigned int Oid
Definition: postgres_ext.h:32
char * dbname
Definition: streamutil.c:49
char bgw_function_name[BGW_MAXLEN]
Definition: bgworker.h:104
Datum bgw_main_arg
Definition: bgworker.h:105
char bgw_name[BGW_MAXLEN]
Definition: bgworker.h:98
int bgw_restart_time
Definition: bgworker.h:102
char bgw_type[BGW_MAXLEN]
Definition: bgworker.h:99
BgWorkerStartTime bgw_start_time
Definition: bgworker.h:101
char bgw_extra[BGW_EXTRALEN]
Definition: bgworker.h:106
pid_t bgw_notify_pid
Definition: bgworker.h:107
char bgw_library_name[MAXPGPATH]
Definition: bgworker.h:103