detect more cases of empty directories and actual errors

This commit is contained in:
Barak Michener 2014-12-11 13:37:32 -05:00
parent 421fe128c3
commit cf7690cb51
2 changed files with 18 additions and 6 deletions

View File

@ -210,7 +210,10 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) {
var n raft.Node var n raft.Node
var s *raft.MemoryStorage var s *raft.MemoryStorage
var id types.ID 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 { if walVersion == wal.WALUnknown {
return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir) return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir)
} }

View File

@ -19,6 +19,7 @@ package wal
import ( import (
"fmt" "fmt"
"log" "log"
"os"
"path" "path"
"github.com/coreos/etcd/pkg/fileutil" "github.com/coreos/etcd/pkg/fileutil"
@ -35,23 +36,31 @@ const (
WALv0_5 WalVersion = "0.5.x" 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) names, err := fileutil.ReadDir(dirpath)
if err != nil { 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...) nameSet := types.NewUnsafeSet(names...)
if nameSet.ContainsAll([]string{"snap", "wal"}) { if nameSet.ContainsAll([]string{"snap", "wal"}) {
// .../wal cannot be empty to exist. // .../wal cannot be empty to exist.
if Exist(path.Join(dirpath, "wal")) { if Exist(path.Join(dirpath, "wal")) {
return WALv0_5 return WALv0_5, nil
} }
} }
if nameSet.ContainsAll([]string{"snapshot", "conf", "log"}) { if nameSet.ContainsAll([]string{"snapshot", "conf", "log"}) {
return WALv0_4 return WALv0_4, nil
} }
return WALUnknown return WALUnknown, nil
} }
func Exist(dirpath string) bool { func Exist(dirpath string) bool {