aboutsummaryrefslogtreecommitdiff
path: root/weed/filesys/filehandle.go
diff options
context:
space:
mode:
authorhilimd <68371223+hilimd@users.noreply.github.com>2020-10-15 15:15:01 +0800
committerGitHub <noreply@github.com>2020-10-15 15:15:01 +0800
commit5c2e409ffe0e9517e597ebf89e9eb3ba55883f28 (patch)
tree0ff26cdf3c2802756ce9b3c2129f5373561436b9 /weed/filesys/filehandle.go
parenta91137579857a3ef40725dccda85f40d0ac77223 (diff)
parente714c28a02bfe389229ed079477ead64f7b129c0 (diff)
downloadseaweedfs-5c2e409ffe0e9517e597ebf89e9eb3ba55883f28.tar.xz
seaweedfs-5c2e409ffe0e9517e597ebf89e9eb3ba55883f28.zip
Merge pull request #27 from chrislusf/master
sync
Diffstat (limited to 'weed/filesys/filehandle.go')
-rw-r--r--weed/filesys/filehandle.go35
1 files changed, 15 insertions, 20 deletions
diff --git a/weed/filesys/filehandle.go b/weed/filesys/filehandle.go
index e1524f939..43991376b 100644
--- a/weed/filesys/filehandle.go
+++ b/weed/filesys/filehandle.go
@@ -148,11 +148,7 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f
fh.f.entry.Attributes.FileSize = uint64(max(req.Offset+int64(len(data)), int64(fh.f.entry.Attributes.FileSize)))
glog.V(4).Infof("%v write [%d,%d) %d", fh.f.fullpath(), req.Offset, req.Offset+int64(len(req.Data)), len(req.Data))
- chunks, err := fh.dirtyPages.AddPage(req.Offset, data)
- if err != nil {
- glog.Errorf("%v write fh %d: [%d,%d): %v", fh.f.fullpath(), fh.handle, req.Offset, req.Offset+int64(len(data)), err)
- return fuse.EIO
- }
+ fh.dirtyPages.AddPage(req.Offset, data)
resp.Size = len(data)
@@ -162,12 +158,7 @@ func (fh *FileHandle) Write(ctx context.Context, req *fuse.WriteRequest, resp *f
fh.f.dirtyMetadata = true
}
- if len(chunks) > 0 {
-
- fh.f.addChunks(chunks)
-
- fh.f.dirtyMetadata = true
- }
+ fh.f.dirtyMetadata = true
return nil
}
@@ -204,20 +195,24 @@ func (fh *FileHandle) Flush(ctx context.Context, req *fuse.FlushRequest) error {
}
func (fh *FileHandle) doFlush(ctx context.Context, header fuse.Header) error {
- // fflush works at fh level
+ // flush works at fh level
// send the data to the OS
glog.V(4).Infof("doFlush %s fh %d", fh.f.fullpath(), fh.handle)
- chunks, err := fh.dirtyPages.saveExistingPagesToStorage()
- if err != nil {
- glog.Errorf("flush %s: %v", fh.f.fullpath(), err)
- return fuse.EIO
- }
+ fh.dirtyPages.saveExistingPagesToStorage()
- if len(chunks) > 0 {
+ var err error
+ go func() {
+ for t := range fh.dirtyPages.chunkSaveErrChan {
+ if t != nil {
+ err = t
+ }
+ }
+ }()
+ fh.dirtyPages.writeWaitGroup.Wait()
- fh.f.addChunks(chunks)
- fh.f.dirtyMetadata = true
+ if err != nil {
+ return err
}
if !fh.f.dirtyMetadata {