Merge pull request from go-redis/fix/cluster-slots-id

Fix cluster slots parsing.
This commit is contained in:
Vladimir Mihailenco 2016-02-06 12:07:15 +02:00
commit 6dac5ea35c
2 changed files with 18 additions and 5 deletions

View File

@ -725,12 +725,14 @@ func (cmd *ScanCmd) readReply(cn *conn) error {
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// TODO: rename to ClusterSlot
type ClusterSlotInfo struct { type ClusterSlotInfo struct {
Start int Start int
End int End int
Addrs []string Addrs []string
} }
// TODO: rename to ClusterSlotsCmd
type ClusterSlotCmd struct { type ClusterSlotCmd struct {
baseCmd baseCmd

View File

@ -107,7 +107,7 @@ func appendArg(b []byte, val interface{}) ([]byte, error) {
} }
func appendArgs(b []byte, args []interface{}) ([]byte, error) { func appendArgs(b []byte, args []interface{}) ([]byte, error) {
b = append(b, '*') b = append(b, arrayReply)
b = strconv.AppendUint(b, uint64(len(args)), 10) b = strconv.AppendUint(b, uint64(len(args)), 10)
b = append(b, '\r', '\n') b = append(b, '\r', '\n')
for _, arg := range args { for _, arg := range args {
@ -238,7 +238,9 @@ func readLine(cn *conn) ([]byte, error) {
} }
func isNilReply(b []byte) bool { func isNilReply(b []byte) bool {
return len(b) == 3 && (b[0] == '$' || b[0] == '*') && b[1] == '-' && b[2] == '1' return len(b) == 3 &&
(b[0] == stringReply || b[0] == arrayReply) &&
b[1] == '-' && b[2] == '1'
} }
func readN(cn *conn, n int) ([]byte, error) { func readN(cn *conn, n int) ([]byte, error) {
@ -337,7 +339,7 @@ func readFloatReply(cn *conn) (float64, error) {
} }
func parseArrayHeader(cn *conn, line []byte) (int64, error) { func parseArrayHeader(cn *conn, line []byte) (int64, error) {
if len(line) == 3 && line[1] == '-' && line[2] == '1' { if isNilReply(line) {
return 0, Nil return 0, Nil
} }
@ -604,8 +606,9 @@ func clusterSlotInfoSliceParser(cn *conn, n int64) (interface{}, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if n != 2 { if n != 2 && n != 3 {
return nil, fmt.Errorf("got %d elements in cluster info address, expected 2", n) err := fmt.Errorf("got %d elements in cluster info address, expected 2 or 3", n)
return nil, err
} }
ip, err := readStringReply(cn) ip, err := readStringReply(cn)
@ -618,6 +621,14 @@ func clusterSlotInfoSliceParser(cn *conn, n int64) (interface{}, error) {
return nil, err return nil, err
} }
if n == 3 {
// TODO: expose id in ClusterSlotInfo
_, err := readStringReply(cn)
if err != nil {
return nil, err
}
}
info.Addrs[i] = net.JoinHostPort(ip, strconv.FormatInt(port, 10)) info.Addrs[i] = net.JoinHostPort(ip, strconv.FormatInt(port, 10))
} }