gitea/modules/queue
zeripath 3ad62127df
Correctly handle select on multiple channels in Queues (#22146) (#22428)
Backport #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>
2023-01-13 20:42:42 +00:00
..
bytefifo.go Pause queues (#15928) 2022-01-22 21:22:14 +00:00
helper.go Add more linters to improve code readability (#19989) 2022-06-20 12:02:49 +02:00
manager.go Add number in queue status to monitor page (#18712) 2022-02-12 13:31:26 +08:00
queue_bytefifo.go Add more linters to improve code readability (#19989) 2022-06-20 12:02:49 +02:00
queue_channel_test.go Prevent intermittent NPE in queue tests (#19301) 2022-04-02 15:59:04 +08:00
queue_channel.go Correctly handle select on multiple channels in Queues (#22146) (#22428) 2023-01-13 20:42:42 +00:00
queue_disk_channel_test.go test: use T.TempDir to create temporary test directory (#21043) 2022-09-04 16:14:53 +01:00
queue_disk_channel.go Add more linters to improve code readability (#19989) 2022-06-20 12:02:49 +02:00
queue_disk_test.go test: use T.TempDir to create temporary test directory (#21043) 2022-09-04 16:14:53 +01:00
queue_disk.go Pause queues (#15928) 2022-01-22 21:22:14 +00:00
queue_redis.go Pause queues (#15928) 2022-01-22 21:22:14 +00:00
queue_test.go Add an abstract json layout to make it's easier to change json library (#16528) 2021-07-24 18:03:58 +02:00
queue_wrapped.go Replace all instances of fmt.Errorf(%v) with fmt.Errorf(%w) (#21551) 2022-10-24 20:29:17 +01:00
queue.go Make WrappedQueues and PersistableChannelUniqueQueues Pausable (#18393) 2022-01-24 22:54:35 +00:00
setting.go Make WrappedQueues and PersistableChannelUniqueQueues Pausable (#18393) 2022-01-24 22:54:35 +00:00
unique_queue_channel_test.go Add Goroutine stack inspector to admin/monitor (#19207) 2022-03-31 19:01:43 +02:00
unique_queue_channel.go Correctly handle select on multiple channels in Queues (#22146) (#22428) 2023-01-13 20:42:42 +00:00
unique_queue_disk_channel.go Add more linters to improve code readability (#19989) 2022-06-20 12:02:49 +02:00
unique_queue_disk.go Pause queues (#15928) 2022-01-22 21:22:14 +00:00
unique_queue_redis.go Pause queues (#15928) 2022-01-22 21:22:14 +00:00
unique_queue_wrapped.go Make WrappedQueues and PersistableChannelUniqueQueues Pausable (#18393) 2022-01-24 22:54:35 +00:00
unique_queue.go Add Unique Queue infrastructure and move TestPullRequests to this (#9856) 2020-02-02 23:19:58 +00:00
workerpool.go Correctly handle select on multiple channels in Queues (#22146) (#22428) 2023-01-13 20:42:42 +00:00