23#include "lib/stringinfo.h"
24#include "postmaster/bgworker.h"
25#include "postmaster/postmaster.h"
26#include "storage/latch.h"
27#include "storage/ipc.h"
40#if PG_VERSION_NUM < 120000
44#define WL_EXIT_ON_PM_DEATH WL_POSTMASTER_DEATH
52 int save_errno = errno;
60 int save_errno = errno;
93 const char *p = strstr(tmpl,
"{endpoint}");
98 appendBinaryStringInfo(&s, tmpl, p - tmpl);
99 appendStringInfoString(&s, endpoint);
100 appendStringInfoString(&s, p + strlen(
"{endpoint}"));
115 execl(
"/bin/sh",
"sh",
"-c", cmd, (
char *) NULL);
118 setpgid(child, child);
128 killpg(child, SIGKILL);
129 do { r = waitpid(child, &status, 0); }
while (r < 0 && errno == EINTR);
142 events |= WL_TIMEOUT;
143 rc = WaitLatch(MyLatch, events, timeout_ms, PG_WAIT_EXTENSION);
145 return (rc & WL_POSTMASTER_DEATH) != 0;
158 BackgroundWorkerUnblockSignals();
160 snprintf(endpoint,
sizeof(endpoint),
"unix:/tmp/.provsql-kcmcp-%d.sock",
172 ProcessConfigFile(PGC_SIGHUP);
198 "not launching the managed KCMCP server");
209 provsql_log(
"managed KCMCP server started (pid %d) on %s",
210 (
int) child, endpoint);
221 pid_t w = waitpid(child, &status, WNOHANG);
224 provsql_log(
"managed KCMCP server (pid %d) exited; relaunching",
238 BackgroundWorker worker;
239 memset(&worker, 0,
sizeof(worker));
240 snprintf(worker.bgw_name, BGW_MAXLEN,
"ProvSQL KCMCP Supervisor");
241#if PG_VERSION_NUM >= 110000
242 snprintf(worker.bgw_type, BGW_MAXLEN,
"ProvSQL KCMCP");
244 worker.bgw_flags = BGWORKER_SHMEM_ACCESS;
245 worker.bgw_start_time = BgWorkerStart_PostmasterStart;
246 worker.bgw_restart_time = 1;
247 snprintf(worker.bgw_library_name, BGW_MAXLEN,
"provsql");
248 snprintf(worker.bgw_function_name, BGW_MAXLEN,
"provsql_kcmcp_worker");
249 worker.bgw_main_arg = (Datum) 0;
250 worker.bgw_notify_pid = 0;
251 RegisterBackgroundWorker(&worker);
static volatile sig_atomic_t got_sigterm
static void publish_endpoint(const char *endpoint)
static char * build_server_command(const char *tmpl, const char *endpoint)
void RegisterProvSQLKCMCPWorker(void)
Register the supervisor background worker that launches and supervises the managed KCMCP server; call...
const char * provsql_kcmcp_managed_endpoint(void)
Read the live endpoint of the managed KCMCP server from shared memory (e.g.
static void kcmcp_sigterm(SIGNAL_ARGS)
static volatile sig_atomic_t got_sighup
static pid_t launch_server(const char *cmd)
#define WL_EXIT_ON_PM_DEATH
void provsql_kcmcp_worker(Datum ignored)
static void kcmcp_sighup(SIGNAL_ARGS)
static void kill_server(pid_t child)
static bool kcmcp_wait(long timeout_ms)
char * provsql_kcmcp_server
Launch command for the managed KCMCP server (with a {endpoint} placeholder); controlled by the provsq...
Uniform error-reporting macros for ProvSQL.
#define provsql_log(fmt,...)
Write a ProvSQL message to the server log only.
#define provsql_warning(fmt,...)
Emit a ProvSQL warning message (execution continues).
void provsql_shmem_unlock(void)
Release the ProvSQL LWLock.
void provsql_shmem_lock_exclusive(void)
Acquire the ProvSQL LWLock in exclusive mode.
provsqlSharedState * provsql_shared_state
Pointer to the ProvSQL shared-memory segment (set in provsql_shmem_startup).
void provsql_shmem_lock_shared(void)
Acquire the ProvSQL LWLock in shared mode.
Shared-memory segment and inter-process pipe management.
Core types, constants, and utilities shared across ProvSQL.