diff --git a/memcache/memcache.go b/memcache/memcache.go index 6f48caa..fd7e1d9 100644 --- a/memcache/memcache.go +++ b/memcache/memcache.go @@ -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 diff --git a/memcache/memcache_test.go b/memcache/memcache_test.go index a0fa746..36febbb 100644 --- a/memcache/memcache_test.go +++ b/memcache/memcache_test.go @@ -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) + } +}