diff --git a/embed/etcd.go b/embed/etcd.go index e586b7e674e2..2b5cf537384f 100644 --- a/embed/etcd.go +++ b/embed/etcd.go @@ -124,7 +124,9 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { token string ) + memberInitialized := true if !isMemberInitialized(cfg) { + memberInitialized = false urlsmap, token, err = cfg.PeerURLsMapAndToken("etcd") if err != nil { return e, fmt.Errorf("error setting up initial cluster: %v", err) @@ -186,6 +188,16 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) { // buffer channel so goroutines on closed connections won't wait forever e.errc = make(chan error, len(e.Peers)+len(e.Clients)+2*len(e.sctxs)) + // newly started member ("memberInitialized==false") + // does not need corruption check + if memberInitialized { + if err = e.Server.CheckInitialHashKV(); err != nil { + // set "EtcdServer" to nil, so that it does not block on "EtcdServer.Close()" + // (nothing to close since rafthttp transports have not been started) + e.Server = nil + return e, err + } + } e.Server.Start() if err = e.servePeers(); err != nil {