Selaa lähdekoodia

Honor read deadline in connection Do method.

Gary Burd 13 vuotta sitten
vanhempi
commit
f74095d2d0
2 muutettua tiedostoa jossa 51 lisäystä ja 0 poistoa
  1. 4 0
      redis/conn.go
  2. 47 0
      redis/conn_test.go

+ 4 - 0
redis/conn.go

@@ -286,6 +286,10 @@ func (c *conn) Do(cmd string, args ...interface{}) (reply interface{}, err error
 	c.pending = 0
 	c.mu.Unlock()
 
+	if c.readTimeout != 0 {
+		c.conn.SetReadDeadline(time.Now().Add(c.readTimeout))
+	}
+
 	// Receive
 	for ; pending >= 0; pending-- {
 		var e error

+ 47 - 0
redis/conn_test.go

@@ -19,6 +19,7 @@ import (
 	"bytes"
 	"errors"
 	"github.com/garyburd/redigo/redis"
+	"net"
 	"reflect"
 	"strings"
 	"testing"
@@ -304,6 +305,52 @@ func TestError(t *testing.T) {
 	}
 }
 
+func TestReadDeadline(t *testing.T) {
+	l, err := net.Listen("tcp", "127.0.0.1:0")
+	if err != nil {
+		t.Fatalf("net.Listen returned %v", err)
+	}
+	defer l.Close()
+
+	go func() {
+		for {
+			c, err := l.Accept()
+			if err != nil {
+				return
+			}
+			go func() {
+				time.Sleep(time.Second)
+				c.Write([]byte("+OK\r\n"))
+				c.Close()
+			}()
+		}
+	}()
+
+	c1, err := redis.DialTimeout(l.Addr().Network(), l.Addr().String(), 0, time.Millisecond, 0)
+	if err != nil {
+		t.Fatalf("redis.Dial returned %v", err)
+	}
+	defer c1.Close()
+
+	_, err = c1.Do("PING")
+	if err == nil {
+		t.Fatalf("Dodid not return error.")
+	}
+
+	c2, err := redis.DialTimeout(l.Addr().Network(), l.Addr().String(), 0, time.Millisecond, 0)
+	if err != nil {
+		t.Fatalf("redis.Dial returned %v", err)
+	}
+	defer c2.Close()
+
+	c2.Send("PING")
+	c2.Flush()
+	_, err = c2.Receive()
+	if err == nil {
+		t.Fatalf("Receive did not return error.")
+	}
+}
+
 // Connect to local instance of Redis running on the default port.
 func ExampleDial(x int) {
 	c, err := redis.Dial("tcp", ":6379")