summaryrefslogtreecommitdiff
path: root/dev/conflict.test
blob: 045a92c1e802d35a1fe07a3f6a8aca8f22a7ba53 (plain)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
##!/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