Skip to content

Commit 9ac9f0b

Browse files
authored
Merge pull request #227 from jfontan/fix/race-condition-repoiter
Check for already closed rowRepoIter
2 parents 60dfe00 + a187fa5 commit 9ac9f0b

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
@@ -173,6 +173,9 @@ type rowRepoIter struct {
173173
err error
174174
repos chan *Repository
175175
rows chan sql.Row
176+
177+
doneMutex sync.Mutex
178+
doneClosed bool
176179
}
177180

178181
// NewRowRepoIter initializes a new repository iterator.
@@ -233,6 +236,16 @@ func (i *rowRepoIter) setError(err error) {
233236
i.err = err
234237
}
235238

239+
func closeIter(i *rowRepoIter) {
240+
i.doneMutex.Lock()
241+
defer i.doneMutex.Unlock()
242+
243+
if !i.doneClosed {
244+
close(i.done)
245+
i.doneClosed = true
246+
}
247+
}
248+
236249
func (i *rowRepoIter) fillRepoChannel() {
237250
defer close(i.repos)
238251

@@ -242,7 +255,7 @@ func (i *rowRepoIter) fillRepoChannel() {
242255
return
243256

244257
case <-i.ctx.Done():
245-
close(i.done)
258+
closeIter(i)
246259
return
247260

248261
default:
@@ -256,7 +269,7 @@ func (i *rowRepoIter) fillRepoChannel() {
256269

257270
case <-i.ctx.Done():
258271
i.setError(ErrSessionCanceled.New())
259-
close(i.done)
272+
closeIter(i)
260273
return
261274

262275
case i.repos <- repo:
@@ -268,7 +281,7 @@ func (i *rowRepoIter) fillRepoChannel() {
268281
return
269282

270283
default:
271-
close(i.done)
284+
closeIter(i)
272285
i.setError(err)
273286
return
274287
}
@@ -288,7 +301,7 @@ func (i *rowRepoIter) rowReader(num int) {
288301
return
289302
default:
290303
i.setError(err)
291-
close(i.done)
304+
closeIter(i)
292305
continue
293306
}
294307
}
@@ -322,7 +335,7 @@ func (i *rowRepoIter) rowReader(num int) {
322335
default:
323336
iter.Close()
324337
i.setError(err)
325-
close(i.done)
338+
closeIter(i)
326339
return
327340
}
328341
}

0 commit comments

Comments
 (0)