diff --git a/etcdserver/server.go b/etcdserver/server.go index e9dd4bf33..97b57fb76 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -210,7 +210,10 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { var n raft.Node var s *raft.MemoryStorage var id types.ID - walVersion := wal.DetectVersion(cfg.DataDir) + walVersion, err := wal.DetectVersion(cfg.DataDir) + if err != nil { + return nil, err + } if walVersion == wal.WALUnknown { return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir) } diff --git a/wal/util.go b/wal/util.go index 0e940305b..62af664e0 100644 --- a/wal/util.go +++ b/wal/util.go @@ -19,6 +19,7 @@ package wal import ( "fmt" "log" + "os" "path" "github.com/coreos/etcd/pkg/fileutil" @@ -35,23 +36,31 @@ const ( WALv0_5 WalVersion = "0.5.x" ) -func DetectVersion(dirpath string) WalVersion { +func DetectVersion(dirpath string) (WalVersion, error) { + if _, err := os.Stat(dirpath); os.IsNotExist(err) { + return WALNotExist, nil + } names, err := fileutil.ReadDir(dirpath) if err != nil { - return WALNotExist + // Error reading the directory + return WALNotExist, err + } + if len(names) == 0 { + // Empty WAL directory + return WALNotExist, nil } nameSet := types.NewUnsafeSet(names...) if nameSet.ContainsAll([]string{"snap", "wal"}) { // .../wal cannot be empty to exist. if Exist(path.Join(dirpath, "wal")) { - return WALv0_5 + return WALv0_5, nil } } if nameSet.ContainsAll([]string{"snapshot", "conf", "log"}) { - return WALv0_4 + return WALv0_4, nil } - return WALUnknown + return WALUnknown, nil } func Exist(dirpath string) bool {