discovery: print out detailed cluster error

This commit is contained in:
Xiang Li 2015-07-29 23:04:12 +08:00
parent 5fa8652241
commit a47e661fff
2 changed files with 17 additions and 4 deletions

View File

@ -14,6 +14,8 @@
package client package client
import "fmt"
type ClusterError struct { type ClusterError struct {
Errors []error Errors []error
} }
@ -21,3 +23,11 @@ type ClusterError struct {
func (ce *ClusterError) Error() string { func (ce *ClusterError) Error() string {
return ErrClusterUnavailable.Error() return ErrClusterUnavailable.Error()
} }
func (ce *ClusterError) Detail() string {
s := ""
for i, e := range ce.Errors {
s += fmt.Sprintf("error #%d: %s\n", i, e)
}
return s
}

View File

@ -221,7 +221,8 @@ func (d *discovery) checkCluster() ([]*client.Node, int, uint64, error) {
if err == client.ErrInvalidJSON { if err == client.ErrInvalidJSON {
return nil, 0, 0, ErrBadDiscoveryEndpoint return nil, 0, 0, ErrBadDiscoveryEndpoint
} }
if _, ok := err.(*client.ClusterError); ok { if ce, ok := err.(*client.ClusterError); ok {
plog.Error(ce.Detail())
return d.checkClusterRetry() return d.checkClusterRetry()
} }
return nil, 0, 0, err return nil, 0, 0, err
@ -235,7 +236,8 @@ func (d *discovery) checkCluster() ([]*client.Node, int, uint64, error) {
resp, err = d.c.Get(ctx, d.cluster, nil) resp, err = d.c.Get(ctx, d.cluster, nil)
cancel() cancel()
if err != nil { if err != nil {
if _, ok := err.(*client.ClusterError); ok { if ce, ok := err.(*client.ClusterError); ok {
plog.Error(ce.Detail())
return d.checkClusterRetry() return d.checkClusterRetry()
} }
return nil, 0, 0, err return nil, 0, 0, err
@ -266,7 +268,7 @@ func (d *discovery) checkCluster() ([]*client.Node, int, uint64, error) {
func (d *discovery) logAndBackoffForRetry(step string) { func (d *discovery) logAndBackoffForRetry(step string) {
d.retries++ d.retries++
retryTime := time.Second * (0x1 << d.retries) retryTime := time.Second * (0x1 << d.retries)
plog.Infof("%s: connection to %s timed out, retrying in %s", step, d.url, retryTime) plog.Infof("%s: error connecting to %s, retrying in %s", step, d.url, retryTime)
d.clock.Sleep(retryTime) d.clock.Sleep(retryTime)
} }
@ -311,7 +313,8 @@ func (d *discovery) waitNodes(nodes []*client.Node, size int, index uint64) ([]*
plog.Noticef("found %d peer(s), waiting for %d more", len(all), size-len(all)) plog.Noticef("found %d peer(s), waiting for %d more", len(all), size-len(all))
resp, err := w.Next(context.Background()) resp, err := w.Next(context.Background())
if err != nil { if err != nil {
if _, ok := err.(*client.ClusterError); ok { if ce, ok := err.(*client.ClusterError); ok {
plog.Error(ce.Detail())
return d.waitNodesRetry() return d.waitNodesRetry()
} }
return nil, err return nil, err