diff --git a/etcd/etcd.go b/etcd/etcd.go index 1bda8eedc..c4c5db783 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -33,7 +33,6 @@ import ( ehttp "github.com/coreos/etcd/http" "github.com/coreos/etcd/log" "github.com/coreos/etcd/metrics" - "github.com/coreos/etcd/pkg/btrfs" "github.com/coreos/etcd/server" "github.com/coreos/etcd/store" ) diff --git a/pkg/btrfs/fs.go b/pkg/btrfs/btrfs.go similarity index 77% rename from pkg/btrfs/fs.go rename to pkg/btrfs/btrfs.go index 990ae5856..66e062df9 100644 --- a/pkg/btrfs/fs.go +++ b/pkg/btrfs/btrfs.go @@ -1,6 +1,7 @@ package btrfs import ( + "fmt" "os" "runtime" "syscall" @@ -39,33 +40,31 @@ func IsBtrfs(path string) bool { return true } -// SetNOCOWDir sets NOCOW flag for the directory -func SetNOCOWDir(path string) error { +// SetNOCOWFile sets NOCOW flag for file +func SetNOCOWFile(path string) error { file, err := os.Open(path) if err != nil { - log.Warnf("Failed to open %v: %v", path, err) return err } defer file.Close() fileinfo, err := file.Stat() if err != nil { - log.Warnf("Failed to stat %v: %v", path, err) return err } - if !fileinfo.IsDir() { - log.Infof("Skip NOCOW setting for non directory") - return nil + if fileinfo.IsDir() { + return fmt.Errorf("skip directory") + } + if fileinfo.Size() != 0 { + return fmt.Errorf("skip nonempty file") } var attr int if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, file.Fd(), FS_IOC_GETFLAGS, uintptr(unsafe.Pointer(&attr))); errno != 0 { - log.Warnf("Failed to get file flags: %v", errno.Error()) return errno } attr |= FS_NOCOW_FL if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, file.Fd(), FS_IOC_SETFLAGS, uintptr(unsafe.Pointer(&attr))); errno != 0 { - log.Warnf("Failed to set file flags: %v", errno.Error()) return errno } log.Infof("Set NOCOW to path %v succeeded", path) diff --git a/pkg/btrfs/fs_test.go b/pkg/btrfs/btrfs_test.go similarity index 82% rename from pkg/btrfs/fs_test.go rename to pkg/btrfs/btrfs_test.go index 30cd25e85..b841aa370 100644 --- a/pkg/btrfs/fs_test.go +++ b/pkg/btrfs/btrfs_test.go @@ -9,14 +9,16 @@ import ( ) func TestSetNOCOW(t *testing.T) { - name, err := ioutil.TempDir(".", "etcdtest") + f, err := ioutil.TempFile(".", "etcdtest") if err != nil { t.Fatal("Failed creating temp dir") } + name := f.Name() + f.Close() defer os.Remove(name) if IsBtrfs(name) { - SetNOCOWDir(name) + SetNOCOWFile(name) cmd := exec.Command("lsattr", name) out, err := cmd.Output() if err != nil { diff --git a/server/peer_server.go b/server/peer_server.go index b1c1ca4db..3806a8185 100644 --- a/server/peer_server.go +++ b/server/peer_server.go @@ -294,7 +294,9 @@ func (s *PeerServer) Start(snapshot bool, discoverURL string, peers []string) er // Set NOCOW for data directory in btrfs if btrfs.IsBtrfs(s.raftServer.LogPath()) { - btrfs.SetNOCOW(s.raftServer.LogPath()) + if err := btrfs.SetNOCOWFile(s.raftServer.LogPath()); err != nil { + log.Warnf("Failed setting NOCOW: %v", err) + } } s.findCluster(discoverURL, peers)