BUG #8177: initscript should create /var/run/postgresql

Started by stronny redalmost 13 years ago7 messagesbugs
Jump to latest
#1stronny red
stronny@celestia.ru

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.

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#2Peter Eisentraut
peter_e@gmx.net
In reply to: stronny red (#1)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

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.

pgsql-pkg-debian@postgresql.org is where the people who know about this
hang out.

--
Sent via pgsql-pkg-debian mailing list (pgsql-pkg-debian@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-pkg-debian

#3Christoph Berg
myon@debian.org
In reply to: Peter Eisentraut (#2)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

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?

Christoph
--
cb@df7cb.de | http://www.df7cb.de/

--
Sent via pgsql-pkg-debian mailing list (pgsql-pkg-debian@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-pkg-debian

#4stronny red
stronny@celestia.ru
In reply to: Christoph Berg (#3)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

I was able to reproduce the problem.

Package versions
-----------------
ii postgresql-9.2 9.2.4-1.pgdg60+1
object-relational SQL database, version 9.2 server
ii postgresql-common 142.pgdg60+1
PostgreSQL database-cluster manager

The failure
-----------------
# /etc/init.d/postgresql stop
# rm -rf /var/run/postgresql
# /etc/init.d/postgresql start
Error: Cannot stat /var/run/postgresql
No PostgreSQL clusters exist; see "man pg_createcluster" ... (warning).

The config file
-----------------
# ls -lA /etc/postgresql/9.2
total 0
lrwxrwxrwx 1 root root 23 May 22 20:36 main -> /var/lib/postgresql/etc
# cat /etc/postgresql/9.2/main/postgresql.conf
data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/var/lib/postgresql/etc/pg_hba.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
ssl = true
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
log_line_prefix = '%t '
log_timezone = 'Europe/Moscow'

listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 3
wal_keep_segments = 8

On Thu, May 30, 2013 at 6:58 AM, Christoph Berg <myon@debian.org> wrote:

Show quoted text

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?

Christoph
--
cb@df7cb.de | http://www.df7cb.de/

#5Christoph Berg
myon@debian.org
In reply to: stronny red (#4)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

Re: stronny red 2013-05-30 <CALOvDf7fpScGUJBai69S3=Mr5wC-Xj5BZEqnV4qQBjOHXcj+Zg@mail.gmail.com>

I was able to reproduce the problem.

Package versions
-----------------
ii postgresql-9.2 9.2.4-1.pgdg60+1
object-relational SQL database, version 9.2 server
ii postgresql-common 142.pgdg60+1
PostgreSQL database-cluster manager

The failure
-----------------
# /etc/init.d/postgresql stop
# rm -rf /var/run/postgresql
# /etc/init.d/postgresql start
Error: Cannot stat /var/run/postgresql

Can you try "sh -x /etc/init.d/postgresql start" there and send us the
output?

Here it does:

+ [ -d /var/run/postgresql ]
+ install -d -m 2775 -o postgres -g postgres /var/run/postgresql

No PostgreSQL clusters exist; see "man pg_createcluster" ... (warning).

Btw, this seems to be the actual problem here.

The config file
-----------------
# ls -lA /etc/postgresql/9.2
total 0
lrwxrwxrwx 1 root root 23 May 22 20:36 main -> /var/lib/postgresql/etc

That's a non-standard setup. Could it be the case that this partition
wasn't mounted during your tests, or something like that?

Christoph
--
cb@df7cb.de | http://www.df7cb.de/

--
Sent via pgsql-pkg-debian mailing list (pgsql-pkg-debian@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-pkg-debian

#6Chris Nehren
cnehren+pgsql-pkg-debian@pobox.com
In reply to: Christoph Berg (#3)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

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

#7Chris Nehren
cnehren+pgsql-pkg-debian@pobox.com
In reply to: Chris Nehren (#6)
Re: [BUGS] BUG #8177: initscript should create /var/run/postgresql

It would help if I actually attached the patch. My apologies.

On Fri, May 30, 2014 at 13:03:16 -0400, Chris Nehren wrote:

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

--
Chris Nehren

Attachments:

postgresql.mkdir.patchtext/x-diff; charset=us-asciiDownload+10-0