Merge pull request #3794 from yichengq/fix-proxy-term

etcdmain: fix parsing discovery error
This commit is contained in:
Xiang Li 2015-11-02 17:33:47 -08:00
commit fe165de1d1
3 changed files with 39 additions and 42 deletions

View File

@ -124,18 +124,21 @@ func Main() {
shouldProxy := cfg.isProxy() shouldProxy := cfg.isProxy()
if !shouldProxy { if !shouldProxy {
stopped, err = startEtcd(cfg) stopped, err = startEtcd(cfg)
if err == discovery.ErrFullCluster && cfg.shouldFallbackToProxy() { if derr, ok := err.(*etcdserver.DiscoveryError); ok && derr.Err == discovery.ErrFullCluster {
if cfg.shouldFallbackToProxy() {
plog.Noticef("discovery cluster full, falling back to %s", fallbackFlagProxy) plog.Noticef("discovery cluster full, falling back to %s", fallbackFlagProxy)
shouldProxy = true shouldProxy = true
} }
} }
}
if shouldProxy { if shouldProxy {
err = startProxy(cfg) err = startProxy(cfg)
} }
} }
if err != nil { if err != nil {
switch err { if derr, ok := err.(*etcdserver.DiscoveryError); ok {
switch derr.Err {
case discovery.ErrDuplicateID: case discovery.ErrDuplicateID:
plog.Errorf("member %q has previously registered with discovery service token (%s).", cfg.name, cfg.durl) plog.Errorf("member %q has previously registered with discovery service token (%s).", cfg.name, cfg.durl)
plog.Errorf("But etcd could not find valid cluster configuration in the given data dir (%s).", cfg.dir) plog.Errorf("But etcd could not find valid cluster configuration in the given data dir (%s).", cfg.dir)
@ -146,6 +149,13 @@ func Main() {
plog.Errorf("please check (cURL) the discovery token for more information.") plog.Errorf("please check (cURL) the discovery token for more information.")
plog.Errorf("please do not reuse the discovery token and generate a new one to bootstrap the cluster.") plog.Errorf("please do not reuse the discovery token and generate a new one to bootstrap the cluster.")
default: default:
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)
}
if strings.Contains(err.Error(), "include") && strings.Contains(err.Error(), "--initial-cluster") { if strings.Contains(err.Error(), "include") && strings.Contains(err.Error(), "--initial-cluster") {
plog.Infof("%v", err) plog.Infof("%v", err)
if cfg.initialCluster == initialClusterFromName(cfg.name) { if cfg.initialCluster == initialClusterFromName(cfg.name) {
@ -159,16 +169,8 @@ func Main() {
} }
os.Exit(1) 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) plog.Fatalf("%v", err)
} }
os.Exit(1)
}
osutil.HandleInterrupts() osutil.HandleInterrupts()

View File

@ -40,16 +40,11 @@ func isKeyNotFound(err error) bool {
return ok && e.ErrorCode == etcdErr.EcodeKeyNotFound return ok && e.ErrorCode == etcdErr.EcodeKeyNotFound
} }
type discoveryError struct { type DiscoveryError struct {
op string Op string
err error Err error
} }
func (e discoveryError) Error() string { func (e DiscoveryError) Error() string {
return fmt.Sprintf("failed to %s discovery cluster (%v)", e.op, e.err) return fmt.Sprintf("failed to %s discovery cluster (%v)", e.Op, e.Err)
}
func IsDiscoveryError(err error) bool {
_, ok := err.(*discoveryError)
return ok
} }

View File

@ -258,7 +258,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
var err error var err error
str, err = discovery.JoinCluster(cfg.DiscoveryURL, cfg.DiscoveryProxy, m.ID, cfg.InitialPeerURLsMap.String()) str, err = discovery.JoinCluster(cfg.DiscoveryURL, cfg.DiscoveryProxy, m.ID, cfg.InitialPeerURLsMap.String())
if err != nil { if err != nil {
return nil, &discoveryError{op: "join", err: err} return nil, &DiscoveryError{Op: "join", Err: err}
} }
urlsmap, err := types.NewURLsMap(str) urlsmap, err := types.NewURLsMap(str)
if err != nil { if err != nil {