Skip to content

Commit a187fa5

Browse files
committed
Check for already closed rowRepoIter
The test from 3589daf triggered this race condition Signed-off-by: Javi Fontan <[email protected]>
1 parent 4e19a4a commit a187fa5

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

repository_pool.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ type rowRepoIter struct {
169169
err error
170170
repos chan *Repository
171171
rows chan sql.Row
172+
173+
doneMutex sync.Mutex
174+
doneClosed bool
172175
}
173176

174177
// NewRowRepoIter initializes a new repository iterator.
@@ -229,6 +232,16 @@ func (i *rowRepoIter) setError(err error) {
229232
i.err = err
230233
}
231234

235+
func closeIter(i *rowRepoIter) {
236+
i.doneMutex.Lock()
237+
defer i.doneMutex.Unlock()
238+
239+
if !i.doneClosed {
240+
close(i.done)
241+
i.doneClosed = true
242+
}
243+
}
244+
232245
func (i *rowRepoIter) fillRepoChannel() {
233246
defer close(i.repos)
234247

@@ -238,7 +251,7 @@ func (i *rowRepoIter) fillRepoChannel() {
238251
return
239252

240253
case <-i.ctx.Done():
241-
close(i.done)
254+
closeIter(i)
242255
return
243256

244257
default:
@@ -252,7 +265,7 @@ func (i *rowRepoIter) fillRepoChannel() {
252265

253266
case <-i.ctx.Done():
254267
i.setError(ErrSessionCanceled.New())
255-
close(i.done)
268+
closeIter(i)
256269
return
257270

258271
case i.repos <- repo:
@@ -264,7 +277,7 @@ func (i *rowRepoIter) fillRepoChannel() {
264277
return
265278

266279
default:
267-
close(i.done)
280+
closeIter(i)
268281
i.setError(err)
269282
return
270283
}
@@ -284,7 +297,7 @@ func (i *rowRepoIter) rowReader(num int) {
284297
return
285298
default:
286299
i.setError(err)
287-
close(i.done)
300+
closeIter(i)
288301
continue
289302
}
290303
}
@@ -318,7 +331,7 @@ func (i *rowRepoIter) rowReader(num int) {
318331
default:
319332
iter.Close()
320333
i.setError(err)
321-
close(i.done)
334+
closeIter(i)
322335
return
323336
}
324337
}

0 commit comments

Comments
 (0)