Browse Source

Merge pull request #2210 from yichengq/316

etcdmain: use /member subdir to save member data
Yicheng Qin 11 years ago
parent
commit
afb14a3e7a
1 changed files with 41 additions and 4 deletions
  1. 41 4
      etcdmain/etcd.go

+ 41 - 4
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,
@@ -335,6 +336,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 {