diff --git a/etcdserver/config.go b/etcdserver/config.go index c722627c7..a1a1d5cfb 100644 --- a/etcdserver/config.go +++ b/etcdserver/config.go @@ -83,9 +83,11 @@ func (c *ServerConfig) VerifyBootstrapConfig() error { return nil } -func (c *ServerConfig) WALDir() string { return path.Join(c.DataDir, "wal") } +func (c *ServerConfig) MemberDir() string { return path.Join(c.DataDir, "member") } -func (c *ServerConfig) SnapDir() string { return path.Join(c.DataDir, "snap") } +func (c *ServerConfig) WALDir() string { return path.Join(c.MemberDir(), "wal") } + +func (c *ServerConfig) SnapDir() string { return path.Join(c.MemberDir(), "snap") } func (c *ServerConfig) ShouldDiscover() bool { return c.DiscoveryURL != "" } @@ -99,6 +101,7 @@ func (c *ServerConfig) print(initial bool) { log.Println("etcdserver: force new cluster") } log.Printf("etcdserver: data dir = %s", c.DataDir) + log.Printf("etcdserver: member dir = %s", c.MemberDir()) log.Printf("etcdserver: heartbeat = %dms", c.TickMs) log.Printf("etcdserver: election = %dms", c.ElectionTicks*int(c.TickMs)) log.Printf("etcdserver: snapshot count = %d", c.SnapCount) diff --git a/etcdserver/config_test.go b/etcdserver/config_test.go index 49c6ab2b0..0a0f011a9 100644 --- a/etcdserver/config_test.go +++ b/etcdserver/config_test.go @@ -129,8 +129,8 @@ func TestBootstrapConfigVerify(t *testing.T) { func TestSnapDir(t *testing.T) { tests := map[string]string{ - "/": "/snap", - "/var/lib/etc": "/var/lib/etc/snap", + "/": "/member/snap", + "/var/lib/etc": "/var/lib/etc/member/snap", } for dd, w := range tests { cfg := ServerConfig{ @@ -144,8 +144,8 @@ func TestSnapDir(t *testing.T) { func TestWALDir(t *testing.T) { tests := map[string]string{ - "/": "/wal", - "/var/lib/etc": "/var/lib/etc/wal", + "/": "/member/wal", + "/var/lib/etc": "/var/lib/etc/member/wal", } for dd, w := range tests { cfg := ServerConfig{ diff --git a/etcdserver/server.go b/etcdserver/server.go index fb0c3b440..a98b678f5 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -145,16 +145,13 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { var s *raft.MemoryStorage var id types.ID var ss *snap.Snapshotter - baseDataDir := cfg.DataDir - // Data dir lives under member now. - cfg.DataDir = path.Join(cfg.DataDir, "member") - walVersion, err := wal.DetectVersion(baseDataDir) + 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", baseDataDir) + return nil, fmt.Errorf("unknown wal version in data dir %s", cfg.DataDir) } haveWAL := walVersion != wal.WALNotExist @@ -194,7 +191,7 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { id, n, s, w = startNode(cfg, cfg.Cluster.MemberIDs()) case haveWAL: // Run the migrations. - if err := upgradeWAL(baseDataDir, cfg.Name, walVersion); err != nil { + if err := upgradeWAL(cfg.DataDir, cfg.Name, walVersion); err != nil { return nil, err } @@ -202,6 +199,10 @@ func NewServer(cfg *ServerConfig) (*EtcdServer, error) { return nil, fmt.Errorf("cannot write to data directory: %v", err) } + if err := fileutil.IsDirWriteable(cfg.MemberDir()); err != nil { + return nil, fmt.Errorf("cannot write to member directory: %v", err) + } + if cfg.ShouldDiscover() { log.Printf("etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at %q", cfg.WALDir()) }