##!/bin/bash ## A quick self-containted test of the conflict system ## Not a replacement for the real tests so much as a development aid ## Uses: ## Four databases, A, B, C, and D (aka ctest1 ctest2 ctest3 ctest4) ## Three table: alpha, beta, charlie ## Two syncs: AB A <=> B and BC (B <=> C) -> D ## For safety, this runs on port 5492. ## Do not change it to 5432, as this drops the bucardo database! :) ## This must be run from the root Bucardo source code directory export PGPORT=5492 ## Ensure we use the Bucardo.pm in the current directory export PERL5LIB=. ## Quick check that our scripts compile cleanly perl -c bucardo || exit perl -c Bucardo.pm || exit ## Just in case, stop any running Bucardos ./bucardo stop --quiet 2>/dev/null ## Bail if the cluster is not reachable psql -q -c 'select 1' >/dev/null 2>/dev/null if [[ $? -ne 0 ]];then echo Could not connect to Postgres on port $PGPORT exit fi ## Terminate any old connections, and drop databases echo Dropping existing test databases psql -AX -qt -c "select pg_terminate_backend(pid) FROM pg_stat_activity where datname IN ('ctest1','ctest2','ctest3','ctest4','bucardo')" >/dev/null psql -qc 'drop database ctest1' 2>/dev/null psql -qc 'drop database ctest2' 2>/dev/null psql -qc 'drop database ctest3' 2>/dev/null psql -qc 'drop database ctest4' 2>/dev/null psql -qc 'drop database bucardo' 2>/dev/null echo Creating test databases psql -qc 'create database ctest1' psql ctest1 -qc 'create sequence mseq increment by 3 start with 1' psql ctest1 -qc "create table alpha(id int not null default nextval('mseq'), email text)" psql ctest1 -qc "create unique index alpha_unique on alpha(id)" psql ctest1 -qc 'create table beta(id serial primary key, fk1 int references alpha(id))' psql ctest1 -qc 'create table charlie(id serial primary key, fk1 int references alpha(id))' psql -qc 'create database ctest2 template ctest1' psql ctest2 -qc 'alter sequence mseq restart with 2' psql -qc 'create database ctest3 template ctest1' psql ctest3 -qc 'alter sequence mseq restart with 3' psql -qc 'create database ctest4 template ctest1' echo Installing Bucardo ./bucardo install --batch --quiet ./bucardo set log_level=debug --quiet echo Adding databases A B C D ./bucardo add db A dbname=ctest1 --quiet ./bucardo add db B dbname=ctest2 --quiet ./bucardo add db C dbname=ctest3 --quiet ./bucardo add db D dbname=ctest4 --quiet echo Adding table, relgroup, and syncs ./bucardo add table alpha beta relgroup=mgroup --quiet ./bucardo add sync AB relgroup=mgroup dbs=A:source,B:source autokick=false --quiet isolation_level=repeatable_read ./bucardo add sync BC relgroup=mgroup dbs=B:source,C:source,D:target --quiet echo Starting Bucardo rm -f log.bucardo ./bucardo start --logdest=. --quiet sleep 2 echo Creating a conflict that will violate FKs if left to itself psql -AX -qt ctest1 -c "insert into alpha(id,email) values (1,'alice'),(2,'bob')" psql -AX -qt ctest1 -c "insert into beta(fk1) values (1)" echo Table beta references alpha.id 1 echo Kicking sync AB ./bucardo kick AB 0 ./bucardo stop exit echo On A, switching beta to reference alpha.id 2 psql -AX -qt ctest1 -c "update beta set fk1 = 2" echo On B, deleting alpha.id 2 psql -AX -qt ctest2 -c "delete from alpha where id = 2" echo Kicking sync AB ./bucardo kick AB 0 psql -A -t ctest1 -c "select 'A.alpha.id:', id from alpha" psql -A -t ctest1 -c "select 'A.beta.id|fk1:', id,fk1 from beta" psql -A -t ctest2 -c "select 'B.alpha.id:', id from alpha" psql -A -t ctest2 -c "select 'B.beta.id|fk1:', id,fk1 from beta" exit echo Makedelta is off, so row \"alice\" added to A will not make it to C sleep 2 psql -A -t ctest2 -c "select 'B:', * from alpha" psql -A -t ctest3 -c "select 'C:', * from alpha" psql -A -t ctest4 -c "select 'D:', * from alpha" ./bucardo update table alpha makedelta=B ./bucardo stop --quiet sleep 2 psql ctest1 -U bucardo -c "select * from delta_public_alpha" psql ctest1 -U bucardo -c "select * from stage_public_alpha" psql ctest1 -U bucardo -c "select * from track_public_alpha" psql ctest1 -U bucardo -c "select * from bucardo_delta_targets" exit ./bucardo start --logdest=. --quiet echo Makedelta is on for B, so row \"bob\" added to A will make it to C psql -AX -qt ctest1 -c "insert into alpha(email) values ('bob')" sleep 3 psql -At ctest1 -c "select 'A:', * from alpha" psql -At ctest2 -c "select 'B:', * from alpha" psql -At ctest3 -c "select 'C:', * from alpha" psql -At ctest4 -c "select 'D:', * from alpha" ./bucardo update table alpha set makedelta=A ./bucardo message Changed makedelta ./bucardo reload sync AB echo Makedelta is on for A only, so row \"bob\" deleted from A will not make it to C psql -AX -qt ctest1 -c "delete from alpha where email = 'bob'" sleep 3 psql -At ctest1 -c "select 'A:', * from alpha" psql -At ctest2 -c "select 'B:', * from alpha" psql -At ctest3 -c "select 'C:', * from alpha" psql -At ctest4 -c "select 'D:', * from alpha" ./bucardo update table alpha set makedelta=on ./bucardo message Changed makedelta ./bucardo reload sync AB echo Makedelta is on for everyone, so row \"mallory\" to A will not make it to B,C,D psql -AX -qt ctest1 -c "insert into alpha(email) values ('mallory')" sleep 3 psql -At ctest1 -c "select 'A:', * from alpha" psql -At ctest2 -c "select 'B:', * from alpha" psql -At ctest3 -c "select 'C:', * from alpha" psql -At ctest4 -c "select 'D:', * from alpha" ./bucardo update table alpha set makedelta=off ./bucardo message Changed makedelta ./bucardo reload sync AB echo Makedelta is off for everyone, so row \"mallory\" removed from A will stay on C psql -AX -qt ctest1 -c "delete from alpha where email = 'mallory'" sleep 3 psql -At ctest1 -c "select 'A:', * from alpha" psql -At ctest2 -c "select 'B:', * from alpha" psql -At ctest3 -c "select 'C:', * from alpha" psql -At ctest4 -c "select 'D:', * from alpha" echo Stopping Bucardo ./bucardo stop