Skip to content

Commit 67c3f2a

Browse files
authored
Merge pull request #559 from mjibson/copy-bad-race
enable -race in tests; fix race in COPY
2 parents 8df6253 + 46f7bf5 commit 67c3f2a

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ script:
4040
- >
4141
goimports -d -e $(find -name '*.go') | awk '{ print } END { exit NR == 0 ? 0 : 1 }'
4242
- go vet ./...
43-
- PQTEST_BINARY_PARAMETERS=no go test -v ./...
44-
- PQTEST_BINARY_PARAMETERS=yes go test -v ./...
43+
- PQTEST_BINARY_PARAMETERS=no go test -race -v ./...
44+
- PQTEST_BINARY_PARAMETERS=yes go test -race -v ./...

copy.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,13 @@ awaitCopyInResponse:
9797
err = parseError(r)
9898
case 'Z':
9999
if err == nil {
100-
cn.bad = true
100+
ci.setBad()
101101
errorf("unexpected ReadyForQuery in response to COPY")
102102
}
103103
cn.processReadyForQuery(r)
104104
return nil, err
105105
default:
106-
cn.bad = true
106+
ci.setBad()
107107
errorf("unknown response for copy query: %q", t)
108108
}
109109
}
@@ -122,7 +122,7 @@ awaitCopyInResponse:
122122
cn.processReadyForQuery(r)
123123
return nil, err
124124
default:
125-
cn.bad = true
125+
ci.setBad()
126126
errorf("unknown response for CopyFail: %q", t)
127127
}
128128
}
@@ -143,7 +143,7 @@ func (ci *copyin) resploop() {
143143
var r readBuf
144144
t, err := ci.cn.recvMessage(&r)
145145
if err != nil {
146-
ci.cn.bad = true
146+
ci.setBad()
147147
ci.setError(err)
148148
ci.done <- true
149149
return
@@ -161,14 +161,27 @@ func (ci *copyin) resploop() {
161161
err := parseError(&r)
162162
ci.setError(err)
163163
default:
164-
ci.cn.bad = true
164+
ci.setBad()
165165
ci.setError(fmt.Errorf("unknown response during CopyIn: %q", t))
166166
ci.done <- true
167167
return
168168
}
169169
}
170170
}
171171

172+
func (ci *copyin) setBad() {
173+
ci.Lock()
174+
ci.cn.bad = true
175+
ci.Unlock()
176+
}
177+
178+
func (ci *copyin) isBad() bool {
179+
ci.Lock()
180+
b := ci.cn.bad
181+
ci.Unlock()
182+
return b
183+
}
184+
172185
func (ci *copyin) isErrorSet() bool {
173186
ci.Lock()
174187
isSet := (ci.err != nil)
@@ -206,7 +219,7 @@ func (ci *copyin) Exec(v []driver.Value) (r driver.Result, err error) {
206219
return nil, errCopyInClosed
207220
}
208221

209-
if ci.cn.bad {
222+
if ci.isBad() {
210223
return nil, driver.ErrBadConn
211224
}
212225
defer ci.cn.errRecover(&err)
@@ -244,7 +257,7 @@ func (ci *copyin) Close() (err error) {
244257
}
245258
ci.closed = true
246259

247-
if ci.cn.bad {
260+
if ci.isBad() {
248261
return driver.ErrBadConn
249262
}
250263
defer ci.cn.errRecover(&err)

0 commit comments

Comments
 (0)