Skip to content

Commit

Permalink
etcdserver: delete member directory when discovery fails
Browse files Browse the repository at this point in the history
When discovery fails, etcd node falls back to proxy. And in order to
start as a proxy, we need to make sure there are conflicting directories:
'member' and 'proxy' directories cannot be existent together. This deletes
'member' directory only when startEtcd fails (#3827).
  • Loading branch information
gyuho committed Dec 29, 2015
1 parent c3655cb commit a996b3e
Showing 1 changed file with 19 additions and 8 deletions.
27 changes: 19 additions & 8 deletions etcdserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ type EtcdServer struct {

// NewServer creates a new EtcdServer from the supplied configuration. The
// configuration is considered static for the lifetime of the EtcdServer.
func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
func NewServer(cfg *ServerConfig) (srv *EtcdServer, err error) {
st := store.New(StoreClusterPrefix, StoreKeysPrefix)
var (
w *wal.WAL
Expand Down Expand Up @@ -223,12 +223,21 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
}

haveWAL := wal.Exist(cfg.WALDir())
if !haveWAL {
defer func() {
if err != nil {
// cleans up member directory if bootstrap fails (including forming or joining a new cluster)
os.RemoveAll(cfg.MemberDir())
}
}()
}
ss := snap.New(cfg.SnapDir())

prt, err := rafthttp.NewRoundTripper(cfg.PeerTLSInfo, cfg.peerDialTimeout())
if err != nil {
return nil, err
}

var remotes []*Member
switch {
case !haveWAL && !cfg.NewCluster:
Expand All @@ -239,11 +248,12 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
if err != nil {
return nil, err
}
existingCluster, err := GetClusterFromRemotePeers(getRemotePeerURLs(cl, cfg.Name), prt)
if err != nil {
existingCluster, e := GetClusterFromRemotePeers(getRemotePeerURLs(cl, cfg.Name), prt)
if e != nil {
err = e
return nil, fmt.Errorf("cannot fetch cluster info from peer urls: %v", err)
}
if err := ValidateClusterAndAssignIDs(cl, existingCluster); err != nil {
if err = ValidateClusterAndAssignIDs(cl, existingCluster); err != nil {
return nil, fmt.Errorf("error validating peerURLs %s: %v", existingCluster, err)
}
if !isCompatibleWithCluster(cl, cl.MemberByName(cfg.Name).ID, prt) {
Expand All @@ -256,7 +266,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
cfg.Print()
id, n, s, w = startNode(cfg, cl, nil)
case !haveWAL && cfg.NewCluster:
if err := cfg.VerifyBootstrap(); err != nil {
if err = cfg.VerifyBootstrap(); err != nil {
return nil, err
}
cl, err = newClusterFromURLsMap(cfg.InitialClusterToken, cfg.InitialPeerURLsMap)
Expand All @@ -274,8 +284,9 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
if err != nil {
return nil, &DiscoveryError{Op: "join", Err: err}
}
urlsmap, err := types.NewURLsMap(str)
if err != nil {
urlsmap, e := types.NewURLsMap(str)
if e != nil {
err = e
return nil, err
}
if checkDuplicateURL(urlsmap) {
Expand Down Expand Up @@ -335,7 +346,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
sstats.Initialize()
lstats := stats.NewLeaderStats(id.String())

srv := &EtcdServer{
srv = &EtcdServer{
cfg: cfg,
snapCount: cfg.SnapCount,
errorc: make(chan error, 1),
Expand Down

0 comments on commit a996b3e

Please sign in to comment.