From 324a38136acaae10c4053a996463b7d32c551e24 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Wed, 15 Apr 2015 10:42:19 +0200 Subject: [PATCH] store: use syncfs instead of syncing every file on TreeStore.Write(). as suggested in #639 use syncfs syscall. --- store/tree.go | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/store/tree.go b/store/tree.go index 9503c40..fc85376 100644 --- a/store/tree.go +++ b/store/tree.go @@ -10,11 +10,13 @@ import ( "os" "path/filepath" "sort" + "syscall" specaci "github.com/coreos/rkt/Godeps/_workspace/src/github.com/appc/spec/aci" "github.com/coreos/rkt/Godeps/_workspace/src/github.com/appc/spec/pkg/tarheader" "github.com/coreos/rkt/Godeps/_workspace/src/github.com/appc/spec/schema/types" "github.com/coreos/rkt/pkg/aci" + "github.com/coreos/rkt/pkg/sys" ) const ( @@ -55,25 +57,12 @@ func (ts *TreeStore) Write(key string, ds *Store) error { return fmt.Errorf("treestore: cannot write hash file: %v", err) } // before creating the "rendered" flag file we need to ensure that all data is fsynced - err = filepath.Walk(treepath, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.Mode().IsDir() && !info.Mode().IsRegular() { - return nil - } - f, err := os.Open(path) - if err != nil { - return err - } - defer f.Close() - err = f.Sync() - if err != nil { - return err - } - return nil - }) + dfd, err := syscall.Open(treepath, syscall.O_RDONLY, 0) if err != nil { + return err + } + defer syscall.Close(dfd) + if err := sys.Syncfs(dfd); err != nil { return fmt.Errorf("treestore: failed to sync data: %v", err) } // Create rendered file @@ -83,13 +72,7 @@ func (ts *TreeStore) Write(key string, ds *Store) error { } f.Close() - df, err := os.Open(treepath) - if err != nil { - return err - } - defer df.Close() - err = df.Sync() - if err != nil { + if err := syscall.Fsync(dfd); err != nil { return fmt.Errorf("treestore: failed to sync tree store directory: %v", err) } return nil