summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/ipc/signalfuncs.c4
-rw-r--r--src/backend/utils/activity/backend_status.c25
-rw-r--r--src/include/utils/backend_status.h1
3 files changed, 28 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/signalfuncs.c b/src/backend/storage/ipc/signalfuncs.c
index aa729a36e39..d8353276007 100644
--- a/src/backend/storage/ipc/signalfuncs.c
+++ b/src/backend/storage/ipc/signalfuncs.c
@@ -88,9 +88,9 @@ pg_signal_backend(int pid, int sig)
if (!OidIsValid(proc->roleId) || superuser_arg(proc->roleId))
{
ProcNumber procNumber = GetNumberFromPGProc(proc);
- PgBackendStatus *procStatus = pgstat_get_beentry_by_proc_number(procNumber);
+ BackendType backendType = pgstat_get_backend_type_by_proc_number(procNumber);
- if (procStatus && procStatus->st_backendType == B_AUTOVAC_WORKER)
+ if (backendType == B_AUTOVAC_WORKER)
{
if (!has_privs_of_role(GetUserId(), ROLE_PG_SIGNAL_AUTOVACUUM_WORKER))
return SIGNAL_BACKEND_NOAUTOVAC;
diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c
index bdb3a296ca6..22c6dc378c5 100644
--- a/src/backend/utils/activity/backend_status.c
+++ b/src/backend/utils/activity/backend_status.c
@@ -1037,6 +1037,31 @@ pgstat_get_my_query_id(void)
}
/* ----------
+ * pgstat_get_backend_type_by_proc_number() -
+ *
+ * Return the type of the backend with the specified ProcNumber. This looks
+ * directly at the BackendStatusArray, so the return value may be out of date.
+ * The only current use of this function is in pg_signal_backend(), which is
+ * inherently racy, so we don't worry too much about this.
+ *
+ * It is the caller's responsibility to use this wisely; at minimum, callers
+ * should ensure that procNumber is valid and perform the required permissions
+ * checks.
+ * ----------
+ */
+BackendType
+pgstat_get_backend_type_by_proc_number(ProcNumber procNumber)
+{
+ volatile PgBackendStatus *status = &BackendStatusArray[procNumber];
+
+ /*
+ * We bypass the changecount mechanism since fetching and storing an int
+ * is almost certainly atomic.
+ */
+ return status->st_backendType;
+}
+
+/* ----------
* cmp_lbestatus
*
* Comparison function for bsearch() on an array of LocalPgBackendStatus.
diff --git a/src/include/utils/backend_status.h b/src/include/utils/backend_status.h
index 97874300c31..4e8b39a66d5 100644
--- a/src/include/utils/backend_status.h
+++ b/src/include/utils/backend_status.h
@@ -323,6 +323,7 @@ extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);
extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
int buflen);
extern uint64 pgstat_get_my_query_id(void);
+extern BackendType pgstat_get_backend_type_by_proc_number(ProcNumber procNumber);
/* ----------