Thu Jun 9 22:07:21 PDT 2005
- Previous message: [Slony1-commit] By wieck: Fixed subtransaction bug The transaction ID used for log
- Next message: [Slony1-commit] By cbbrowne: Update to get latest tagging for RC1
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message: ----------- A preliminary test for the handling of subtransactions Added Files: ----------- slony1-engine/src/ducttape: test_E_subtransactions (r1.1) -------------- next part -------------- --- /dev/null +++ src/ducttape/test_E_subtransactions @@ -0,0 +1,318 @@ +#!/bin/sh +# $Id: test_E_subtransactions,v 1.1 2005/06/09 21:07:18 cbbrowne Exp $ +# ********** +# test_7_defines +# +# This test script creates a standalone pgbench database +# as slony_test1 and then: +# +# - initializes a primary node and starts the node daemon +# - creates a set containing all 4 pgbench tables +# - creates a second database as slony_test2 +# - adds database slony_test2 to the system +# - starts the second replication daemon +# - creates the pgbench tables (schema only) +# - subscribes the replication set from the primary node +# +# The nature of the test has to do with the use of the new slonik +# "define" and "include" commands. +# ********** + +export PATH +TMPOUT=/tmp/output.$$ +DB1=slony_test1 +DB2=slony_test2 +DEBUG_LEVEL=2 + +PGBENCH_SCALE=1 +PGBENCH_CLIENTS=5 +PGBENCH_TRANS=`expr 10000 / $PGBENCH_CLIENTS` + +trap ' + echo "" + echo "**** user abort" + if [ ! -z $pgbench_pid ] ; then + echo "**** killing pgbench" + kill -15 $pgbench_pid + fi + if [ ! -z $slon1_pid ] ; then + echo "**** killing node daemon 1" + kill -15 $slon1_pid + fi + if [ ! -z $slon2_pid ] ; then + echo "**** killing node daemon 2" + kill -15 $slon2_pid + fi + exit 1 +' 2 15 + +###################################################################### +# Preparations ... create a standalone pgbench database and +# have the "application" (pgbench) running. +###################################################################### + +##### +# Make sure the install is up to date +##### +WGM=`which gmake | egrep '^/'` +if [ -z "$WGM" ] ; then + MAKE=make + CGNU=`make -v | grep GNU` + if [ -z "$CGNU" ] ; then + echo "GNU Make not found - please install GNU Make" + exit 1 + fi +else + MAKE=gmake +fi +echo -n "**** running 'make install' in src directory ... " +if ! ${MAKE} -C .. install >$TMPOUT 2>&1 ; then + echo "failed"; cat $TMPOUT; rm $TMPOUT; exit 1 +fi +echo "done" +rm $TMPOUT + +PREAMBLE_FILE=/tmp/preamble.$$ +cat <<EOF > $PREAMBLE_FILE +define origin 11; +define sub1 22; +cluster name = T1; +node @origin admin conninfo='dbname=$DB1'; +node @sub1 admin conninfo='dbname=$DB2'; +EOF + + + +##### +# Remove old databases, if they exist +##### +echo "**** remove old test databases" +dropdb $DB1 || echo "**** ignored" +sleep 1 +dropdb $DB2 || echo "**** ignored" +sleep 1 + +##### +# Create the "Primary Node" +##### +echo "**** creating database for Node 11" + +createdb $DB1 || exit 1 +pgbench -i -s $PGBENCH_SCALE $DB1 +pg_dump -s $DB1 >pgbench_schema.sql + +##### +# Start pgbench in the background and give it rampup time +##### +pgbench -n -s $PGBENCH_SCALE -c $PGBENCH_CLIENTS -t $PGBENCH_TRANS $DB1 & +pgbench_pid=$! +echo "**** pgbench is running in background with pid $pgbench_pid" +echo -n "**** sleeping 10 seconds to give pgbench time for rampup ... " +sleep 10 +echo "done" + +echo "" +echo "**********************************************************************" +echo "**** $DB1 is now a standalone database with a running pgbench" +echo "**********************************************************************" +echo "" + +###################################################################### +# Setup DB1 as the primary cluster T1 node, start the node daemon, +# and create a replication set containing the pgbench tables. +###################################################################### + +echo "**** initializing $DB1 as Primary Node for Slony-I cluster T1" +slonik <<_EOF_ + include <$PREAMBLE_FILE>; + init cluster (id = @origin, comment = 'Node @origin'); + echo 'Database $DB1 initialized as Node 11'; +_EOF_ +if [ $? -ne 0 ] ; then + kill $pgbench_pid; + exit 1 +fi + +echo "**** starting the Slony-I node daemon for $DB1" +xterm -title "Slon node 11" -e sh -c "slon -d$DEBUG_LEVEL -s500 -g10 T1 dbname=$DB1; echo -n 'Enter>'; read line" & +slon1_pid=$! +echo "slon[$slon1_pid] on dbname=$DB1" + +echo "**** creating a replication set containing the 4 pgbench tables ... " +slonik <<_EOF_ + include <$PREAMBLE_FILE>; + try { + table add key (node id = @origin, fully qualified name = 'public.history'); + } + on error { + exit 1; + } + + try { + create set (id = 1, origin = @origin, comment = 'Set 1 - pgbench tables'); + set add table (set id = 1, origin = @origin, + id = 1, fully qualified name = 'public.accounts', + comment = 'Table accounts'); + set add table (set id = 1, origin = @origin, + id = 2, fully qualified name = 'public.branches', + comment = 'Table branches'); + set add table (set id = 1, origin = @origin, + id = 3, fully qualified name = 'public.tellers', + comment = 'Table tellers'); + set add table (set id = 1, origin = @origin, + id = 4, fully qualified name = 'public.history', + key = serial, comment = 'Table accounts'); + } + on error { + exit 1; + } +_EOF_ + +if [ $? -ne 0 ] ; then + echo "failed" + kill $pgbench_pid 2>/dev/null + kill $slon1_pid 2>/dev/null + cat $TMPOUT + rm $TMPOUT + exit 1 +fi +echo "**** set created" + +##### +# Check that pgbench is still running +##### +if ! kill -0 $pgbench_pid 2>/dev/null ; then + echo "**** pgbench terminated ???" + kill $slon1_pid 2>/dev/null + exit 1 +fi + +echo "" +echo "**********************************************************************" +echo "**** $DB1 is now the Slony-I origin for set 1" +echo "**********************************************************************" +echo "" + +###################################################################### +# Setup DB2 as a subscriber node and let it subscribe the replication +# set of the running pgbench +###################################################################### +echo "**** creating database for node 22" +if ! createdb $DB2 ; then + kill $pgbench_pid 2>/dev/null + kill $slon1_pid 2>/dev/null + exit 1 +fi + +echo "**** initializing $DB2 as node 22 of Slony-I cluster T1" +slonik <<_EOF_ + include <$PREAMBLE_FILE>; + echo 'Creating node 22'; + try { + store node (id = @sub1, comment = 'node @sub1', event node = @origin); + } on error { + echo 'could not establish node @sub1'; + exit -1; + } + try { + store path (server = @origin, client = @sub1, conninfo = 'dbname=$DB1'); + store path (server = @sub1, client = @origin, conninfo = 'dbname=$DB2'); + } + on error { + echo 'could not establish paths between @origin and @sub1'; + exit -1; + } + echo 'Database $DB2 added as node @sub1'; +_EOF_ +if [ $? -ne 0 ] ; then + kill $pgbench_pid 2>/dev/null + kill $slon1_pid 2>/dev/null + exit 1 +fi + +echo "**** starting the Slony-I node daemon for $DB1" +xterm -title "Slon node 22" -e sh -c "slon -d$DEBUG_LEVEL -s10000 -o10000 -g10 T1 dbname=$DB2; echo -n 'Enter>'; read line" & +slon2_pid=$! +echo "slon[$slon2_pid] on dbname=$DB2" + +##### +# Check that pgbench is still running +##### +if ! kill -0 $pgbench_pid 2>/dev/null ; then + echo "**** pgbench terminated ???" + kill $slon1_pid 2>/dev/null + exit 1 +fi + +###################################################################### +# And now comes the moment where the big elephant starts to pee +# and the attendants in the first row climb on their chairs ... +###################################################################### +echo "**** creating pgbench tables and subscribing node 22 to set 1" +( + cat pgbench_schema.sql +) | psql -q $DB2 +slonik <<_EOF_ + include <$PREAMBLE_FILE>; + subscribe set ( id = 1, provider = @origin, receiver = @sub1, forward = yes ); +_EOF_ + +echo "" +echo "**********************************************************************" +echo "**** $DB2 should now be copying data and attempting to catch up." +echo "**********************************************************************" +echo "" + +echo -n "**** waiting for pgbench to finish " +while kill -0 $pgbench_pid 2>/dev/null ; do + echo -n "." + sleep 10 +done +echo "**** pgbench finished" +echo "**** please terminate the replication engines when caught up." +wait $slon1_pid +wait $slon2_pid + +kill $pgbench_pid 2>/dev/null + +QUERY=<<EOF +begin; +-- Get a random list of accounts +select aid, bid into temp table foo from accounts order by random() limit 20; +savepoint a; +-- Add 10 to each balance +update accounts set abalance = abalance + 10 where aid in (select aid from foo); +\!sh -c 'sleep 2' +savepoint b; +-- Deduct 25 from each balance... +update accounts set abalance = abalance - 25 where aid in (select aid from foo); +-- But we do not _really_ deduct 25 because we roll it back... +rollback to savepoint b; +savepoint c; +select aid, bid into temp table foo2 from accounts order by random() limit 20; +-- Add 5 to each balance +update accounts set abalance = abalance + 5 where aid in (select aid from foo2); +savepoint d; +\!sh -c 'sleep 2' +update accounts set abalance = abalance + trunc(random()*20+5) where aid in (select aid from foo2); +rollback to savepoint d; +savepoint e; +update accounts set abalance = abalance - trunc(random()*17) where aid in (select aid from foo2); +\!sh -c 'sleep 2' +commit; +EOF + +echo "**** Running some transactions with subtransactions" +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25; do + echo "Subtransaction set $i" + (sleep 2; psql -d $DB1 -c "$QUERY"; echo "..." ; echo "Done Subtransaction $i") & + sleep 1 +done + +sleep 20 + +kill $slon1_pid 2>/dev/null +kill $slon2_pid 2>/dev/null + +./compare_pgbench_dumps $DB1 $DB2 +rm $PREAMBLE_FILE
- Previous message: [Slony1-commit] By wieck: Fixed subtransaction bug The transaction ID used for log
- Next message: [Slony1-commit] By cbbrowne: Update to get latest tagging for RC1
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list