Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

Поиск
Список
Период
Сортировка
От Chris Nehren
Тема Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql
Дата
Msg-id 20140530170316.GC13595@behemoth
обсуждение исходный текст
Ответ на Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql  (Christoph Berg <myon@debian.org>)
Ответы Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql
Список pgsql-pkg-debian
> On Mon, 2013-05-27 at 09:27 +0000, stronny@celestia.ru wrote:
> > The following bug has been logged on the website:
> >
> > Bug reference:      8177
> > Logged by:          stronny
> > Email address:      stronny@celestia.ru
> > PostgreSQL version: 9.2.4
> > Operating system:   wheezy
> > Description:
> >
> > When installed from apt.postgresql.org Postgres fails to start on system
> > boot.
> >
> > Wheezy changed /var/run to become memory-based so initscript should create
> > /var/run/postgresql if necessary.
>
> start() {
>     # create socket directory
>     if [ -d /var/run/postgresql ]; then
>         chmod 2775 /var/run/postgresql
>     else
>         install -d -m 2775 -o postgres -g postgres /var/run/postgresql
>     fi
>
>     do_ctl_all start "$1" "Starting PostgreSQL $1 database server"
> }
>
> We create the directory, what specifically doesn't work for you?

I've been able to reproduce this as well, and have found the root
cause.  Presently, the init script itself
(/etc/init.d/postgresql) does this:

    start|stop|restart|reload)
        if [ -z "`pg_lsclusters -h`" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi

pg_lsclusters is a Perl application that gets most of its logic
from PgCommon.pm.  Its entry point into PgCommon.pm (the one we
care about, anyway) is the subroutine &cluster_info.
&cluster_info, at line 575, calls &get_cluster_socketdir.  This
subroutine, at line 360, gets the 'unix_socket_directories' value
from the configuration file. If the value is defined in the
configuration file (the default), it immediately returns that
value to &cluster_info.  This is important.  If the value is
*not* defined, then &get_cluster_socketdir defaults it to
'/var/run/postgresql' and attempts to stat() this directory.  As
'/var/run' is now a tmpfs in Debian, this fails, because no
attempt has been made to create that directory before the stat()
runs.

There are actually two bugs here.  The first is attempting to
stat() a directory that the code has not ensured exists, which is
what this bug is about.  The second, more general, is that the
code makes no attempts at creating or even verifying the
existence of any unix_socket_{directory,directories} before
returning.  I've attached a patch to the init script that ensures
/var/run/postgresql actually exists before the code tries to
stat() it.

The reproduction steps for this bug are as follows:

1. install fresh Debian wheezy machine
2. Add official Postgres mirror to apt, installing the keyring
for same
3. Install the Postgres server
4. Remove any unix_socket_{directory,directories} directive from
/etc/postgresql/9.?/main/postgresql.conf
5. Reboot, observe Postgres startup failure

I've been able to reproduce this 100% of the time with the above
steps.

--
Chris Nehren

Вложения

В списке pgsql-pkg-debian по дате отправления:

Предыдущее
От: apt.postgresql.org repository
Дата:
Сообщение: psqlodbc updated to version 1:09.03.0300-1.pgdg+1
Следующее
От: Chris Nehren
Дата:
Сообщение: Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql