Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions memcache/memcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -779,9 +779,21 @@ func (c *Client) getAndTouchFromAddr(addr net.Addr, key string, expiration int32
}

// Ping checks all instances if they are alive. Returns error if any
// of them is down.
// of them is down, or ErrNoServers if the client has no servers
// configured.
func (c *Client) Ping() error {
return c.selector.Each(c.ping)
pinged := false
err := c.selector.Each(func(addr net.Addr) error {
pinged = true
return c.ping(addr)
})
if err != nil {
return err
}
if !pinged {
return ErrNoServers
}
return nil
}

// Increment atomically increments key by delta. The return value is
Expand Down
11 changes: 11 additions & 0 deletions memcache/memcache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,3 +502,14 @@ func TestScanGetResponseLine(t *testing.T) {
})
}
}

// Regression for #179. A client built with zero servers used to report
// Ping success because Each iterates over an empty list. Other
// operations on the same client return ErrNoServers, so Ping should
// surface the same signal.
func TestPingNoServers(t *testing.T) {
c := New()
if err := c.Ping(); err != ErrNoServers {
t.Fatalf("Ping() = %v, want ErrNoServers", err)
}
}