mirror of
https://github.com/postgres/postgres.git
synced 2025-11-26 23:43:30 +03:00
Add background worker type
Add bgw_type field to background worker structure. It is intended to be set to the same value for all workers of the same type, so they can be grouped in pg_stat_activity, for example. The backend_type column in pg_stat_activity now shows bgw_type for a background worker. The ps listing also no longer calls out that a process is a background worker but just show the bgw_type. That way, being a background worker is more of an implementation detail now that is not shown to the user. However, most log messages still refer to 'background worker "%s"'; otherwise constructing sensible and translatable log messages would become tricky. Reviewed-by: Michael Paquier <michael.paquier@gmail.com> Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
This commit is contained in:
@@ -344,6 +344,8 @@ BackgroundWorkerStateChange(void)
|
||||
*/
|
||||
ascii_safe_strlcpy(rw->rw_worker.bgw_name,
|
||||
slot->worker.bgw_name, BGW_MAXLEN);
|
||||
ascii_safe_strlcpy(rw->rw_worker.bgw_type,
|
||||
slot->worker.bgw_type, BGW_MAXLEN);
|
||||
ascii_safe_strlcpy(rw->rw_worker.bgw_library_name,
|
||||
slot->worker.bgw_library_name, BGW_MAXLEN);
|
||||
ascii_safe_strlcpy(rw->rw_worker.bgw_function_name,
|
||||
@@ -630,6 +632,12 @@ SanityCheckBackgroundWorker(BackgroundWorker *worker, int elevel)
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* If bgw_type is not filled in, use bgw_name.
|
||||
*/
|
||||
if (strcmp(worker->bgw_type, "") == 0)
|
||||
strcpy(worker->bgw_type, worker->bgw_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -671,7 +679,7 @@ bgworker_die(SIGNAL_ARGS)
|
||||
ereport(FATAL,
|
||||
(errcode(ERRCODE_ADMIN_SHUTDOWN),
|
||||
errmsg("terminating background worker \"%s\" due to administrator command",
|
||||
MyBgworkerEntry->bgw_name)));
|
||||
MyBgworkerEntry->bgw_type)));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -700,7 +708,6 @@ void
|
||||
StartBackgroundWorker(void)
|
||||
{
|
||||
sigjmp_buf local_sigjmp_buf;
|
||||
char buf[MAXPGPATH];
|
||||
BackgroundWorker *worker = MyBgworkerEntry;
|
||||
bgworker_main_type entrypt;
|
||||
|
||||
@@ -710,8 +717,7 @@ StartBackgroundWorker(void)
|
||||
IsBackgroundWorker = true;
|
||||
|
||||
/* Identify myself via ps */
|
||||
snprintf(buf, MAXPGPATH, "bgworker: %s", worker->bgw_name);
|
||||
init_ps_display(buf, "", "", "");
|
||||
init_ps_display(worker->bgw_name, "", "", "");
|
||||
|
||||
/*
|
||||
* If we're not supposed to have shared memory access, then detach from
|
||||
@@ -1233,3 +1239,40 @@ LookupBackgroundWorkerFunction(const char *libraryname, const char *funcname)
|
||||
return (bgworker_main_type)
|
||||
load_external_function(libraryname, funcname, true, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a PID, get the bgw_type of the background worker. Returns NULL if
|
||||
* not a valid background worker.
|
||||
*
|
||||
* The return value is in static memory belonging to this function, so it has
|
||||
* to be used before calling this function again. This is so that the caller
|
||||
* doesn't have to worry about the background worker locking protocol.
|
||||
*/
|
||||
const char *
|
||||
GetBackgroundWorkerTypeByPid(pid_t pid)
|
||||
{
|
||||
int slotno;
|
||||
bool found = false;
|
||||
static char result[BGW_MAXLEN];
|
||||
|
||||
LWLockAcquire(BackgroundWorkerLock, LW_SHARED);
|
||||
|
||||
for (slotno = 0; slotno < BackgroundWorkerData->total_slots; slotno++)
|
||||
{
|
||||
BackgroundWorkerSlot *slot = &BackgroundWorkerData->slot[slotno];
|
||||
|
||||
if (slot->pid > 0 && slot->pid == pid)
|
||||
{
|
||||
strcpy(result, slot->worker.bgw_type);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
LWLockRelease(BackgroundWorkerLock);
|
||||
|
||||
if (!found)
|
||||
return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -3117,8 +3117,9 @@ CleanupBackgroundWorker(int pid,
|
||||
exitstatus = 0;
|
||||
#endif
|
||||
|
||||
snprintf(namebuf, MAXPGPATH, "%s: %s", _("worker process"),
|
||||
rw->rw_worker.bgw_name);
|
||||
snprintf(namebuf, MAXPGPATH, _("background worker \"%s\""),
|
||||
rw->rw_worker.bgw_type);
|
||||
|
||||
|
||||
if (!EXIT_STATUS_0(exitstatus))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user