@@ -2,13 +2,16 @@ package main
2
2
3
3
import (
4
4
"log"
5
+ "fmt"
5
6
"os/exec"
6
7
"io"
7
8
"bufio"
8
9
"sync"
10
+ "flag"
9
11
"os"
10
12
"strconv"
11
13
"strings"
14
+ "time"
12
15
)
13
16
14
17
func read_to_channel (r io.Reader , c chan string , wg * sync.WaitGroup ) {
@@ -56,9 +59,24 @@ func cmd_to_channel(argv []string, name string, out chan string) {
56
59
log .Printf ("'%s' finished\n " , name )
57
60
}
58
61
59
- func dtmd (bin string , wg * sync.WaitGroup ) {
60
- argv := []string {bin }
61
- name := "dtmd"
62
+ const (
63
+ DtmHost = "127.0.0.1"
64
+ DtmPort = 5431
65
+ PgPort = 5432
66
+ )
67
+
68
+ func arbiter (bin string , datadir string , servers []string , id int , wg * sync.WaitGroup ) {
69
+ argv := []string {
70
+ bin ,
71
+ "-d" , datadir ,
72
+ "-i" , strconv .Itoa (id ),
73
+ }
74
+ for _ , server := range servers {
75
+ argv = append (argv , "-r" , server )
76
+ }
77
+ log .Println (argv )
78
+
79
+ name := "arbiter " + datadir
62
80
c := make (chan string )
63
81
64
82
go cmd_to_channel (argv , name , c )
@@ -70,6 +88,21 @@ func dtmd(bin string, wg *sync.WaitGroup) {
70
88
wg .Done ()
71
89
}
72
90
91
+ func appendfile (filename string , lines ... string ) {
92
+ f , err := os .OpenFile (filename , os .O_APPEND | os .O_WRONLY , 0600 )
93
+ if err != nil {
94
+ log .Fatal (err )
95
+ }
96
+
97
+ defer f .Close ()
98
+
99
+ for _ , l := range lines {
100
+ if _ , err = f .WriteString (l + "\n " ); err != nil {
101
+ log .Fatal (err )
102
+ }
103
+ }
104
+ }
105
+
73
106
func initdb (bin string , datadir string ) {
74
107
if err := os .RemoveAll (datadir ); err != nil {
75
108
log .Fatal (err )
@@ -84,20 +117,45 @@ func initdb(bin string, datadir string) {
84
117
for s := range c {
85
118
log .Printf ("[%s] %s\n " , name , s )
86
119
}
120
+
121
+ appendfile (
122
+ datadir + "/pg_hba.conf" ,
123
+ "local replication all trust" ,
124
+ "host replication all 127.0.0.1/32 trust" ,
125
+ "host replication all ::1/128 trust" ,
126
+ )
127
+ }
128
+
129
+ func initarbiter (arbiterdir string ) {
130
+ if err := os .RemoveAll (arbiterdir ); err != nil {
131
+ log .Fatal (err )
132
+ }
133
+ if err := os .MkdirAll (arbiterdir , os .ModeDir | 0777 ); err != nil {
134
+ log .Fatal (err )
135
+ }
87
136
}
88
137
89
- func postgres (bin string , datadir string , port int , nodeid int , wg * sync.WaitGroup ) {
138
+ func postgres (bin string , datadir string , postgresi [] string , arbiters [] string , port int , nodeid int , wg * sync.WaitGroup ) {
90
139
argv := []string {
91
140
bin ,
92
141
"-D" , datadir ,
93
142
"-p" , strconv .Itoa (port ),
94
- "-c" , "dtm.buffer_size=65536" ,
95
- "-c" , "dtm.host=127.0.0.1" ,
96
- "-c" , "dtm.port=" + strconv .Itoa (5431 ),
143
+ "-c" , "multimaster.buffer_size=65536" ,
144
+ "-c" , "multimaster.conn_strings=" + strings .Join (postgresi , "," ),
145
+ "-c" , "multimaster.node_id=" + strconv .Itoa (nodeid + 1 ),
146
+ "-c" , "multimaster.arbiters=" + strings .Join (arbiters , "," ),
147
+ "-c" , "multimaster.workers=8" ,
148
+ "-c" , "multimaster.queue_size=1073741824" ,
149
+ "-c" , "wal_level=logical" ,
150
+ "-c" , "wal_sender_timeout=0" ,
151
+ "-c" , "max_wal_senders=10" ,
152
+ "-c" , "max_worker_processes=100" ,
153
+ "-c" , "max_replication_slots=10" ,
97
154
"-c" , "autovacuum=off" ,
98
155
"-c" , "fsync=off" ,
99
- "-c" , "synchronous_commit=off" ,
100
- "-c" , "shared_preload_libraries=pg_dtm" ,
156
+ "-c" , "synchronous_commit=on" ,
157
+ "-c" , "max_connections=200" ,
158
+ "-c" , "shared_preload_libraries=multimaster" ,
101
159
}
102
160
name := "postgres " + datadir
103
161
c := make (chan string )
@@ -138,32 +196,60 @@ func get_prefix(srcroot string) string {
138
196
return "."
139
197
}
140
198
199
+ var doInitDb bool = false
200
+ func init () {
201
+ flag .BoolVar (& doInitDb , "i" , false , "perform initdb" )
202
+ flag .Parse ()
203
+ }
204
+
141
205
func main () {
142
206
srcroot := "../../.."
143
207
prefix := get_prefix (srcroot )
144
208
145
209
bin := map [string ]string {
146
- "dtmd " : srcroot + "/contrib/pg_dtm/dtmd/ bin/dtmd " ,
210
+ "arbiter " : srcroot + "/contrib/arbiter/ bin/arbiter " ,
147
211
"initdb" : prefix + "/bin/initdb" ,
148
212
"postgres" : prefix + "/bin/postgres" ,
149
213
}
150
214
151
- datadirs := []string {"/tmp/data1" , "/tmp/data2" , "/tmp/data3" }
215
+ datadirs := []string {"/tmp/data0" , "/tmp/data1" , "/tmp/data2" }
216
+ //arbiterdirs := []string{"/tmp/arbiter0", "/tmp/arbiter1", "/tmp/arbiter2"}
217
+ arbiterdirs := []string {"/tmp/arbiter0" }
152
218
153
219
check_bin (& bin );
154
220
155
- for _ , datadir := range datadirs {
156
- initdb (bin ["initdb" ], datadir )
221
+ if doInitDb {
222
+ for _ , datadir := range datadirs {
223
+ initdb (bin ["initdb" ], datadir )
224
+ }
225
+ for _ , arbiterdir := range arbiterdirs {
226
+ initarbiter (arbiterdir )
227
+ }
157
228
}
158
229
159
230
var wg sync.WaitGroup
160
231
161
- wg .Add (1 )
162
- go dtmd (bin ["dtmd" ], & wg )
232
+ var arbiters []string
233
+ for i := range arbiterdirs {
234
+ arbiters = append (arbiters , DtmHost + ":" + strconv .Itoa (DtmPort - i ))
235
+ }
236
+ for i , dir := range arbiterdirs {
237
+ wg .Add (1 )
238
+ go arbiter (bin ["arbiter" ], dir , arbiters , i , & wg )
239
+ }
240
+
241
+ time .Sleep (3 * time .Second )
163
242
164
- for i , datadir := range datadirs {
243
+ var postgresi []string
244
+ for i := range datadirs {
245
+ postgresi = append (
246
+ postgresi ,
247
+ fmt .Sprintf ("dbname=postgres host=127.0.0.1 port=%d sslmode=disable" , PgPort + i ),
248
+ )
249
+ }
250
+ for i , dir := range datadirs {
165
251
wg .Add (1 )
166
- go postgres (bin ["postgres" ], datadir , 5432 + i , i , & wg )
252
+ go postgres (bin ["postgres" ], dir , postgresi , arbiters , PgPort + i , i , & wg )
167
253
}
168
254
169
255
wg .Wait ()
0 commit comments