2
0

bgworker.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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-2022, 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. * External module API.
  45. *---------------------------------------------------------------------
  46. */
  47. /*
  48. * Pass this flag to have your worker be able to connect to shared memory.
  49. * This flag is required.
  50. */
  51. #define BGWORKER_SHMEM_ACCESS 0x0001
  52. /*
  53. * This flag means the bgworker requires a database connection. The connection
  54. * is not established automatically; the worker must establish it later.
  55. * It requires that BGWORKER_SHMEM_ACCESS was passed too.
  56. */
  57. #define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002
  58. /*
  59. * This class is used internally for parallel queries, to keep track of the
  60. * number of active parallel workers and make sure we never launch more than
  61. * max_parallel_workers parallel workers at the same time. Third party
  62. * background workers should not use this class.
  63. */
  64. #define BGWORKER_CLASS_PARALLEL 0x0010
  65. /* add additional bgworker classes here */
  66. typedef void (*bgworker_main_type) (Datum main_arg);
  67. /*
  68. * Points in time at which a bgworker can request to be started
  69. */
  70. typedef enum
  71. {
  72. BgWorkerStart_PostmasterStart,
  73. BgWorkerStart_ConsistentState,
  74. BgWorkerStart_RecoveryFinished
  75. } BgWorkerStartTime;
  76. #define BGW_DEFAULT_RESTART_INTERVAL 60
  77. #define BGW_NEVER_RESTART -1
  78. #define BGW_MAXLEN 96
  79. #define BGW_EXTRALEN 128
  80. typedef struct BackgroundWorker
  81. {
  82. char bgw_name[BGW_MAXLEN];
  83. char bgw_type[BGW_MAXLEN];
  84. int bgw_flags;
  85. BgWorkerStartTime bgw_start_time;
  86. int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */
  87. char bgw_library_name[BGW_MAXLEN];
  88. char bgw_function_name[BGW_MAXLEN];
  89. Datum bgw_main_arg;
  90. char bgw_extra[BGW_EXTRALEN];
  91. pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */
  92. } BackgroundWorker;
  93. typedef enum BgwHandleStatus
  94. {
  95. BGWH_STARTED, /* worker is running */
  96. BGWH_NOT_YET_STARTED, /* worker hasn't been started yet */
  97. BGWH_STOPPED, /* worker has exited */
  98. BGWH_POSTMASTER_DIED /* postmaster died; worker status unclear */
  99. } BgwHandleStatus;
  100. struct BackgroundWorkerHandle;
  101. typedef struct BackgroundWorkerHandle BackgroundWorkerHandle;
  102. /* Register a new bgworker during shared_preload_libraries */
  103. extern void RegisterBackgroundWorker(BackgroundWorker *worker);
  104. /* Register a new bgworker from a regular backend */
  105. extern bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker,
  106. BackgroundWorkerHandle **handle);
  107. /* Query the status of a bgworker */
  108. extern BgwHandleStatus GetBackgroundWorkerPid(BackgroundWorkerHandle *handle,
  109. pid_t *pidp);
  110. extern BgwHandleStatus WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *handle, pid_t *pid);
  111. extern BgwHandleStatus
  112. WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *);
  113. extern const char *GetBackgroundWorkerTypeByPid(pid_t pid);
  114. /* Terminate a bgworker */
  115. extern void TerminateBackgroundWorker(BackgroundWorkerHandle *handle);
  116. /* This is valid in a running worker */
  117. extern PGDLLIMPORT BackgroundWorker *MyBgworkerEntry;
  118. /*
  119. * Connect to the specified database, as the specified user. Only a worker
  120. * that passed BGWORKER_BACKEND_DATABASE_CONNECTION during registration may
  121. * call this.
  122. *
  123. * If username is NULL, bootstrapping superuser is used.
  124. * If dbname is NULL, connection is made to no specific database;
  125. * only shared catalogs can be accessed.
  126. */
  127. extern void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags);
  128. /* Just like the above, but specifying database and user by OID. */
  129. extern void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags);
  130. /*
  131. * Flags to BackgroundWorkerInitializeConnection et al
  132. *
  133. *
  134. * Allow bypassing datallowconn restrictions when connecting to database
  135. */
  136. #define BGWORKER_BYPASS_ALLOWCONN 1
  137. /* Block/unblock signals in a background worker process */
  138. extern void BackgroundWorkerBlockSignals(void);
  139. extern void BackgroundWorkerUnblockSignals(void);
  140. #endif /* BGWORKER_H */