This repository has been archived on 2024-01-04. You can view files and clone it, but cannot push or open issues or pull requests.
forgejo/modules/queue
zeripath a609cae9fb
Correctly handle select on multiple channels in Queues (#22146)
There are a few places in FlushQueueWithContext which make an incorrect
assumption about how `select` on multiple channels works.

The problem is best expressed by looking at the following example:

```go
package main

import "fmt"

func main() {
    closedChan := make(chan struct{})
    close(closedChan)
    toClose := make(chan struct{})
    count := 0

    for {
        select {
        case <-closedChan:
            count++
            fmt.Println(count)
            if count == 2 {
                close(toClose)
            }
        case <-toClose:
            return
        }
    }
}
```

This PR double-checks that the contexts are closed outside of checking
if there is data in the dataChan. It also rationalises the WorkerPool
FlushWithContext because the previous implementation failed to handle
pausing correctly. This will probably fix the underlying problem in
 #22145

Fix #22145

Signed-off-by: Andrew Thornton <art27@cantab.net>

Signed-off-by: Andrew Thornton <art27@cantab.net>
2022-12-30 02:06:47 +02:00
..
bytefifo.go
helper.go Implement FSFE REUSE for golang files (#21840) 2022-11-27 18:20:29 +00:00
manager.go
queue.go
queue_bytefifo.go
queue_channel.go Correctly handle select on multiple channels in Queues (#22146) 2022-12-30 02:06:47 +02:00
queue_channel_test.go
queue_disk.go
queue_disk_channel.go
queue_disk_channel_test.go
queue_disk_test.go
queue_redis.go
queue_test.go
queue_wrapped.go
setting.go
unique_queue.go
unique_queue_channel.go Correctly handle select on multiple channels in Queues (#22146) 2022-12-30 02:06:47 +02:00
unique_queue_channel_test.go
unique_queue_disk.go
unique_queue_disk_channel.go
unique_queue_redis.go
unique_queue_wrapped.go
workerpool.go Correctly handle select on multiple channels in Queues (#22146) 2022-12-30 02:06:47 +02:00