bdr: Rework build/test infrastructure to better work as a out of tree module
authorAndres Freund <andres@anarazel.de>
Fri, 26 Sep 2014 11:31:16 +0000 (13:31 +0200)
committerAndres Freund <andres@anarazel.de>
Fri, 26 Sep 2014 22:12:26 +0000 (00:12 +0200)
We now implicitly build using pgxs and have our own wrapper around
pg_*regress to run make check without a sourcetree around. Also tests
are based on a commonly included config file instead of duplicating
things over and over.

Makefile
bdr_common_regress.conf [new file with mode: 0644]
bdr_ddlregress.conf [deleted file]
bdr_isolationregress.conf
bdr_pgbench.conf
bdr_regress.conf [new file with mode: 0644]
run_tests [new file with mode: 0755]

index 64bab5d53a29a06c44b6fe549e099e4f28f806c4..176fd3f37100722629581951feeaba82e21b0ea7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,7 @@ SCRIPTS = scripts/bdr_initial_load bdr_init_copy
 
 PG_CPPFLAGS = -I$(libpq_srcdir)
 SHLIB_LINK = $(libpq)
-SHLIB_PREREQS = submake-libpq
+
 OBJS = \
    bdr.o \
    bdr_apply.o \
@@ -29,16 +29,12 @@ OBJS = \
    bdr_relcache.o \
    bdr_seq.o
 
-ifndef USE_PGXS
-subdir = contrib/bdr
-top_builddir = ../..
-include $(top_builddir)/src/Makefile.global
-include $(top_srcdir)/contrib/contrib-global.mk
-else
+# Can only be built using pgxs
+USE_PGXS=1
+
 PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
-endif
 
 DATE=$(shell date "+%Y-%m-%d")
 GITHASH=$(shell if [ -e .distgitrev ]; then cat .distgitrev; else git rev-parse --short HEAD; fi)
@@ -49,7 +45,7 @@ bdr_version.h: bdr_version.h.in
 
 bdr.o: bdr_version.h
 
-bdr_init_copy: bdr_init_copy.o | submake-libpq submake-libpgport
+bdr_init_copy: bdr_init_copy.o
    $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(libpq_pgport) $(LIBS) -o $@$(X)
 
 scripts/bdr_initial_load: scripts/bdr_initial_load.in
@@ -68,44 +64,12 @@ additional-clean:
 # typical installcheck users do not have (e.g. buildfarm clients).
 installcheck: ;
 
-check: all | submake-regress submake-btree_gist submake-pg_trgm submake-cube submake-hstore regresscheck isolationcheck
-
-ifndef USE_PGXS
-submake-regress:
-   $(MAKE) -C $(top_builddir)/src/test/regress
-
-submake-isolation: | submake-regress
-   $(MAKE) -C $(top_builddir)/src/test/isolation
-
-submake-btree_gist:
-   $(MAKE) -C $(top_builddir)/contrib/btree_gist
-
-submake-pg_trgm:
-   $(MAKE) -C $(top_builddir)/contrib/pg_trgm
-
-submake-cube:
-   $(MAKE) -C $(top_builddir)/contrib/cube
-
-submake-hstore:
-   $(MAKE) -C $(top_builddir)/contrib/hstore
+check: regresscheck isolationcheck
 
 REGRESSCHECKS=init \
    ddl/create ddl/alter_table ddl/extension ddl/function ddl/grant ddl/namespace ddl/sequence ddl/view \
    dml/basic dml/contrib dml/delete_pk dml/extended dml/missing_pk dml/mixed dml/toasted
 
-regresscheck:
-   [ -e pg_hba.conf ] || ln -s $(top_srcdir)/contrib/bdr/pg_hba.conf .
-   mkdir -p results/ddl
-   mkdir -p results/dml
-   $(pg_regress_check) \
-       --temp-config $(top_srcdir)/contrib/bdr/bdr_ddlregress.conf \
-       --temp-install=./tmp_check \
-       --extra-install=contrib/btree_gist \
-       --extra-install=contrib/bdr \
-       --extra-install=contrib/pg_trgm \
-       --extra-install=contrib/cube \
-       --extra-install=contrib/hstore \
-       $(REGRESSCHECKS)
 
 ISOLATIONCHECKS=\
    isolation/waitforstart \
@@ -119,17 +83,27 @@ ISOLATIONCHECKS=\
 #  this test demonstrates a divergent conflict, so deactivate for now
 #  isolation/update_pk_change_conflict
 
-isolationcheck: all | submake-isolation submake-btree_gist
+# XXX: Add a check that these are installed
+REQUIRED_EXTENSIONS="btree_gist"
+REQUIRED_TEST_EXTENSIONS="pg_trgm cube hstore"
+
+regresscheck: all install
    [ -e pg_hba.conf ] || ln -s $(top_srcdir)/contrib/bdr/pg_hba.conf .
+
+   mkdir -p results/ddl
+   mkdir -p results/dml
+
+   ./run_tests --config bdr_regress.conf \
+       --testbinary src/test/regress/pg_regress \
+       $(REGRESSCHECKS)
+
+isolationcheck: all install
    mkdir -p results/isolation
-   $(pg_isolation_regress_check) \
-       --dbname node1,node2,node3 \
-       --temp-config $(top_srcdir)/contrib/bdr/bdr_isolationregress.conf \
-       --temp-install=./tmp_check \
-       --extra-install=contrib/btree_gist \
-       --extra-install=contrib/bdr \
-       $(ISOLATIONCHECKS)
 
+   ./run_tests --config bdr_isolationregress.conf \
+       --testbinary src/test/isolation/pg_isolation_regress \
+       --dbname node1,node2,node3 \
+       $(ISOLATIONCHECKS)
 
 bdr_pgbench_check: bdr_pgbench_check.sh
    sed -e 's,@bindir@,$(bindir),g' \
@@ -142,31 +116,6 @@ bdr_pgbench_check: bdr_pgbench_check.sh
 pgbenchcheck: bdr_pgbench_check
    ./bdr_pgbench_check
 
-else #USE_PGXS
-
-error-pgxs:
-   @echo "Regression checks require an in-tree build in contrib/bdr"
-   @echo "You cannot run \"make check\" using pgxs"
-   exit 1
-
-submake-regress: ;
-
-submake-btree_gist: ;
-
-submake-pg_trgm: ;
-
-submake-cube: ;
-
-submake-hstore: ;
-
-bdr_pgbench_check: error-pgxs
-   ;
-
-regresscheck: error-pgxs
-   ;
-
-endif #USE_PGXS
-
 distdir = bdr-$(BDR_VERSION)
 
 git-dist: clean
@@ -185,4 +134,4 @@ PHONY: submake-regress
 
 # phony target...
 
-.PHONY: all check
+.PHONY: all check regresscheck isolationcheck
diff --git a/bdr_common_regress.conf b/bdr_common_regress.conf
new file mode 100644 (file)
index 0000000..fc672cb
--- /dev/null
@@ -0,0 +1,16 @@
+max_connections = 20
+max_wal_senders = 10
+max_replication_slots = 10
+
+shared_preload_libraries = 'bdr'
+
+track_commit_timestamp = on
+
+wal_level = 'logical'
+hba_file = 'pg_hba.conf'
+
+DateStyle = 'ISO, DMY'
+
+log_line_prefix='[%m] [%p] [%d] '
+
+fsync=off
diff --git a/bdr_ddlregress.conf b/bdr_ddlregress.conf
deleted file mode 100644 (file)
index c39c6a8..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-listen_addresses = '*'
-max_connections = 20
-
-shared_preload_libraries = 'bdr'
-bdr.connections = 'node1, node2'
-
-bdr.node1_dsn = 'dbname=postgres'
-bdr.node1_local_dbname = 'regression'
-
-bdr.node2_dsn = 'dbname=regression'
-bdr.node2_local_dbname = 'postgres'
-
-bdr.permit_unsafe_ddl_commands = false
-
-track_commit_timestamp = on
-
-max_wal_senders = 10
-max_replication_slots = 10
-
-wal_level = 'logical'
-wal_keep_segments = 625 # roughly 9GB max
-
-hba_file = 'pg_hba.conf'
-
-DateStyle = 'ISO, DMY'
index e5a6a29cc75c36e5cbc61ea9a79823a0cbf011c1..5aee77cc409a0c141fe1621c861d892b70aabb74 100644 (file)
@@ -1,7 +1,5 @@
-listen_addresses = '*'
-max_connections = 20
+include = 'bdr_common_regress.conf'
 
-shared_preload_libraries = 'bdr'
 bdr.connections = 'node1to2,node1to3,node2to3,node2to1,node3to1,node3to2'
 
 bdr.node1to2_dsn = 'dbname=node2'
@@ -23,22 +21,11 @@ bdr.node3to1_local_dbname = 'node3'
 bdr.node3to2_dsn = 'dbname=node2'
 bdr.node3to2_local_dbname = 'node3'
 
-bdr.permit_unsafe_ddl_commands = false
-
 bdr.log_conflicts_to_table = True
 bdr.default_apply_delay = 100
 
-track_commit_timestamp = on
-
-max_wal_senders = 10
-max_replication_slots = 10
-
-wal_level = 'logical'
-
-hba_file = 'pg_hba.conf'
-
-log_min_messages = 'debug4'
-log_line_prefix = 'd=%d p=%p a=%a%q '
+#log_min_messages = 'debug4'
+#log_line_prefix = 'd=%d p=%p a=%a%q '
 log_statement = 'all'
 
 max_worker_processes = 18
index 0a5885ab7c214db5688ca198079682a4d72cf6df..67cfc570399e3f311a7d74ce7d58d2a293bf1140 100644 (file)
@@ -21,4 +21,3 @@ max_replication_slots = 10
 checkpoint_segments = 50
 
 wal_level = 'logical'
-wal_keep_segments = 25
diff --git a/bdr_regress.conf b/bdr_regress.conf
new file mode 100644 (file)
index 0000000..845899f
--- /dev/null
@@ -0,0 +1,9 @@
+include = 'bdr_common_regress.conf'
+shared_preload_libraries = 'bdr'
+bdr.connections = 'node1, node2'
+
+bdr.node1_dsn = 'dbname=postgres'
+bdr.node1_local_dbname = 'regression'
+
+bdr.node2_dsn = 'dbname=regression'
+bdr.node2_local_dbname = 'postgres'
diff --git a/run_tests b/run_tests
new file mode 100755 (executable)
index 0000000..0a762cc
--- /dev/null
+++ b/run_tests
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+set -e
+#set -x
+
+BINDIR=$(pg_config --bindir)
+REGRESS_BASE=$(pg_config --libdir)/pgxs/
+DBNAME=regression
+
+mkdir -p tmp_check
+rm -rf tmp_check/data
+rm -rf tmp_check/postmaster.log
+rm -rf tmp_check/initdb.log
+mkdir tmp_check/data
+
+PARSEOPTS=$(getopt \
+    --longoptions testbinary: \
+    --longoptions dbname: \
+    --longoptions config: \
+    -o 'h' -- "$@")
+
+eval set -- "$PARSEOPTS"
+
+
+usage() {
+    echo "run_tests -h --testbinary binary LIST OF TESTS"
+    exit 1
+}
+
+while true ; do
+    case "$1" in
+   -h) usage; shift;;
+   --testbinary) TESTBINARY="$2"; shift;shift;;
+   --dbname) DBNAME="$2"; shift;shift;;
+   --config) CONFIGFILE="$2"; shift;shift;;
+   --) shift ; break ;;
+   *) echo "unknown option $1"; exit 1;;
+    esac
+done
+
+SOCKET=$(pwd)/tmp_check
+PORT=5440
+OPTIONS="-c config_file=${CONFIGFILE}"
+OPTIONS="$OPTIONS -c unix_socket_directories=$SOCKET"
+OPTIONS="$OPTIONS -c listen_addresses=''"
+
+PGHOST=$SOCKET
+PGPORT=$PORT
+
+# create new data directory
+$BINDIR/initdb --nosync tmp_check/data > tmp_check/initdb.log 2>&1
+
+# install trap to shutdown server at failure/exit
+trap "$BINDIR/pg_ctl stop -w -D tmp_check/data" INT QUIT TERM EXIT
+
+#start server
+$BINDIR/pg_ctl start -w -D tmp_check/data -o "$OPTIONS" -l tmp_check/postmaster.log
+
+$REGRESS_BASE/$TESTBINARY \
+    --host $SOCKET \
+    --port $PORT \
+    --dbname $DBNAME \
+    "$@"
+
+exit 0