148 lines
4.2 KiB
Bash
148 lines
4.2 KiB
Bash
# shellcheck shell=dash
|
|
# Shared PostgreSQL harness for db-tool tests.
|
|
|
|
pg_harness__start_busy_socket() {
|
|
pg_harness_socket_dir="$1"
|
|
PG_HARNESS_BUSY_SOCKET_PATH="$pg_harness_socket_dir/.s.PGSQL.5432"
|
|
export PG_HARNESS_BUSY_SOCKET_PATH
|
|
|
|
rm -f "$PG_HARNESS_BUSY_SOCKET_PATH"
|
|
nc -l -U "$PG_HARNESS_BUSY_SOCKET_PATH" >/dev/null 2>&1 &
|
|
PG_HARNESS_BUSY_SOCKET_PID=$!
|
|
export PG_HARNESS_BUSY_SOCKET_PID
|
|
}
|
|
|
|
pg_harness_start() {
|
|
pg_harness_tmp_root="${TMPDIR:-/tmp}"
|
|
|
|
if [ "${PG_HARNESS_PGDATA_OVERRIDE+x}" ]; then
|
|
pgdata_dir="$PG_HARNESS_PGDATA_OVERRIDE"
|
|
else
|
|
pgdata_dir=$(mktemp -d "$pg_harness_tmp_root/pgdata_XXXXXX")
|
|
fi
|
|
|
|
PGDATA="$pgdata_dir"
|
|
export PGDATA
|
|
|
|
trap 'pg_harness_stop' EXIT INT TERM
|
|
|
|
if ! initdb -D "$pgdata_dir" --no-locale --encoding=UTF8 -U postgres >/dev/null 2>&1; then
|
|
pg_harness_stop
|
|
return 1
|
|
fi
|
|
|
|
if [ "${PG_HARNESS_INJECT_BUSY_SOCKET+x}" ] && ! [ "${PG_HARNESS_BUSY_SOCKET_PID+x}" ]; then
|
|
pg_harness__start_busy_socket "$pgdata_dir"
|
|
fi
|
|
|
|
if ! pg_ctl start -D "$pgdata_dir" -o "-k $pgdata_dir -h ''" >/dev/null 2>&1; then
|
|
pg_harness_stop
|
|
return 1
|
|
fi
|
|
|
|
PGHOST="$pgdata_dir"
|
|
PGPORT=""
|
|
PGUSER="postgres"
|
|
PGDATABASE="postgres"
|
|
export PGHOST PGPORT PGUSER PGDATABASE
|
|
|
|
POSTGRESQL_HOST="$PGHOST"
|
|
POSTGRESQL_PORT="$PGPORT"
|
|
POSTGRESQL_USER="$PGUSER"
|
|
POSTGRESQL_DATABASE="$PGDATABASE"
|
|
PGURL="postgresql://postgres@localhost/postgres?host=$pgdata_dir"
|
|
export POSTGRESQL_HOST POSTGRESQL_PORT POSTGRESQL_USER POSTGRESQL_DATABASE PGURL
|
|
|
|
pg_harness_ready=
|
|
pg_harness_attempt=0
|
|
while [ "$pg_harness_attempt" -lt 10 ]; do
|
|
if pg_isready -h "$pgdata_dir" >/dev/null 2>&1; then
|
|
pg_harness_ready=1
|
|
break
|
|
fi
|
|
|
|
sleep 0.5
|
|
pg_harness_attempt=$((pg_harness_attempt + 1))
|
|
done
|
|
|
|
if ! [ "$pg_harness_ready" = 1 ]; then
|
|
pg_harness_stop
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
pg_harness_stop() {
|
|
trap - EXIT INT TERM
|
|
|
|
if [ "${PG_HARNESS_BUSY_SOCKET_PID+x}" ]; then
|
|
kill "$PG_HARNESS_BUSY_SOCKET_PID" >/dev/null 2>&1 || true
|
|
wait "$PG_HARNESS_BUSY_SOCKET_PID" >/dev/null 2>&1 || true
|
|
unset PG_HARNESS_BUSY_SOCKET_PID
|
|
fi
|
|
|
|
if [ "${PG_HARNESS_BUSY_SOCKET_PATH+x}" ] && [ -n "$PG_HARNESS_BUSY_SOCKET_PATH" ]; then
|
|
rm -f "$PG_HARNESS_BUSY_SOCKET_PATH"
|
|
fi
|
|
|
|
if [ "${PGDATA+x}" ] && [ -n "$PGDATA" ]; then
|
|
pg_ctl stop -D "$PGDATA" -m fast >/dev/null 2>&1 || true
|
|
rm -rf "$PGDATA"
|
|
fi
|
|
|
|
if [ "${PG_HARNESS_PGDATA_OVERRIDE+x}" ] && [ -n "$PG_HARNESS_PGDATA_OVERRIDE" ]; then
|
|
if ! [ "${PGDATA+x}" ] || [ "$PG_HARNESS_PGDATA_OVERRIDE" != "$PGDATA" ]; then
|
|
rm -rf "$PG_HARNESS_PGDATA_OVERRIDE"
|
|
fi
|
|
fi
|
|
|
|
if [ "${PG_HARNESS_CORRUPT_PATH+x}" ] && [ -n "$PG_HARNESS_CORRUPT_PATH" ]; then
|
|
rm -f "$PG_HARNESS_CORRUPT_PATH"
|
|
fi
|
|
|
|
unset PG_HARNESS_BUSY_SOCKET_PATH
|
|
unset PG_HARNESS_CORRUPT_PATH
|
|
unset PG_HARNESS_INJECT_BUSY_SOCKET
|
|
unset PG_HARNESS_PGDATA_OVERRIDE
|
|
unset PGHOST PGPORT PGUSER PGDATABASE PGDATA
|
|
unset POSTGRESQL_HOST POSTGRESQL_PORT POSTGRESQL_USER POSTGRESQL_DATABASE PGURL
|
|
}
|
|
|
|
pg_harness_start_corrupt_dir() {
|
|
pg_harness_tmp_root="${TMPDIR:-/tmp}"
|
|
PG_HARNESS_PGDATA_OVERRIDE=$(mktemp "$pg_harness_tmp_root/pgdata_corrupt_XXXXXX")
|
|
: > "$PG_HARNESS_PGDATA_OVERRIDE"
|
|
PG_HARNESS_CORRUPT_PATH="$PG_HARNESS_PGDATA_OVERRIDE"
|
|
export PG_HARNESS_PGDATA_OVERRIDE PG_HARNESS_CORRUPT_PATH
|
|
}
|
|
|
|
pg_harness_busy_socket() {
|
|
pg_harness_tmp_root="${TMPDIR:-/tmp}"
|
|
PG_HARNESS_INJECT_BUSY_SOCKET=1
|
|
export PG_HARNESS_INJECT_BUSY_SOCKET
|
|
|
|
if [ "${PGDATA+x}" ] && [ -d "$PGDATA" ]; then
|
|
pg_harness_socket_dir="$PGDATA"
|
|
else
|
|
if [ "${PG_HARNESS_PGDATA_OVERRIDE+x}" ]; then
|
|
pg_harness_socket_dir="$PG_HARNESS_PGDATA_OVERRIDE"
|
|
else
|
|
pg_harness_socket_dir=$(mktemp -d "$pg_harness_tmp_root/pgdata_busy_XXXXXX")
|
|
PG_HARNESS_PGDATA_OVERRIDE="$pg_harness_socket_dir"
|
|
export PG_HARNESS_PGDATA_OVERRIDE
|
|
fi
|
|
fi
|
|
|
|
if [ "${PGDATA+x}" ] && [ -d "$PGDATA" ] && ! [ "${PG_HARNESS_BUSY_SOCKET_PID+x}" ]; then
|
|
pg_harness__start_busy_socket "$pg_harness_socket_dir"
|
|
fi
|
|
}
|
|
|
|
pg_harness_kill_postmaster() {
|
|
if ! [ "${PGDATA+x}" ] || ! [ -f "$PGDATA/postmaster.pid" ]; then
|
|
return 1
|
|
fi
|
|
|
|
IFS= read -r pg_harness_postmaster_pid < "$PGDATA/postmaster.pid" || return 1
|
|
kill -KILL "$pg_harness_postmaster_pid"
|
|
}
|