File tree Expand file tree Collapse file tree 2 files changed +41
-11
lines changed Expand file tree Collapse file tree 2 files changed +41
-11
lines changed Original file line number Diff line number Diff line change @@ -163,7 +163,7 @@ type rowRepoIter struct {
163
163
164
164
wg sync.WaitGroup
165
165
done chan bool
166
- err chan error
166
+ err error
167
167
repos chan * Repository
168
168
rows chan sql.Row
169
169
}
@@ -195,7 +195,7 @@ func NewRowRepoIter(
195
195
iter : iter ,
196
196
session : s ,
197
197
done : make (chan bool ),
198
- err : make ( chan error ) ,
198
+ err : nil ,
199
199
repos : make (chan * Repository ),
200
200
rows : make (chan sql.Row ),
201
201
}
@@ -218,29 +218,47 @@ func NewRowRepoIter(
218
218
return & repoIter , nil
219
219
}
220
220
221
+ func (i * rowRepoIter ) setError (err error ) {
222
+ i .err = err
223
+ }
224
+
221
225
func (i * rowRepoIter ) fillRepoChannel () {
226
+ defer close (i .repos )
227
+
222
228
for {
223
229
select {
224
230
case <- i .done :
225
231
return
226
232
233
+ case <- i .session .Done ():
234
+ close (i .done )
235
+ return
236
+
227
237
default :
228
238
repo , err := i .repositoryIter .Next ()
229
239
230
240
switch err {
231
241
case nil :
232
- i .repos <- repo
233
- continue
242
+ select {
243
+ case <- i .done :
244
+ return
245
+
246
+ case <- i .session .Done ():
247
+ i .setError (ErrSessionCanceled .New ())
248
+ close (i .done )
249
+ return
250
+
251
+ case i .repos <- repo :
252
+ continue
253
+ }
234
254
235
255
case io .EOF :
236
- close (i .repos )
237
- i .err <- io .EOF
256
+ i .setError (io .EOF )
238
257
return
239
258
240
259
default :
241
260
close (i .done )
242
- close (i .repos )
243
- i .err <- err
261
+ i .setError (err )
244
262
return
245
263
}
246
264
}
@@ -260,19 +278,28 @@ func (i *rowRepoIter) rowReader(num int) {
260
278
iter .Close ()
261
279
return
262
280
281
+ case <- i .session .Done ():
282
+ i .setError (ErrSessionCanceled .New ())
283
+ return
284
+
263
285
default :
264
286
row , err := iter .Next ()
265
287
switch err {
266
288
case nil :
267
- i .rows <- row
289
+ select {
290
+ case <- i .done :
291
+ iter .Close ()
292
+ return
293
+ case i .rows <- row :
294
+ }
268
295
269
296
case io .EOF :
270
297
iter .Close ()
271
298
break loop
272
299
273
300
default :
274
301
iter .Close ()
275
- i .err <- err
302
+ i .setError ( err )
276
303
close (i .done )
277
304
return
278
305
}
@@ -285,7 +312,7 @@ func (i *rowRepoIter) rowReader(num int) {
285
312
func (i * rowRepoIter ) Next () (sql.Row , error ) {
286
313
row , ok := <- i .rows
287
314
if ! ok {
288
- return nil , <- i .err
315
+ return nil , i .err
289
316
}
290
317
291
318
return row , nil
Original file line number Diff line number Diff line change @@ -30,6 +30,9 @@ func NewSessionBuilder(pool *RepositoryPool) server.SessionBuilder {
30
30
}
31
31
}
32
32
33
+ // ErrSessionCanceled is returned when session context is canceled
34
+ var ErrSessionCanceled = errors .NewKind ("session canceled" )
35
+
33
36
// ErrInvalidGitQuerySession is returned when some node expected a GitQuery
34
37
// session but received something else.
35
38
var ErrInvalidGitQuerySession = errors .NewKind ("expecting gitquery session, but received: %T" )
You can’t perform that action at this time.
0 commit comments