On Sat, Aug 17, 2019 at 10:55:11PM +0200, Adam Wolk wrote: > Hi ports@, > > I'm attaching a small diff to allow picking a different postgresql > cluster (the directory you create with initdb) location within > /etc/rc.conf.local. > > With the attached diff, one can now define the folder with: > postgresql_flags="-D /var/postgresql/testdata -w -l > /var/postgresql/logfile" > > Changing the value after -D to point to any valid pg cluster. > > The current implementation had the path hard-coded in the rc.d file with > no way to override it. > > By using the existing daemon_flags and setting -D there we indeed > could start postgresql with a different data_directory as the last -D > passed to start takes priority. However since that flag was not used in > the remaining calls the rc script would fail to check, reload and stop a > postgresql instance started this way. > > In order to allow setting a custom data_directory, we remove datadir > variable and set -D directly in daemon_flags then append ${daemon_flags} > to all invocations of pg_ctl ($rcexec)) in check, reload, start and stop > targets. The existing flags we use 'by default' which is -w and -l that > due to this change are now added to all invocations have the following > impact: > > 1. `-l` ignored in all targets except start, it sets the location of the > log file. adding it to other commands is a no-op and doesn't change > existing behavior. > 2. `-w` affects the start and stop targets. No change in behavior for > the start target. For the stop target it's also a no-op as reading the > pg_ctl code - that's the default even if not specified on the command > line. > > Since we got rid of ${datadir} we now have no way to check where is the > postmaster.pid that the start target attempts to remove. I investigated > this and came to the conclusion that removing the pidfile is not needed. > > When starting, pg_ctl upon noticing that a postmaster.pid is already > present will issue a warning: > > pg_ctl: another server might be running; trying to start server anyway > > The pg_ctl code itself handles cases of a leftover pid: > > https://github.com/postgres/postgres/blob/b8f2da0ac5a24f669c8d320c58646759b8fc69a5/src/bin/pg_ctl/pg_ctl.c#L583 > > So if the database starts up properly, the file will be overwritten but > a system administrator will be able to see a log entry indicating that a > dead pidfile was removed. Note that pg_ctl stop itself removes the > postmaster.pid so if it's there then likely the database was not stopped > properly (and might need investigation for recovery). > > The removal of the postmaster.pid has been moved from post server stop > to server start 9 years ago in commit 1.3. It was present in stop since > revision 1.1 of the file. > > I don't think the above changes require a port quirk. Worst case > scenario iff someone defined postgresql_flags in rc.conf.local their > database would now not start due to -D being likely not specified by the > user. However, this is not permanent (or any whatsoever) damage as the > user only needs to add -D /var/postgresql/data to his flags to regain > full functionality. > > I do think that this could warrant an entry in current.html. The second > diff addresses this. > > I also noticed that the postgresql_flags line is used verbatim in the > ENVIRONMENT section of rc.d(8), should I update that manual to include > the -D that is now the new default for flags? I assume that yes, so the > third diff covers that, however the extended line wraps in the manual > now (perhaps that is undesired?). > > As always I'm looking for feedback and OK's :)
I like this. > > Regards, > Adam > Index: Makefile > =================================================================== > RCS file: /cvs/ports/databases/postgresql/Makefile,v > retrieving revision 1.255 > diff -u -p -r1.255 Makefile > --- Makefile 12 Aug 2019 16:40:40 -0000 1.255 > +++ Makefile 17 Aug 2019 20:42:47 -0000 > @@ -9,6 +9,7 @@ COMMENT-pg_upgrade=Support for upgrading > > VERSION= 11.5 > PREV_MAJOR= 10 > +REVISION-server=1 > DISTNAME= postgresql-${VERSION} > PKGNAME-main= postgresql-client-${VERSION} > PKGNAME-server= postgresql-server-${VERSION} > Index: pkg/postgresql.rc > =================================================================== > RCS file: /cvs/ports/databases/postgresql/pkg/postgresql.rc,v > retrieving revision 1.12 > diff -u -p -r1.12 postgresql.rc > --- pkg/postgresql.rc 11 Jan 2018 19:27:01 -0000 1.12 > +++ pkg/postgresql.rc 17 Aug 2019 20:42:47 -0000 > @@ -2,10 +2,8 @@ > # > # $OpenBSD: postgresql.rc,v 1.12 2018/01/11 19:27:01 rpe Exp $ > > -datadir="/var/postgresql/data" > - > daemon="${TRUEPREFIX}/bin/pg_ctl" > -daemon_flags="-w -l /var/postgresql/logfile" > +daemon_flags="-D /var/postgresql/data -w -l /var/postgresql/logfile" > daemon_user="_postgresql" > > . /etc/rc.d/rc.subr > @@ -13,21 +11,20 @@ daemon_user="_postgresql" > rc_usercheck=NO > > rc_check() { > - ${rcexec} "${daemon} -D ${datadir} status" > + ${rcexec} "${daemon} status ${daemon_flags}" > } > > rc_reload() { > - ${rcexec} "${daemon} -D ${datadir} reload" > + ${rcexec} "${daemon} reload ${daemon_flags}" > } > > rc_start() { > - rm -f ${datadir}/postmaster.pid > - ${rcexec} "${daemon} -D ${datadir} start ${daemon_flags}" > + ${rcexec} "${daemon} start ${daemon_flags}" > } > > rc_stop() { > - ${rcexec} "${daemon} -D ${datadir} stop -m fast" || \ > - ${rcexec} "${daemon} -D ${datadir} stop -m immediate" > + ${rcexec} "${daemon} stop ${daemon_flags} -m fast" || \ > + ${rcexec} "${daemon} stop ${daemon_flags} -m immediate" > } > > rc_cmd $1 > Index: current.html > =================================================================== > RCS file: /cvs/www/faq/current.html,v > retrieving revision 1.1006 > diff -u -p -r1.1006 current.html > --- current.html 7 Aug 2019 10:34:25 -0000 1.1006 > +++ current.html 17 Aug 2019 20:42:19 -0000 > @@ -152,6 +152,21 @@ Instead disable the route evaluation pro > <code>rde rib Loc-RIB no evaluate</code>. > > > +<h3 id="r20190817">2019/08/17 - [ports] Datadir added to default postgres > flags</h3> > + > +Default <a href="https://man.openbsd.org/rc.d.8">rc.d(8)</a> flags > +for databases/postgresql have been changed from: > +<pre class="cmdbox"> > +daemon_flags="-w -l /var/postgresql/logfile" > +</pre> > +to > +<pre class="cmdbox"> > +daemon_flags="-D /var/postgresql/data -w -l /var/postgresql/logfile" > +</pre> > +if you defined <code>postgresql_flags</code> in > <code>/etc/rc.conf.local</code> > +make sure that your entry includes <code>-D /var/postgresql/data</code>. > + > + > <!-- > Two blank lines before new sections. > New sentences start on new lines. > Index: rc.d.8 > =================================================================== > RCS file: /cvs/src/share/man/man8/rc.d.8,v > retrieving revision 1.34 > diff -u -p -r1.34 rc.d.8 > --- rc.d.8 27 Jul 2017 07:49:05 -0000 1.34 > +++ rc.d.8 17 Aug 2019 20:21:28 -0000 > @@ -137,13 +137,13 @@ with the name of the script. > For example, postgres is managed through > .Pa /etc/rc.d/postgresql : > .Pp > -.Dl daemon_flags=-w -l /var/postgresql/logfile > +.Dl daemon_flags="-D /var/postgresql/data -w -l /var/postgresql/logfile" > .Pp > To override this and increase the debug log level (keeping the existing > flags), define the following in > .Xr rc.conf.local 8 : > .Pp > -.Dl postgresql_flags=-w -l /var/postgresql/logfile -d 5 > +.Dl postgresql_flags="-D /var/postgresql/data -w -l /var/postgresql/logfile > -d 5" > .Pp > Each script may define its own defaults, as explained in > .Xr rc.subr 8 . -- Antoine