On 1/27/16 7:02 AM, Pavel Stehule wrote: > The issues: > > 1. configure missing systemd integration test, compilation fails: > > postmaster.o postmaster.c > postmaster.c:91:31: fatal error: systemd/sd-daemon.h: No such file or > directory
Updated patch attached that fixes this by adding additional checking in configure. > 3. PostgreSQL is able to write to systemd log, but multiline entry was > stored with different priorities Yeah, as Tom had already pointed out, this doesn't work as I had imagined it. I'm withdrawing this part of the patch for now. I'll come back to it later. > Second issue: > > Mapping of levels between pg and journal levels is moved by1 This is the same as how the "syslog" destination works.
From 607323c95ca62d74668992219569c7cff470b63d Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> Date: Tue, 17 Nov 2015 06:47:18 -0500 Subject: [PATCH 1/3] Improve error reporting when location specified by postgres -D does not exist Previously, the first error seen would be that postgresql.conf does not exist. But for the case where the whole directory does not exist, give an error message about that, together with a hint for how to create one. --- src/backend/utils/misc/guc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 38ba82f..b8d34b5 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4463,6 +4463,17 @@ SelectConfigFiles(const char *userDoption, const char *progname) else configdir = make_absolute_path(getenv("PGDATA")); + if (configdir && stat(configdir, &stat_buf) != 0) + { + write_stderr("%s: could not access \"%s\": %s\n", + progname, + configdir, + strerror(errno)); + if (errno == ENOENT) + write_stderr("Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n"); + return false; + } + /* * Find the configuration file: if config_file was specified on the * command line, use it, else use configdir/postgresql.conf. In any case @@ -4498,7 +4509,7 @@ SelectConfigFiles(const char *userDoption, const char *progname) */ if (stat(ConfigFileName, &stat_buf) != 0) { - write_stderr("%s cannot access the server configuration file \"%s\": %s\n", + write_stderr("%s: could not access the server configuration file \"%s\": %s\n", progname, ConfigFileName, strerror(errno)); free(configdir); return false; -- 2.7.0
From 339836d39d8566ed794f6e1d56384fd93073d5bf Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> Date: Tue, 17 Nov 2015 06:46:17 -0500 Subject: [PATCH 2/3] Add support for systemd service notifications Insert sd_notify() calls at server start and stop for integration with systemd. This allows the use of systemd service units of type "notify", which greatly simplifies the systemd configuration. --- configure | 38 +++++++++++++++++++++++++++++++++++++ configure.in | 9 +++++++++ doc/src/sgml/installation.sgml | 16 ++++++++++++++++ doc/src/sgml/runtime.sgml | 24 +++++++++++++++++++++++ src/Makefile.global.in | 1 + src/backend/Makefile | 4 ++++ src/backend/postmaster/postmaster.c | 21 ++++++++++++++++++++ src/include/pg_config.h.in | 3 +++ 8 files changed, 116 insertions(+) diff --git a/configure b/configure index 3dd1b15..5c2e767 100755 --- a/configure +++ b/configure @@ -709,6 +709,7 @@ with_libxml XML2_CONFIG UUID_EXTRA_OBJS with_uuid +with_systemd with_selinux with_openssl krb_srvtab @@ -830,6 +831,7 @@ with_ldap with_bonjour with_openssl with_selinux +with_systemd with_readline with_libedit_preferred with_uuid @@ -1518,6 +1520,7 @@ Optional Packages: --with-bonjour build with Bonjour support --with-openssl build with OpenSSL support --with-selinux build with SELinux support + --with-systemd build with systemd support --without-readline do not use GNU Readline nor BSD Libedit for editing --with-libedit-preferred prefer BSD Libedit over GNU Readline @@ -5695,6 +5698,41 @@ fi $as_echo "$with_selinux" >&6; } # +# Systemd +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with systemd support" >&5 +$as_echo_n "checking whether to build with systemd support... " >&6; } + + + +# Check whether --with-systemd was given. +if test "${with_systemd+set}" = set; then : + withval=$with_systemd; + case $withval in + yes) + +$as_echo "#define USE_SYSTEMD 1" >>confdefs.h + + ;; + no) + : + ;; + *) + as_fn_error $? "no argument expected for --with-systemd option" "$LINENO" 5 + ;; + esac + +else + with_systemd=no + +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_systemd" >&5 +$as_echo "$with_systemd" >&6; } + +# # Readline # diff --git a/configure.in b/configure.in index 9398482..20d9fe1 100644 --- a/configure.in +++ b/configure.in @@ -700,6 +700,15 @@ AC_SUBST(with_selinux) AC_MSG_RESULT([$with_selinux]) # +# Systemd +# +AC_MSG_CHECKING([whether to build with systemd support]) +PGAC_ARG_BOOL(with, systemd, no, [build with systemd support], + [AC_DEFINE([USE_SYSTEMD], 1, [Define to build with systemd support. (--with-systemd)])]) +AC_SUBST(with_systemd) +AC_MSG_RESULT([$with_systemd]) + +# # Readline # PGAC_ARG_BOOL(with, readline, yes, diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 8964834..7b6a389 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -813,6 +813,22 @@ <title>Configuration</title> </varlistentry> <varlistentry> + <term><option>--with-systemd</option></term> + <listitem> + <para> + Build with support + for <application>systemd</application><indexterm><primary>systemd</primary></indexterm> + service notifications. This improves integration if the server binary + is started under <application>systemd</application> but has no impact + otherwise; see <xref linkend="server-start"> for more + information. <application>libsystemd</application> and the + associated header files need to be installed to be able to use this + option. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>--without-readline</option></term> <listitem> <para> diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index cda05f5..58b8838 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -369,6 +369,30 @@ <title>Starting the Database Server</title> <filename>contrib/start-scripts/linux</filename> in the <productname>PostgreSQL</productname> source distribution. </para> + + <para> + When using <application>systemd</application>, you can use the following + service unit file (e.g., + at <filename>/etc/systemd/system/postgresql.service</filename>):<indexterm><primary>systemd</primary></indexterm> +<programlisting> +[Unit] +Description=PostgreSQL database server +Documentation=man:postgres(1) + +[Service] +Type=notify +User=postgres +ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data +ExecReload=/bin/kill -HUP $MAINPID +KillMode=mixed +KillSignal=SIGINT + +[Install] +WantedBy=multi-user.target +</programlisting> + Using <literal>Type=notify</literal> requires that the server binary was + built with <literal>configure --with-systemd</literal>. + </para> </listitem> <listitem> diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 51f4797..e94d6a5 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -184,6 +184,7 @@ with_python = @with_python@ with_tcl = @with_tcl@ with_openssl = @with_openssl@ with_selinux = @with_selinux@ +with_systemd = @with_systemd@ with_libxml = @with_libxml@ with_libxslt = @with_libxslt@ with_system_tzdata = @with_system_tzdata@ diff --git a/src/backend/Makefile b/src/backend/Makefile index d4db8ff..b3d5e2e 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -45,6 +45,10 @@ LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) $(LDAP_LIBS_BE) # The backend doesn't need everything that's in LIBS, however LIBS := $(filter-out -lz -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS)) +ifeq ($(with_systemd),yes) +LIBS += -lsystemd +endif + ########################################################################## all: submake-libpgport submake-schemapg postgres $(POSTGRES_IMP) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 9aaed5b..2e7f1d7 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -87,6 +87,10 @@ #include <dns_sd.h> #endif +#ifdef USE_SYSTEMD +#include <systemd/sd-daemon.h> +#endif + #ifdef HAVE_PTHREAD_IS_THREADED_NP #include <pthread.h> #endif @@ -2533,6 +2537,9 @@ pmdie(SIGNAL_ARGS) Shutdown = SmartShutdown; ereport(LOG, (errmsg("received smart shutdown request"))); +#ifdef USE_SYSTEMD + sd_notify(0, "STOPPING=1"); +#endif if (pmState == PM_RUN || pmState == PM_RECOVERY || pmState == PM_HOT_STANDBY || pmState == PM_STARTUP) @@ -2585,6 +2592,9 @@ pmdie(SIGNAL_ARGS) Shutdown = FastShutdown; ereport(LOG, (errmsg("received fast shutdown request"))); +#ifdef USE_SYSTEMD + sd_notify(0, "STOPPING=1"); +#endif if (StartupPID != 0) signal_child(StartupPID, SIGTERM); @@ -2645,6 +2655,9 @@ pmdie(SIGNAL_ARGS) Shutdown = ImmediateShutdown; ereport(LOG, (errmsg("received immediate shutdown request"))); +#ifdef USE_SYSTEMD + sd_notify(0, "STOPPING=1"); +#endif TerminateChildren(SIGQUIT); pmState = PM_WAIT_BACKENDS; @@ -2787,6 +2800,10 @@ reaper(SIGNAL_ARGS) ereport(LOG, (errmsg("database system is ready to accept connections"))); +#ifdef USE_SYSTEMD + sd_notify(0, "READY=1"); +#endif + continue; } @@ -4930,6 +4947,10 @@ sigusr1_handler(SIGNAL_ARGS) ereport(LOG, (errmsg("database system is ready to accept read only connections"))); +#ifdef USE_SYSTEMD + sd_notify(0, "READY=1"); +#endif + pmState = PM_HOT_STANDBY; /* Some workers may be scheduled to start now */ StartWorkerNeeded = true; diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 16a272e..b3ceea5 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -833,6 +833,9 @@ /* Define to 1 to use Intel SSSE 4.2 CRC instructions with a runtime check. */ #undef USE_SSE42_CRC32C_WITH_RUNTIME_CHECK +/* Define to build with systemd support. (--with-systemd) */ +#undef USE_SYSTEMD + /* Define to select SysV-style semaphores. */ #undef USE_SYSV_SEMAPHORES -- 2.7.0
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers