
Go to the source code of this file.
Data Structures | |
| struct | BackgroundWorker |
Defines | |
| #define | BGWORKER_SHMEM_ACCESS 0x0001 |
| #define | BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002 |
| #define | BGW_DEFAULT_RESTART_INTERVAL 60 |
| #define | BGW_NEVER_RESTART -1 |
Typedefs | |
| typedef void(* | bgworker_main_type )(void *main_arg) |
| typedef void(* | bgworker_sighdlr_type )(SIGNAL_ARGS) |
| typedef struct BackgroundWorker | BackgroundWorker |
Enumerations | |
| enum | BgWorkerStartTime { BgWorkerStart_PostmasterStart, BgWorkerStart_ConsistentState, BgWorkerStart_RecoveryFinished } |
Functions | |
| void | RegisterBackgroundWorker (BackgroundWorker *worker) |
| void | BackgroundWorkerInitializeConnection (char *dbname, char *username) |
| void | BackgroundWorkerBlockSignals (void) |
| void | BackgroundWorkerUnblockSignals (void) |
Variables | |
| BackgroundWorker * | MyBgworkerEntry |
| #define BGW_DEFAULT_RESTART_INTERVAL 60 |
Definition at line 68 of file bgworker.h.
| #define BGW_NEVER_RESTART -1 |
Definition at line 69 of file bgworker.h.
Referenced by DetermineSleepTime(), RegisterBackgroundWorker(), and StartOneBackgroundWorker().
| #define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002 |
Definition at line 52 of file bgworker.h.
Referenced by BackgroundWorkerInitializeConnection(), CleanupBackgroundWorker(), do_start_bgworker(), RegisterBackgroundWorker(), and StartOneBackgroundWorker().
| #define BGWORKER_SHMEM_ACCESS 0x0001 |
Definition at line 45 of file bgworker.h.
Referenced by _PG_init(), CleanupBackgroundWorker(), do_start_bgworker(), GetNumShmemAttachedBgworkers(), and RegisterBackgroundWorker().
| typedef struct BackgroundWorker BackgroundWorker |
| typedef void(* bgworker_main_type)(void *main_arg) |
Definition at line 55 of file bgworker.h.
| typedef void(* bgworker_sighdlr_type)(SIGNAL_ARGS) |
Definition at line 56 of file bgworker.h.
| enum BgWorkerStartTime |
| BgWorkerStart_PostmasterStart | |
| BgWorkerStart_ConsistentState | |
| BgWorkerStart_RecoveryFinished |
Definition at line 61 of file bgworker.h.
{
BgWorkerStart_PostmasterStart,
BgWorkerStart_ConsistentState,
BgWorkerStart_RecoveryFinished
} BgWorkerStartTime;
| void BackgroundWorkerBlockSignals | ( | void | ) |
Definition at line 5287 of file postmaster.c.
References BlockSig, and PG_SETMASK.
{
PG_SETMASK(&BlockSig);
}
| void BackgroundWorkerInitializeConnection | ( | char * | dbname, | |
| char * | username | |||
| ) |
Definition at line 5264 of file postmaster.c.
References BackgroundWorker::bgw_flags, BGWORKER_BACKEND_DATABASE_CONNECTION, ereport, errcode(), errmsg(), ERROR, FATAL, InitPostgres(), InvalidOid, IsInitProcessingMode, NormalProcessing, NULL, and SetProcessingMode.
Referenced by worker_spi_main().
{
BackgroundWorker *worker = MyBgworkerEntry;
/* XXX is this the right errcode? */
if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION))
ereport(FATAL,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("database connection requirement not indicated during registration")));
InitPostgres(dbname, InvalidOid, username, NULL);
/* it had better not gotten out of "init" mode yet */
if (!IsInitProcessingMode())
ereport(ERROR,
(errmsg("invalid processing mode in bgworker")));
SetProcessingMode(NormalProcessing);
}
| void BackgroundWorkerUnblockSignals | ( | void | ) |
Definition at line 5293 of file postmaster.c.
References PG_SETMASK, and UnBlockSig.
Referenced by worker_spi_main().
{
PG_SETMASK(&UnBlockSig);
}
| void RegisterBackgroundWorker | ( | BackgroundWorker * | worker | ) |
Definition at line 5143 of file postmaster.c.
References autovacuum_max_workers, BackgroundWorker::bgw_flags, BackgroundWorker::bgw_name, BGW_NEVER_RESTART, BackgroundWorker::bgw_restart_time, BackgroundWorker::bgw_start_time, BGWORKER_BACKEND_DATABASE_CONNECTION, BGWORKER_SHMEM_ACCESS, BgWorkerStart_PostmasterStart, ereport, errcode(), errdetail(), errmsg(), IsUnderPostmaster, LOG, malloc, MAX_BACKENDS, MaxConnections, NULL, process_shared_preload_libraries_in_progress, RegisteredBgWorker::rw_backend, RegisteredBgWorker::rw_child_slot, RegisteredBgWorker::rw_crashed_at, RegisteredBgWorker::rw_lnode, RegisteredBgWorker::rw_pid, RegisteredBgWorker::rw_worker, slist_push_head(), strlcpy(), and USECS_PER_DAY.
Referenced by _PG_init().
{
RegisteredBgWorker *rw;
int namelen = strlen(worker->bgw_name);
static int maxworkers;
static int numworkers = 0;
#ifdef EXEC_BACKEND
/*
* Use 1 here, not 0, to avoid confusing a possible bogus cookie read by
* atoi() in SubPostmasterMain.
*/
static int BackgroundWorkerCookie = 1;
#endif
/* initialize upper limit on first call */
if (numworkers == 0)
maxworkers = MAX_BACKENDS -
(MaxConnections + autovacuum_max_workers + 1);
if (!IsUnderPostmaster)
ereport(LOG,
(errmsg("registering background worker: %s", worker->bgw_name)));
if (!process_shared_preload_libraries_in_progress)
{
if (!IsUnderPostmaster)
ereport(LOG,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("background worker \"%s\": must be registered in shared_preload_libraries",
worker->bgw_name)));
return;
}
/* sanity check for flags */
if (worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)
{
if (!(worker->bgw_flags & BGWORKER_SHMEM_ACCESS))
{
if (!IsUnderPostmaster)
ereport(LOG,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("background worker \"%s\": must attach to shared memory in order to request a database connection",
worker->bgw_name)));
return;
}
if (worker->bgw_start_time == BgWorkerStart_PostmasterStart)
{
if (!IsUnderPostmaster)
ereport(LOG,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("background worker \"%s\": cannot request database access if starting at postmaster start",
worker->bgw_name)));
return;
}
/* XXX other checks? */
}
if ((worker->bgw_restart_time < 0 &&
worker->bgw_restart_time != BGW_NEVER_RESTART) ||
(worker->bgw_restart_time > USECS_PER_DAY / 1000))
{
if (!IsUnderPostmaster)
ereport(LOG,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("background worker \"%s\": invalid restart interval",
worker->bgw_name)));
return;
}
/*
* Enforce maximum number of workers. Note this is overly restrictive:
* we could allow more non-shmem-connected workers, because these don't
* count towards the MAX_BACKENDS limit elsewhere. This doesn't really
* matter for practical purposes; several million processes would need to
* run on a single server.
*/
if (++numworkers > maxworkers)
{
ereport(LOG,
(errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
errmsg("too many background workers"),
errdetail("Up to %d background workers can be registered with the current settings.",
maxworkers)));
return;
}
/*
* Copy the registration data into the registered workers list.
*/
rw = malloc(sizeof(RegisteredBgWorker) + namelen + 1);
if (rw == NULL)
{
ereport(LOG,
(errcode(ERRCODE_OUT_OF_MEMORY),
errmsg("out of memory")));
return;
}
rw->rw_worker = *worker;
rw->rw_worker.bgw_name = ((char *) rw) + sizeof(RegisteredBgWorker);
strlcpy(rw->rw_worker.bgw_name, worker->bgw_name, namelen + 1);
rw->rw_backend = NULL;
rw->rw_pid = 0;
rw->rw_child_slot = 0;
rw->rw_crashed_at = 0;
#ifdef EXEC_BACKEND
rw->rw_cookie = BackgroundWorkerCookie++;
#endif
slist_push_head(&BackgroundWorkerList, &rw->rw_lnode);
}
Definition at line 204 of file postmaster.c.
Referenced by worker_spi_main().
1.7.1