From 6f8f506cf48f60347223236f5ece7b85ea571913 Mon Sep 17 00:00:00 2001 From: Piotr Tabor Date: Sun, 25 Apr 2021 14:25:24 +0200 Subject: [PATCH] Create 'datadir' package responsible for paths. --- etcdctl/ctlv2/command/backup_command.go | 17 ++++++----- server/config/config.go | 7 +++-- server/datadir/datadir.go | 40 +++++++++++++++++++++++++ server/datadir/datadir_test.go | 33 ++++++++++++++++++++ server/datadir/doc.go | 17 +++++++++++ 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 server/datadir/datadir.go create mode 100644 server/datadir/datadir_test.go create mode 100644 server/datadir/doc.go diff --git a/etcdctl/ctlv2/command/backup_command.go b/etcdctl/ctlv2/command/backup_command.go index 6004ee8c7..97d7f2420 100644 --- a/etcdctl/ctlv2/command/backup_command.go +++ b/etcdctl/ctlv2/command/backup_command.go @@ -18,7 +18,6 @@ import ( "log" "os" "path" - "path/filepath" "regexp" "time" @@ -28,6 +27,7 @@ import ( "go.etcd.io/etcd/pkg/v3/idutil" "go.etcd.io/etcd/pkg/v3/pbutil" "go.etcd.io/etcd/raft/v3/raftpb" + "go.etcd.io/etcd/server/v3/datadir" "go.etcd.io/etcd/server/v3/etcdserver/api/membership" "go.etcd.io/etcd/server/v3/etcdserver/api/snap" "go.etcd.io/etcd/server/v3/etcdserver/api/v2store" @@ -93,19 +93,22 @@ func handleBackup(c *cli.Context) error { lg := zap.NewExample() withV3 := c.Bool("with-v3") - srcSnap := filepath.Join(c.String("data-dir"), "member", "snap") - destSnap := filepath.Join(c.String("backup-dir"), "member", "snap") + srcDir := c.String("data-dir") + destDir := c.String("backup-dir") + + srcSnap := datadir.ToSnapDir(srcDir) + destSnap := datadir.ToSnapDir(destDir) if c.String("wal-dir") != "" { srcWAL = c.String("wal-dir") } else { - srcWAL = filepath.Join(c.String("data-dir"), "member", "wal") + srcWAL = datadir.ToWalDir(srcDir) } if c.String("backup-wal-dir") != "" { destWAL = c.String("backup-wal-dir") } else { - destWAL = filepath.Join(c.String("backup-dir"), "member", "wal") + destWAL = datadir.ToWalDir(destDir) } if err := fileutil.CreateDirAll(destSnap); err != nil { @@ -116,8 +119,8 @@ func handleBackup(c *cli.Context) error { walsnap := saveSnap(lg, destSnap, srcSnap, &desired) metadata, state, ents := loadWAL(srcWAL, walsnap, withV3) - destDbPath := filepath.Join(destSnap, "db") - saveDB(lg, destDbPath, filepath.Join(srcSnap, "db"), state.Commit, &desired, withV3) + destDbPath := datadir.ToBackendFileName(destDir) + saveDB(lg, destDbPath, datadir.ToBackendFileName(srcDir), state.Commit, &desired, withV3) neww, err := wal.Create(zap.NewExample(), destWAL, pbutil.MustMarshal(&metadata)) if err != nil { diff --git a/server/config/config.go b/server/config/config.go index 4c82cfae2..337d23c46 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -25,6 +25,7 @@ import ( "go.etcd.io/etcd/client/pkg/v3/transport" "go.etcd.io/etcd/client/pkg/v3/types" "go.etcd.io/etcd/pkg/v3/netutil" + "go.etcd.io/etcd/server/v3/datadir" bolt "go.etcd.io/bbolt" "go.uber.org/zap" @@ -274,13 +275,13 @@ func (c *ServerConfig) advertiseMatchesCluster() error { return fmt.Errorf("failed to resolve %s to match --initial-cluster=%s (%v)", apStr, umap.String(), err) } -func (c *ServerConfig) MemberDir() string { return filepath.Join(c.DataDir, "member") } +func (c *ServerConfig) MemberDir() string { return datadir.ToMemberDir(c.DataDir) } func (c *ServerConfig) WALDir() string { if c.DedicatedWALDir != "" { return c.DedicatedWALDir } - return filepath.Join(c.MemberDir(), "wal") + return datadir.ToWalDir(c.DataDir) } func (c *ServerConfig) SnapDir() string { return filepath.Join(c.MemberDir(), "snap") } @@ -324,4 +325,4 @@ func (c *ServerConfig) BootstrapTimeoutEffective() time.Duration { return time.Second } -func (c *ServerConfig) BackendPath() string { return filepath.Join(c.SnapDir(), "db") } +func (c *ServerConfig) BackendPath() string { return datadir.ToBackendFileName(c.DataDir) } diff --git a/server/datadir/datadir.go b/server/datadir/datadir.go new file mode 100644 index 000000000..fa4c51ad1 --- /dev/null +++ b/server/datadir/datadir.go @@ -0,0 +1,40 @@ +// Copyright 2021 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package datadir + +import "path/filepath" + +const ( + memberDirSegment = "member" + snapDirSegment = "snap" + walDirSegment = "wal" + backendFileSegment = "db" +) + +func ToBackendFileName(dataDir string) string { + return filepath.Join(ToSnapDir(dataDir), backendFileSegment) +} + +func ToSnapDir(dataDir string) string { + return filepath.Join(ToMemberDir(dataDir), snapDirSegment) +} + +func ToWalDir(dataDir string) string { + return filepath.Join(ToMemberDir(dataDir), walDirSegment) +} + +func ToMemberDir(dataDir string) string { + return filepath.Join(dataDir, memberDirSegment) +} diff --git a/server/datadir/datadir_test.go b/server/datadir/datadir_test.go new file mode 100644 index 000000000..f6fe19b1c --- /dev/null +++ b/server/datadir/datadir_test.go @@ -0,0 +1,33 @@ +package datadir_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.etcd.io/etcd/server/v3/datadir" +) + +func TestToBackendFileName(t *testing.T) { + result := datadir.ToBackendFileName("/dir/data-dir") + assert.Equal(t, "/dir/data-dir/member/snap/db", result) +} + +func TestToMemberDir(t *testing.T) { + result := datadir.ToMemberDir("/dir/data-dir") + assert.Equal(t, "/dir/data-dir/member", result) +} + +func TestToSnapDir(t *testing.T) { + result := datadir.ToSnapDir("/dir/data-dir") + assert.Equal(t, "/dir/data-dir/member/snap", result) +} + +func TestToWalDir(t *testing.T) { + result := datadir.ToWalDir("/dir/data-dir") + assert.Equal(t, "/dir/data-dir/member/wal", result) +} + +func TestToWalDirSlash(t *testing.T) { + result := datadir.ToWalDir("/dir/data-dir/") + assert.Equal(t, "/dir/data-dir/member/wal", result) +} diff --git a/server/datadir/doc.go b/server/datadir/doc.go new file mode 100644 index 000000000..92ca4b253 --- /dev/null +++ b/server/datadir/doc.go @@ -0,0 +1,17 @@ +// Copyright 2021 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package datadir + +// datadir contains functions to navigate file-layout of etcd data-directory.