diff options
| author | hilimd <68371223+hilimd@users.noreply.github.com> | 2020-10-15 15:15:01 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-15 15:15:01 +0800 |
| commit | 5c2e409ffe0e9517e597ebf89e9eb3ba55883f28 (patch) | |
| tree | 0ff26cdf3c2802756ce9b3c2129f5373561436b9 /weed/filesys/filehandle.go | |
| parent | a91137579857a3ef40725dccda85f40d0ac77223 (diff) | |
| parent | e714c28a02bfe389229ed079477ead64f7b129c0 (diff) | |
| download | seaweedfs-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.go | 35 |
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 { |
