Skip to content

Commit

Permalink
etcdserver,pkg: remove temp files in snap dir when etcdserver starting
Browse files Browse the repository at this point in the history
- Backporting: etcd-io#12846
- Reference: etcd-io#14232

Signed-off-by: vivekpatani <9080894+vivekpatani@users.noreply.github.com>
  • Loading branch information
vivekpatani committed Jul 21, 2022
1 parent 7ee7029 commit e4deb09
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 0 deletions.
12 changes: 12 additions & 0 deletions etcdserver/server.go
Expand Up @@ -25,6 +25,7 @@ import (
"os"
"path"
"regexp"
"strings"
"sync"
"sync/atomic"
"time"
Expand Down Expand Up @@ -323,6 +324,17 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) {
plog.Fatalf("create snapshot directory error: %v", err)
}
}

if err = fileutil.RemoveMatchFile(cfg.Logger, cfg.SnapDir(), func(fileName string) bool {
return strings.HasPrefix(fileName, "tmp")
}); err != nil {
cfg.Logger.Error(
"failed to remove temp file(s) in snapshot directory",
zap.String("path", cfg.SnapDir()),
zap.Error(err),
)
}

ss := snap.New(cfg.Logger, cfg.SnapDir())

bepath := cfg.backendPath()
Expand Down
32 changes: 32 additions & 0 deletions pkg/fileutil/fileutil.go
Expand Up @@ -16,6 +16,7 @@ package fileutil

import (
"fmt"
"go.uber.org/zap"
"io"
"io/ioutil"
"os"
Expand Down Expand Up @@ -127,3 +128,34 @@ func CheckDirPermission(dir string, perm os.FileMode) error {
}
return nil
}

// RemoveMatchFile deletes file if matchFunc is true on an existing dir
// Returns error if the dir does not exist or remove file fail
func RemoveMatchFile(lg *zap.Logger, dir string, matchFunc func(fileName string) bool) error {
if lg == nil {
lg = zap.NewNop()
}
if !Exist(dir) {
return fmt.Errorf("directory %s does not exist", dir)
}
fileNames, err := ReadDir(dir)
if err != nil {
return err
}
var removeFailedFiles []string
for _, fileName := range fileNames {
if matchFunc(fileName) {
file := filepath.Join(dir, fileName)
if err = os.Remove(file); err != nil {
removeFailedFiles = append(removeFailedFiles, fileName)
lg.Error("remove file failed",
zap.String("file", file),
zap.Error(err))
}
}
}
if len(removeFailedFiles) != 0 {
return fmt.Errorf("remove file(s) %v error", removeFailedFiles)
}
return nil
}
43 changes: 43 additions & 0 deletions pkg/fileutil/fileutil_test.go
Expand Up @@ -26,6 +26,8 @@ import (
"strings"
"testing"
"time"

"go.uber.org/zap/zaptest"
)

func TestIsDirWriteable(t *testing.T) {
Expand Down Expand Up @@ -166,3 +168,44 @@ func TestDirPermission(t *testing.T) {
t.Errorf("expected error, got nil")
}
}

func TestRemoveMatchFile(t *testing.T) {
tmpdir := t.TempDir()
f, err := os.CreateTemp(tmpdir, "tmp")
if err != nil {
t.Fatal(err)
}
f.Close()
f, err = os.CreateTemp(tmpdir, "foo.tmp")
if err != nil {
t.Fatal(err)
}
f.Close()

err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
return strings.HasPrefix(fileName, "tmp")
})
if err != nil {
t.Errorf("expected nil, got error")
}
fnames, err := ReadDir(tmpdir)
if err != nil {
t.Fatal(err)
}
if len(fnames) != 1 {
t.Errorf("expected exist 1 files, got %d", len(fnames))
}

f, err = os.CreateTemp(tmpdir, "tmp")
if err != nil {
t.Fatal(err)
}
f.Close()
err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
os.Remove(filepath.Join(tmpdir, fileName))
return strings.HasPrefix(fileName, "tmp")
})
if err == nil {
t.Errorf("expected error, got nil")
}
}

0 comments on commit e4deb09

Please sign in to comment.