From ce1d7a9fa98e314ac02586e77e077abb9b49343e Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Mon, 2 Feb 2015 16:16:22 -0800 Subject: [PATCH] etcdmain: use /member subdir to save member data --- etcdmain/etcd.go | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 968cca4cd..1219287c0 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -88,10 +88,11 @@ func startEtcd(cfg *config) (<-chan struct{}, error) { cfg.dir = fmt.Sprintf("%v.etcd", cfg.name) log.Printf("no data-dir provided, using default data-dir ./%s", cfg.dir) } - if err := os.MkdirAll(cfg.dir, privateDirMode); err != nil { - return nil, fmt.Errorf("cannot create data directory: %v", err) + if err := makeMemberDir(cfg.dir); err != nil { + return nil, fmt.Errorf("cannot use /member sub-directory: %v", err) } - if err := fileutil.IsDirWriteable(cfg.dir); err != nil { + membdir := path.Join(cfg.dir, "member") + if err := fileutil.IsDirWriteable(membdir); err != nil { return nil, fmt.Errorf("cannot write to data directory: %v", err) } @@ -148,7 +149,7 @@ func startEtcd(cfg *config) (<-chan struct{}, error) { Name: cfg.name, ClientURLs: cfg.acurls, PeerURLs: cfg.apurls, - DataDir: cfg.dir, + DataDir: membdir, SnapCount: cfg.snapCount, MaxSnapFiles: cfg.maxSnapFiles, MaxWALFiles: cfg.maxWalFiles, @@ -329,6 +330,42 @@ func setupCluster(cfg *config) (*etcdserver.Cluster, error) { return cls, err } +func makeMemberDir(dir string) error { + membdir := path.Join(dir, "member") + _, err := os.Stat(membdir) + switch { + case err == nil: + return nil + case !os.IsNotExist(err): + return err + } + if err := os.MkdirAll(membdir, 0700); err != nil { + return err + } + v1Files := types.NewUnsafeSet("conf", "log", "snapshot") + v2Files := types.NewUnsafeSet("wal", "snap") + names, err := fileutil.ReadDir(dir) + if err != nil { + return err + } + for _, name := range names { + switch { + case v1Files.Contains(name): + // Link it to the subdir and keep the v1 file at the original + // location, so v0.4 etcd can still bootstrap if the upgrade + // failed. + if err := os.Link(path.Join(dir, name), path.Join(membdir, name)); err != nil { + return err + } + case v2Files.Contains(name): + if err := os.Rename(path.Join(dir, name), path.Join(membdir, name)); err != nil { + return err + } + } + } + return nil +} + func genClusterString(name string, urls types.URLs) string { addrs := make([]string, 0) for _, u := range urls {