diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index b2666af47..5d9124d5d 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -159,6 +159,12 @@ func Main() { } os.Exit(1) } + if etcdserver.IsDiscoveryError(err) { + plog.Errorf("%v", err) + plog.Infof("discovery token %s was used, but failed to bootstrap the cluster.", cfg.durl) + plog.Infof("please generate a new discovery token and try to bootstrap again.") + os.Exit(1) + } plog.Fatalf("%v", err) } os.Exit(1) diff --git a/etcdserver/errors.go b/etcdserver/errors.go index 22b443aba..3d1fa24d1 100644 --- a/etcdserver/errors.go +++ b/etcdserver/errors.go @@ -16,6 +16,7 @@ package etcdserver import ( "errors" + "fmt" etcdErr "github.com/coreos/etcd/error" ) @@ -37,3 +38,17 @@ func isKeyNotFound(err error) bool { e, ok := err.(*etcdErr.Error) return ok && e.ErrorCode == etcdErr.EcodeKeyNotFound } + +type discoveryError struct { + op string + err error +} + +func (e discoveryError) Error() string { + return fmt.Sprintf("failed to %s discovery cluster (%v)", e.op, e.err) +} + +func IsDiscoveryError(err error) bool { + _, ok := err.(*discoveryError) + return ok +} diff --git a/etcdserver/server.go b/etcdserver/server.go index 61d4c8aae..e9bc60ca9 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -238,7 +238,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { if cfg.ShouldDiscover() { str, err := discovery.JoinCluster(cfg.DiscoveryURL, cfg.DiscoveryProxy, m.ID, cfg.InitialPeerURLsMap.String()) if err != nil { - return nil, err + return nil, &discoveryError{op: "join", err: err} } urlsmap, err := types.NewURLsMap(str) if err != nil {