diff options
| author | Mark Asselstine <mark.asselstine@windriver.com> | 2017-11-22 11:07:53 -0500 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@windriver.com> | 2017-11-27 10:39:51 -0500 |
| commit | 63dacc37cabf9bbb325956c577591ca5db52118d (patch) | |
| tree | 6956003d6b3e8cc3aa0346344666d8c77013ac56 /meta-openstack | |
| parent | 8c4f65366b237ca86ca07a30fe8a68940bc6ec91 (diff) | |
| download | meta-cloud-services-63dacc37cabf9bbb325956c577591ca5db52118d.tar.gz | |
postgresql: updates to get things working with systemd
Convert the sysvinit code to instead work with systemd. We are no
longer able to make use of postinst scripts as we need to perform
setup after the postgresql service is started, this will have
'knock-on' effects for other postinst, such as for keystone. Changing
these postinst to "one time" services buys us greater control and
easier readability than the postinst scripts, so overall this is a
good change.
Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
Diffstat (limited to 'meta-openstack')
4 files changed, 77 insertions, 126 deletions
diff --git a/meta-openstack/recipes-support/postgresql/postgresql/postgresql b/meta-openstack/recipes-support/postgresql/postgresql/postgresql index cfff759..2bdd582 100644 --- a/meta-openstack/recipes-support/postgresql/postgresql/postgresql +++ b/meta-openstack/recipes-support/postgresql/postgresql/postgresql | |||
| @@ -1,93 +1,40 @@ | |||
| 1 | #!/bin/sh | 1 | [Unit] |
| 2 | Description=PostgreSQL database server | ||
| 3 | After=network.target | ||
| 2 | 4 | ||
| 3 | ### BEGIN INIT INFO | 5 | [Service] |
| 4 | # Provides: postgresql | 6 | Type=forking |
| 5 | # Required-Start: $local_fs $remote_fs $network $time | ||
| 6 | # Required-Stop: $local_fs $remote_fs $network $time | ||
| 7 | # Should-Start: $syslog | ||
| 8 | # Should-Stop: $syslog | ||
| 9 | # Default-Start: 2 3 4 5 | ||
| 10 | # Default-Stop: 0 1 6 | ||
| 11 | # Short-Description: PostgreSQL RDBMS server | ||
| 12 | ### END INIT INFO | ||
| 13 | 7 | ||
| 14 | DAEMON=/usr/bin/postmaster | 8 | User=postgres |
| 15 | DESC="PostgreSQL RDBMS server" | 9 | Group=postgres |
| 16 | DEFAULT_DATA_DIR=%DB_DATADIR% | ||
| 17 | 10 | ||
| 18 | datadir=`grep ^data_directory $DEFAULT_DATA_DIR/postgresql.conf |sed -e "s#^.*= '##; s#'.*##"` | 11 | # Where to send early-startup messages from the server (before the logging |
| 19 | if [ "$datadir" = "" ] ; then | 12 | # options of postgresql.conf take effect) |
| 20 | datadir=$DEFAULT_DATA_DIR | 13 | # This is normally controlled by the global default set by systemd |
| 21 | else | 14 | # StandardOutput=syslog |
| 22 | if [ ! -e $datadir/postgresql.conf ] ; then | ||
| 23 | if [ -e $DEFAULT_DATA_DIR/postgresql.conf -a -e $datadir ] ; then | ||
| 24 | ln -s $DEFAULT_DATA_DIR/*.conf $datadir/ | ||
| 25 | fi | ||
| 26 | fi | ||
| 27 | fi | ||
| 28 | 15 | ||
| 29 | cd / | 16 | # Disable OOM kill on the postmaster |
| 17 | OOMScoreAdjust=-1000 | ||
| 18 | # ... but allow it still to be effective for child processes | ||
| 19 | # (note that these settings are ignored by Postgres releases before 9.5) | ||
| 20 | Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj | ||
| 21 | Environment=PG_OOM_ADJUST_VALUE=0 | ||
| 30 | 22 | ||
| 31 | start () | 23 | # Maximum number of seconds pg_ctl will wait for postgres to start. Note that |
| 32 | { | 24 | # PGSTARTTIMEOUT should be less than TimeoutSec value. |
| 33 | echo -n "Starting postgres server..." | 25 | Environment=PGSTARTTIMEOUT=270 |
| 34 | if pidof ${DAEMON} > /dev/null; then | ||
| 35 | echo "already running." | ||
| 36 | exit 0 | ||
| 37 | fi | ||
| 38 | touch /var/log/postgresql.log | ||
| 39 | chown postgres /var/log/postgresql.log | ||
| 40 | sudo -u postgres /usr/bin/pg_ctl start -w -D $datadir -s -l /var/log/postgresql.log | ||
| 41 | if [ $? -eq 0 ]; then | ||
| 42 | echo "done." | ||
| 43 | else | ||
| 44 | echo "failed." | ||
| 45 | fi | ||
| 46 | } | ||
| 47 | 26 | ||
| 48 | stop () | 27 | Environment=PGDATA=/usr/local/pgsql/data |
| 49 | { | ||
| 50 | echo -n "Stopping postgres server..." | ||
| 51 | if ! pidof ${DAEMON} >/dev/null; then | ||
| 52 | echo "not running." | ||
| 53 | exit 0 | ||
| 54 | fi | ||
| 55 | sudo -u postgres /usr/bin/pg_ctl stop -w -D $datadir -m fast -s | ||
| 56 | if [ $? -eq 0 ]; then | ||
| 57 | echo "done." | ||
| 58 | else | ||
| 59 | if [ -f $DEFAULT_DATA_DIR/postmaster.pid -a "$datadir" != "$DEFAULT_DATA_DIR" ] ; then | ||
| 60 | # Special case for transition | ||
| 61 | sudo -u postgres /usr/bin/pg_ctl stop -w -D $DEFAULT_DATA_DIR -m fast -s | ||
| 62 | fi | ||
| 63 | if ! pidof ${DAEMON} > /dev/null; then | ||
| 64 | echo "done." | ||
| 65 | else | ||
| 66 | echo "failed." | ||
| 67 | exit 1 | ||
| 68 | fi | ||
| 69 | fi | ||
| 70 | } | ||
| 71 | 28 | ||
| 72 | case "$1" in | ||
| 73 | start) | ||
| 74 | start | ||
| 75 | ;; | ||
| 76 | stop) | ||
| 77 | stop | ||
| 78 | ;; | ||
| 79 | force-reload) | ||
| 80 | stop | ||
| 81 | start | ||
| 82 | ;; | ||
| 83 | restart) | ||
| 84 | stop | ||
| 85 | start | ||
| 86 | ;; | ||
| 87 | *) | ||
| 88 | echo "Usage: $0 {start|stop|force-reload|restart}" | ||
| 89 | exit 1 | ||
| 90 | ;; | ||
| 91 | esac | ||
| 92 | 29 | ||
| 93 | exit 0 | 30 | ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT} |
| 31 | ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast | ||
| 32 | ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s | ||
| 33 | |||
| 34 | # Give a reasonable amount of time for the server to start up/shut down. | ||
| 35 | # Ideally, the timeout for starting PostgreSQL server should be handled more | ||
| 36 | # nicely by pg_ctl in ExecStart, so keep its timeout smaller than this value. | ||
| 37 | TimeoutSec=300 | ||
| 38 | |||
| 39 | [Install] | ||
| 40 | WantedBy=multi-user.target | ||
diff --git a/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init b/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init index f5e7dfb..cc7b13e 100644 --- a/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init +++ b/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init | |||
| @@ -18,11 +18,14 @@ if [ -e $DATA_DIR/PG_VERSION ]; then | |||
| 18 | exit 0 | 18 | exit 0 |
| 19 | fi | 19 | fi |
| 20 | 20 | ||
| 21 | # Create the DB | ||
| 21 | sudo -u postgres initdb -D $DATA_DIR | 22 | sudo -u postgres initdb -D $DATA_DIR |
| 23 | |||
| 24 | # Allow readers/writers by IP | ||
| 22 | echo "listen_addresses = '*'" >> $DATA_DIR/postgresql.conf | 25 | echo "listen_addresses = '*'" >> $DATA_DIR/postgresql.conf |
| 23 | echo "host all all ${CONTROLLER_IP}/32 trust" >> $DATA_DIR/pg_hba.conf | 26 | echo "host all all ${CONTROLLER_IP}/32 trust" >> $DATA_DIR/pg_hba.conf |
| 24 | echo "host all all ${COMPUTE_IP}/32 trust" >> $DATA_DIR/pg_hba.conf | 27 | echo "host all all ${COMPUTE_IP}/32 trust" >> $DATA_DIR/pg_hba.conf |
| 25 | /etc/init.d/postgresql start | 28 | systemctl restart postgresql |
| 26 | 29 | ||
| 27 | count=0 | 30 | count=0 |
| 28 | done=0 | 31 | done=0 |
| @@ -30,9 +33,9 @@ while [ $count -le 10 ] && [ $done -eq 0 ]; do | |||
| 30 | sudo -u postgres psql -c "CREATE ROLE ${DB_USER} WITH SUPERUSER LOGIN PASSWORD '${DB_PASSWORD}'" 2> /dev/null | 33 | sudo -u postgres psql -c "CREATE ROLE ${DB_USER} WITH SUPERUSER LOGIN PASSWORD '${DB_PASSWORD}'" 2> /dev/null |
| 31 | if [ $? -ne 0 ]; then | 34 | if [ $? -ne 0 ]; then |
| 32 | echo "[INFO] postgres: failed to create account for ${DB_USER}, trying again" | 35 | echo "[INFO] postgres: failed to create account for ${DB_USER}, trying again" |
| 33 | /etc/init.d/postgresql stop | 36 | systemctl stop postresql |
| 34 | sleep 3 | 37 | sleep 3 |
| 35 | /etc/init.d/postgresql start | 38 | systemctl start postgresql |
| 36 | sleep 3 | 39 | sleep 3 |
| 37 | else | 40 | else |
| 38 | echo "[INFO] postgres: created account for ${DB_USER}, continuing .. " | 41 | echo "[INFO] postgres: created account for ${DB_USER}, continuing .. " |
diff --git a/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init.service b/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init.service new file mode 100644 index 0000000..94206d2 --- /dev/null +++ b/meta-openstack/recipes-support/postgresql/postgresql/postgresql-init.service | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | [Unit] | ||
| 2 | Description=Postgresql setup for OpenStack | ||
| 3 | After=postgresql.service | ||
| 4 | |||
| 5 | [Service] | ||
| 6 | Type=oneshot | ||
| 7 | ExecStart=%SYSCONFIGDIR%/postgresql/postgresql-init | ||
| 8 | ExecStartPost=/bin/systemctl --no-reload disable postgresql-init.service | ||
| 9 | RemainAfterExit=No | ||
| 10 | |||
| 11 | [Install] | ||
| 12 | WantedBy=multi-user.target | ||
diff --git a/meta-openstack/recipes-support/postgresql/postgresql_9.%.bbappend b/meta-openstack/recipes-support/postgresql/postgresql_9.%.bbappend index b26054e..5b87960 100644 --- a/meta-openstack/recipes-support/postgresql/postgresql_9.%.bbappend +++ b/meta-openstack/recipes-support/postgresql/postgresql_9.%.bbappend | |||
| @@ -1,57 +1,46 @@ | |||
| 1 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" | 1 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" |
| 2 | 2 | ||
| 3 | SRC_URI += "file://postgresql \ | 3 | SRC_URI += " \ |
| 4 | file://postgresql-init" | 4 | file://postgresql-init \ |
| 5 | file://postgresql-init.service \ | ||
| 6 | " | ||
| 5 | 7 | ||
| 6 | inherit useradd update-rc.d identity hosts | 8 | inherit identity hosts |
| 7 | 9 | ||
| 8 | PACKAGECONFIG[libxml] = "--with-libxml CFLAGS=-I${STAGING_INCDIR}/libxml2,--without-libxml,libxml2,libxml2" | 10 | SYSTEMD_AUTO_ENABLE_${PN} = "enable" |
| 9 | 11 | ||
| 10 | # default | 12 | # default |
| 11 | DB_DATADIR ?= "/var/lib/postgres/data" | 13 | DB_DATADIR ?= "/var/lib/postgres/data" |
| 12 | 14 | ||
| 13 | do_install_append() { | 15 | do_install_append() { |
| 14 | INIT_D_DEST_DIR=${D}${sysconfdir}/init.d | 16 | D_DEST_DIR=${D}${sysconfdir}/postgresql |
| 15 | 17 | ||
| 16 | install -d ${D}${sysconfdir}/init.d/ | 18 | install -d ${D_DEST_DIR} |
| 17 | install -m 0755 ${WORKDIR}/postgresql ${INIT_D_DEST_DIR}/postgresql | 19 | install -m 0755 ${WORKDIR}/postgresql-init ${D_DEST_DIR}/postgresql-init |
| 18 | install -m 0755 ${WORKDIR}/postgresql-init ${INIT_D_DEST_DIR}/postgresql-init | ||
| 19 | 20 | ||
| 20 | sed -e "s:%DB_DATADIR%:${DB_DATADIR}:g" -i ${INIT_D_DEST_DIR}/postgresql | 21 | sed -e "s:%DB_DATADIR%:${DB_DATADIR}:g" -i ${D_DEST_DIR}/postgresql-init |
| 21 | sed -e "s:%DB_DATADIR%:${DB_DATADIR}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 22 | sed -e "s:\(PGDATA=\).*$:\1${DB_DATADIR}:g" -i ${D}${systemd_unitdir}/system/postgresql.service |
| 22 | 23 | ||
| 23 | sed -e "s:%DB_USER%:${DB_USER}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 24 | sed -e "s:%DB_USER%:${DB_USER}:g" -i ${D_DEST_DIR}/postgresql-init |
| 24 | sed -e "s:%DB_PASSWORD%:${DB_PASSWORD}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 25 | sed -e "s:%DB_PASSWORD%:${DB_PASSWORD}:g" -i ${D_DEST_DIR}/postgresql-init |
| 25 | 26 | ||
| 26 | sed -e "s:%CONTROLLER_IP%:${CONTROLLER_IP}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 27 | sed -e "s:%CONTROLLER_IP%:${CONTROLLER_IP}:g" -i ${D_DEST_DIR}/postgresql-init |
| 27 | sed -e "s:%CONTROLLER_HOST%:${CONTROLLER_HOST}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 28 | sed -e "s:%CONTROLLER_HOST%:${CONTROLLER_HOST}:g" -i ${D_DEST_DIR}/postgresql-init |
| 28 | 29 | ||
| 29 | sed -e "s:%COMPUTE_IP%:${COMPUTE_IP}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 30 | sed -e "s:%COMPUTE_IP%:${COMPUTE_IP}:g" -i ${D_DEST_DIR}/postgresql-init |
| 30 | sed -e "s:%COMPUTE_HOST%:${COMPUTE_HOST}:g" -i ${INIT_D_DEST_DIR}/postgresql-init | 31 | sed -e "s:%COMPUTE_HOST%:${COMPUTE_HOST}:g" -i ${D_DEST_DIR}/postgresql-init |
| 31 | } | ||
| 32 | 32 | ||
| 33 | RDEPENDS_${PN} += "postgresql-timezone eglibc-utils update-rc.d" | 33 | install -d ${D}${systemd_unitdir}/system/ |
| 34 | USERADD_PACKAGES = "${PN}" | 34 | PG_INIT_SERVICE_FILE=${D}${systemd_unitdir}/system/postgresql-init.service |
| 35 | GROUPADD_PARAM_${PN} = "--system postgres" | 35 | install -m 644 ${WORKDIR}/postgresql-init.service ${PG_INIT_SERVICE_FILE} |
| 36 | USERADD_PARAM_${PN} = "--system --home /var/lib/postgres -g postgres \ | 36 | sed -e "s:%SYSCONFIGDIR%:${sysconfdir}:g" -i ${PG_INIT_SERVICE_FILE} |
| 37 | --no-create-home --shell /bin/false postgres" | 37 | } |
| 38 | 38 | ||
| 39 | PACKAGES += " ${PN}-setup" | 39 | PACKAGES += " ${PN}-setup" |
| 40 | ALLOW_EMPTY_${PN}-setup = "1" | ||
| 41 | |||
| 42 | pkg_postinst_${PN}-setup () { | ||
| 43 | # postgres 9.2.4 postinst | ||
| 44 | if [ -z "$D" ]; then | ||
| 45 | /etc/init.d/postgresql-init | ||
| 46 | if [ $? -ne 0 ]; then | ||
| 47 | echo "[ERROR] postgres: unable to create admin account" | ||
| 48 | exit 1 | ||
| 49 | fi | ||
| 50 | fi | ||
| 51 | } | ||
| 52 | 40 | ||
| 53 | FILES_${PN} += "${localstatedir}/run/${PN}" | 41 | SYSTEMD_PACKAGES += "${PN}-setup" |
| 42 | SYSTEMD_SERVICE_${PN}-setup = "postgresql-init.service" | ||
| 54 | 43 | ||
| 55 | INITSCRIPT_PACKAGES = "${PN}" | 44 | FILES_${PN}-setup = " \ |
| 56 | INITSCRIPT_NAME = "${PN}" | 45 | ${systemd_unitdir}/system \ |
| 57 | INITSCRIPT_PARAMS = "defaults" | 46 | " |
