diff --git a/pkg/cmd/server/etcd/etcd.go b/pkg/cmd/server/etcd/etcd.go index d367cd735e19..7fa961295b35 100644 --- a/pkg/cmd/server/etcd/etcd.go +++ b/pkg/cmd/server/etcd/etcd.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "net/http" + "net/http/httputil" "time" etcdclient "github.com/coreos/go-etcd/etcd" @@ -114,6 +115,7 @@ func EtcdClient(etcdClientInfo configapi.EtcdConnectionInfo) (*etcdclient.Client etcdClient := etcdclient.NewClient(etcdClientInfo.URLs) etcdClient.SetTransport(transport) + etcdClient.CheckRetry = NeverRetryOnFailure return etcdClient, nil } @@ -133,3 +135,19 @@ func TestEtcdClient(etcdClient *etcdclient.Client) error { } return nil } + +// NeverRetryOnFailure is a retry function for the etcdClient. If there's only one machine, master election doesn't make much sense, +// so we don't bother to retry, we simply dump the failure and return the error directly. +func NeverRetryOnFailure(cluster *etcdclient.Cluster, numReqs int, lastResp http.Response, err error) error { + if len(cluster.Machines) > 1 { + return etcdclient.DefaultCheckRetry(cluster, numReqs, lastResp, err) + } + + content, err := httputil.DumpResponse(&lastResp, true) + if err != nil { + glog.Errorf("failure dumping response: %v", err) + } else { + glog.Errorf("etcd failure response: %s", string(content)) + } + return err +}