go-redis
go-redis copied to clipboard
`pubsub.Receive()` will timeout
#2060 cause SetReadDeadline
not called, so PubSub.ReceiveTimeout(ctx, 0)
will not get a read deadline set, thus it will receive the i/o timeout
error after some time. Related #2139.
Expected Behavior
PubSub.ReceiveTimeout(ctx, 0)
will block forever until a message is received, So does PubSub.Receive()
, PubSub.ReceiveMessage()
and PubSub.Channel()
.
Current Behavior
PubSub.Receive()
will timeout if read nothing for sometime.
received subscribe: hello <nil>
redis: 2022/08/03 22:36:54 pubsub.go:168: redis: discarding bad PubSub connection: read tcp [::1]:53016->[::1]:6379: i/o timeout
received <nil> read tcp [::1]:53016->[::1]:6379: i/o timeout
received subscribe: hello <nil>
redis: 2022/08/03 22:36:57 pubsub.go:168: redis: discarding bad PubSub connection: read tcp [::1]:53035->[::1]:6379: i/o timeout
received <nil> read tcp [::1]:53035->[::1]:6379: i/o timeout
received subscribe: hello <nil>
Possible Solution
Revert #2060
Steps to Reproduce
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v9"
)
func main() {
c := redis.NewClient(&redis.Options{})
pubsub := c.Subscribe(context.Background(), "hello")
for {
m, err := pubsub.Receive(context.Background())
fmt.Println("received", m, err)
}
}
Context (Environment)
Redis: 7.0.3 go-redis: master