Skip to content

Commit

Permalink
control: fix shaddowing error in shuffle dial
Browse files Browse the repository at this point in the history
Don't shadow the returned error when doing a shuffle dial, this prevents
the upstream caller from getting the correct underlying error for the
failure to dial a host.
  • Loading branch information
Zariel committed Apr 30, 2016
1 parent 437c5ce commit ede6246
Showing 1 changed file with 28 additions and 15 deletions.
43 changes: 28 additions & 15 deletions control.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,22 @@ func (c *controlConn) heartBeat() {
}
}

func hostInfo(addr string, defaultPort int) (*HostInfo, error) {
var port int
host, portStr, err := net.SplitHostPort(addr)
if err != nil {
host = addr
port = defaultPort
} else {
port, err = strconv.Atoi(portStr)
if err != nil {
return nil, err
}
}

return &HostInfo{peer: host, port: port}, nil
}

func (c *controlConn) shuffleDial(endpoints []string) (conn *Conn, err error) {
perm := randr.Perm(len(endpoints))
shuffled := make([]string, len(endpoints))
Expand All @@ -101,24 +117,19 @@ func (c *controlConn) shuffleDial(endpoints []string) (conn *Conn, err error) {
// node.
for _, addr := range shuffled {
if addr == "" {
return nil, fmt.Errorf("control: invalid address: %q", addr)
return nil, fmt.Errorf("invalid address: %q", addr)
}

port := c.session.cfg.Port
addr = JoinHostPort(addr, port)
host, portStr, err := net.SplitHostPort(addr)

var host *HostInfo
host, err = hostInfo(addr, port)
if err != nil {
host = addr
port = c.session.cfg.Port
err = nil
} else {
port, err = strconv.Atoi(portStr)
if err != nil {
return nil, err
}
return nil, fmt.Errorf("invalid address: %q: %v", addr, err)
}

hostInfo, _ := c.session.ring.addHostIfMissing(&HostInfo{peer: host, port: port})
hostInfo, _ := c.session.ring.addHostIfMissing(host)
conn, err = c.session.connect(addr, c, hostInfo)
if err == nil {
return conn, err
Expand All @@ -127,7 +138,11 @@ func (c *controlConn) shuffleDial(endpoints []string) (conn *Conn, err error) {
log.Printf("gocql: unable to dial control conn %v: %v\n", addr, err)
}

return
if err != nil {
return nil, err
}

return conn, nil
}

func (c *controlConn) connect(endpoints []string) error {
Expand All @@ -137,9 +152,7 @@ func (c *controlConn) connect(endpoints []string) error {

conn, err := c.shuffleDial(endpoints)
if err != nil {
return fmt.Errorf("control: unable to connect: %v", err)
} else if conn == nil {
return errors.New("control: unable to connect to initial endpoints")
return fmt.Errorf("control: unable to connect to initial hosts: %v", err)
}

if err := c.setupConn(conn); err != nil {
Expand Down

0 comments on commit ede6246

Please sign in to comment.