Skip to content

Commit 78bcce4

Browse files
Merge pull request #114 from jim-slattery-rs/master
fixed Queue.Poll() timout bug, Put() would get stuck on leftover sema
2 parents 5fb8adc + fa71ae6 commit 78bcce4

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

queue/queue.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,14 @@ func (q *Queue) Poll(number int64, timeout time.Duration) ([]interface{}, error)
222222
sema.response.Done()
223223
return items, nil
224224
case <-timeoutC:
225+
// cleanup the sema that was added to waiters
226+
select {
227+
case sema.ready <- true:
228+
// we called this before Put() could
229+
default:
230+
// Put() got it already, we need to call Done() so Put() can move on
231+
sema.response.Done()
232+
}
225233
return nil, ErrTimeout
226234
}
227235
}

queue/queue_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ func TestGet(t *testing.T) {
8585
func TestPoll(t *testing.T) {
8686
q := New(10)
8787

88+
// should be able to Poll() before anything is present, without breaking future Puts
89+
q.Poll(1, time.Millisecond)
90+
8891
q.Put(`test`)
8992
result, err := q.Poll(2, 0)
9093
if !assert.Nil(t, err) {

0 commit comments

Comments
 (0)