@@ -30,6 +30,7 @@ func (c *ConnStrings) Set(value string) error {
30
30
var cfg struct {
31
31
ConnStrs ConnStrings
32
32
33
+ Verbose bool
33
34
Isolation string // "repeatable read" or "read committed"
34
35
35
36
Accounts struct {
@@ -100,6 +101,7 @@ func init() {
100
101
flag .IntVar (& cfg .Readers .Num , "r" , 1 , "The number of readers" )
101
102
flag .IntVar (& cfg .Writers .Num , "w" , 8 , "The number of writers" )
102
103
flag .IntVar (& cfg .Writers .Updates , "u" , 10000 , "The number updates each writer performs" )
104
+ flag .BoolVar (& cfg .Verbose , "v" , false , "Show progress and other stuff for mortals" )
103
105
flag .BoolVar (& cfg .Writers .AllowGlobal , "g" , false , "Allow global updates" )
104
106
flag .BoolVar (& cfg .Writers .AllowLocal , "l" , false , "Allow local updates" )
105
107
flag .BoolVar (& cfg .Writers .PrivateRows , "p" , false , "Private rows (avoid waits/aborts caused by concurrent updates of the same rows)" )
@@ -136,7 +138,9 @@ func init() {
136
138
}
137
139
138
140
func main () {
141
+ start := time .Now ()
139
142
prepare (cfg .ConnStrs )
143
+ fmt .Printf ("database prepared in %0.2f seconds\n " , time .Since (start ).Seconds ())
140
144
141
145
var writerWg sync.WaitGroup
142
146
var readerWg sync.WaitGroup
@@ -145,21 +149,28 @@ func main() {
145
149
cAborts := make (chan int )
146
150
go progress (cfg .Writers .Num * cfg .Writers .Updates , cCommits , cAborts )
147
151
152
+ start = time .Now ()
148
153
writerWg .Add (cfg .Writers .Num )
149
154
for i := 0 ; i < cfg .Writers .Num ; i ++ {
150
155
go writer (i , cCommits , cAborts , & writerWg )
151
156
}
152
157
running = true
153
158
159
+ inconsistency := false
154
160
readerWg .Add (cfg .Readers .Num )
155
161
for i := 0 ; i < cfg .Readers .Num ; i ++ {
156
- go reader (& readerWg )
162
+ go reader (& readerWg , & inconsistency )
157
163
}
158
164
159
165
writerWg .Wait ()
166
+ fmt .Printf ("writers finished in %0.2f seconds\n " , time .Since (start ).Seconds ())
167
+
160
168
running = false
161
169
readerWg .Wait ()
162
170
171
+ if inconsistency {
172
+ fmt .Printf ("INCONSISTENCY DETECTED\n " )
173
+ }
163
174
fmt .Printf ("done.\n " )
164
175
}
165
176
@@ -200,10 +211,12 @@ func prepare_one(connstr string, wg *sync.WaitGroup) {
200
211
for i := 0 ; i < cfg .Accounts .Num ; i ++ {
201
212
exec (conn , "insert into t values ($1, $2)" , i , cfg .Accounts .Balance )
202
213
if time .Since (start ).Seconds () > 1 {
203
- fmt .Printf (
204
- "inserted %0.2f%%: %d of %d records\n " ,
205
- float32 (i + 1 ) * 100.0 / float32 (cfg .Accounts .Num ), i + 1 , cfg .Accounts .Num ,
206
- )
214
+ if cfg .Verbose {
215
+ fmt .Printf (
216
+ "inserted %0.2f%%: %d of %d records\n " ,
217
+ float32 (i + 1 ) * 100.0 / float32 (cfg .Accounts .Num ), i + 1 , cfg .Accounts .Num ,
218
+ )
219
+ }
207
220
start = time .Now ()
208
221
}
209
222
}
@@ -230,10 +243,12 @@ func progress(total int, cCommits chan int, cAborts chan int) {
230
243
commits += newcommits
231
244
aborts += newaborts
232
245
if time .Since (start ).Seconds () > 1 {
233
- fmt .Printf (
234
- "progress %0.2f%%: %d commits, %d aborts\n " ,
235
- float32 (commits ) * 100.0 / float32 (total ), commits , aborts ,
236
- )
246
+ if cfg .Verbose {
247
+ fmt .Printf (
248
+ "progress %0.2f%%: %d commits, %d aborts\n " ,
249
+ float32 (commits ) * 100.0 / float32 (total ), commits , aborts ,
250
+ )
251
+ }
237
252
start = time .Now ()
238
253
}
239
254
}
@@ -365,7 +380,7 @@ func writer(id int, cCommits chan int, cAborts chan int, wg *sync.WaitGroup) {
365
380
wg .Done ()
366
381
}
367
382
368
- func reader (wg * sync.WaitGroup ) {
383
+ func reader (wg * sync.WaitGroup , inconsistency * bool ) {
369
384
var prevSum int64 = 0
370
385
371
386
var conns []* pgx.Conn
@@ -398,6 +413,10 @@ func reader(wg *sync.WaitGroup) {
398
413
399
414
if (sum != prevSum ) {
400
415
fmt .Printf ("Total=%d xid=%d\n " , sum , xid )
416
+ if (prevSum != 0 ) {
417
+ fmt .Printf ("inconsistency!\n " )
418
+ * inconsistency = true
419
+ }
401
420
prevSum = sum
402
421
}
403
422
}
0 commit comments