mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Add pg_upgrade test suite
It runs the regression tests, runs pg_upgrade on the populated database, and compares the before and after dumps. While not actually a cross-version upgrade, this does detect omissions and bugs in the involved tools from time to time. It's also possible to do a cross-version upgrade by manually supplying parameters.
This commit is contained in:
parent
8722a1a06a
commit
08da2d282f
4
contrib/pg_upgrade/.gitignore
vendored
4
contrib/pg_upgrade/.gitignore
vendored
@ -1 +1,5 @@
|
||||
/pg_upgrade
|
||||
# Generated by test suite
|
||||
delete_old_cluster.sh
|
||||
/log/
|
||||
/tmp_check/
|
||||
|
@ -21,3 +21,11 @@ top_builddir = ../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
include $(top_srcdir)/contrib/contrib-global.mk
|
||||
endif
|
||||
|
||||
check: test.sh
|
||||
MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $< --install
|
||||
|
||||
installcheck: test.sh
|
||||
MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $<
|
||||
|
||||
EXTRA_CLEAN = delete_old_cluster.sh log/ tmp_check/
|
||||
|
@ -62,3 +62,22 @@ steps:
|
||||
|
||||
7) Diff the regression database dump file with the regression dump
|
||||
file loaded into the old server.
|
||||
|
||||
The shell script test.sh in this directory performs more or less this
|
||||
procedure. You can invoke it by running
|
||||
|
||||
gmake check
|
||||
|
||||
or by running
|
||||
|
||||
gmake installcheck
|
||||
|
||||
if "gmake install" (or "gmake install-world") were done beforehand.
|
||||
When invoked without arguments, it will run an upgrade from the
|
||||
version in this source tree to a new instance of the same version. To
|
||||
test an upgrade from a different version, invoke it like this:
|
||||
|
||||
gmake installcheck oldbindir=...otherversion/bin oldsrc=...somewhere/postgresql
|
||||
|
||||
In this case, you will have to manually eyeball the resulting dump
|
||||
diff for version-specific differences, as explained above.
|
||||
|
123
contrib/pg_upgrade/test.sh
Normal file
123
contrib/pg_upgrade/test.sh
Normal file
@ -0,0 +1,123 @@
|
||||
#!/bin/sh
|
||||
|
||||
# contrib/pg_upgrade/test.sh
|
||||
#
|
||||
# Test driver for pg_upgrade. Initializes a new database cluster,
|
||||
# runs the regression tests (to put in some data), runs pg_dumpall,
|
||||
# runs pg_upgrade, runs pg_dumpall again, compares the dumps.
|
||||
#
|
||||
# Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
|
||||
# Portions Copyright (c) 1994, Regents of the University of California
|
||||
|
||||
set -e
|
||||
|
||||
: ${MAKE=make}
|
||||
: ${PGPORT=50432}
|
||||
export PGPORT
|
||||
|
||||
temp_root=$PWD/tmp_check
|
||||
|
||||
if [ "$1" = '--install' ]; then
|
||||
temp_install=$temp_root/install
|
||||
bindir=$temp_install/$bindir
|
||||
libdir=$temp_install/$libdir
|
||||
|
||||
"$MAKE" -s -C ../.. install DESTDIR="$temp_install"
|
||||
"$MAKE" -s -C ../pg_upgrade_support install DESTDIR="$temp_install"
|
||||
"$MAKE" -s -C . install DESTDIR="$temp_install"
|
||||
|
||||
# platform-specific magic to find the shared libraries; see pg_regress.c
|
||||
LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH
|
||||
DYLD_LIBRARY_PATH=$libdir:$DYLD_LIBRARY_PATH
|
||||
export DYLD_LIBRARY_PATH
|
||||
LIBPATH=$libdir:$LIBPATH
|
||||
export LIBPATH
|
||||
PATH=$libdir:$PATH
|
||||
|
||||
# We need to make it use psql from our temporary installation,
|
||||
# because otherwise the installcheck run below would try to
|
||||
# use psql from the proper installation directory, which might
|
||||
# be outdated or missing.
|
||||
EXTRA_REGRESS_OPTS=--psqldir=$bindir
|
||||
export EXTRA_REGRESS_OPTS
|
||||
fi
|
||||
|
||||
: ${oldbindir=$bindir}
|
||||
|
||||
: ${oldsrc=../..}
|
||||
oldsrc=`cd "$oldsrc" && pwd`
|
||||
newsrc=`cd ../.. && pwd`
|
||||
|
||||
PATH=$bindir:$PATH
|
||||
export PATH
|
||||
|
||||
PGDATA=$temp_root/data
|
||||
export PGDATA
|
||||
rm -rf "$PGDATA" "$PGDATA".old
|
||||
|
||||
logdir=$PWD/log
|
||||
rm -rf "$logdir"
|
||||
mkdir "$logdir"
|
||||
|
||||
set -x
|
||||
|
||||
$oldbindir/initdb
|
||||
$oldbindir/pg_ctl start -l "$logdir/postmaster1.log" -w
|
||||
if "$MAKE" -C "$oldsrc" installcheck; then
|
||||
pg_dumpall >"$temp_root"/dump1.sql || pg_dumpall1_status=$?
|
||||
if [ "$newsrc" != "$oldsrc" ]; then
|
||||
oldpgversion=`psql -A -t -d regression -c "SHOW server_version_num"`
|
||||
fix_sql=""
|
||||
case $oldpgversion in
|
||||
804??)
|
||||
fix_sql="UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%'; DROP FUNCTION public.myfunc(integer);"
|
||||
;;
|
||||
900??)
|
||||
fix_sql="SET bytea_output TO escape; UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';"
|
||||
;;
|
||||
901??)
|
||||
fix_sql="UPDATE pg_proc SET probin = replace(probin, '$oldsrc', '$newsrc') WHERE probin LIKE '$oldsrc%';"
|
||||
;;
|
||||
esac
|
||||
psql -d regression -c "$fix_sql;" || psql_fix_sql_status=$?
|
||||
|
||||
mv "$temp_root"/dump1.sql "$temp_root"/dump1.sql.orig
|
||||
sed "s;$oldsrc;$newsrc;g" "$temp_root"/dump1.sql.orig >"$temp_root"/dump1.sql
|
||||
fi
|
||||
else
|
||||
make_installcheck_status=$?
|
||||
fi
|
||||
$oldbindir/pg_ctl -m fast stop
|
||||
if [ -n "$make_installcheck_status" ]; then
|
||||
exit 1
|
||||
fi
|
||||
if [ -n "$psql_fix_sql_status" ]; then
|
||||
exit 1
|
||||
fi
|
||||
if [ -n "$pg_dumpall1_status" ]; then
|
||||
echo "pg_dumpall of pre-upgrade database cluster failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv "${PGDATA}" "${PGDATA}.old"
|
||||
|
||||
initdb
|
||||
|
||||
pg_upgrade -d "${PGDATA}.old" -D "${PGDATA}" -b "$oldbindir" -B "$bindir"
|
||||
|
||||
pg_ctl start -l "$logdir/postmaster2.log" -w
|
||||
pg_dumpall >"$temp_root"/dump2.sql || pg_dumpall2_status=$?
|
||||
pg_ctl -m fast stop
|
||||
if [ -n "$pg_dumpall2_status" ]; then
|
||||
echo "pg_dumpall of post-upgrade database cluster failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if diff -q "$temp_root"/dump1.sql "$temp_root"/dump2.sql; then
|
||||
echo PASSED
|
||||
exit 0
|
||||
else
|
||||
echo "dumps were not identical"
|
||||
exit 1
|
||||
fi
|
@ -207,7 +207,7 @@ ifdef OBJS
|
||||
rm -f $(OBJS)
|
||||
endif
|
||||
ifdef EXTRA_CLEAN
|
||||
rm -f $(EXTRA_CLEAN)
|
||||
rm -rf $(EXTRA_CLEAN)
|
||||
endif
|
||||
ifdef REGRESS
|
||||
# things created by various check targets
|
||||
|
@ -132,7 +132,7 @@ tablespace-setup:
|
||||
## Run tests
|
||||
##
|
||||
|
||||
REGRESS_OPTS = --dlpath=.
|
||||
REGRESS_OPTS = --dlpath=. $(EXTRA_REGRESS_OPTS)
|
||||
|
||||
check: all tablespace-setup
|
||||
$(pg_regress_check) $(REGRESS_OPTS) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) $(TEMP_CONF) $(EXTRA_TESTS)
|
||||
|
Loading…
Reference in New Issue
Block a user