diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-01-22 11:42:40 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-01-22 11:42:40 -0800 |
| commit | d4e75a0d183b57180b2ff0be2531db540c0c9aa6 (patch) | |
| tree | 828a5d3a31592c0edfeb224e1f80874d6f83001d /weed/filesys/dir.go | |
| parent | 9b01a99d9a93b2502746fe6870945823be48cc5f (diff) | |
| download | seaweedfs-d4e75a0d183b57180b2ff0be2531db540c0c9aa6.tar.xz seaweedfs-d4e75a0d183b57180b2ff0be2531db540c0c9aa6.zip | |
filer: option to create file only if it is new, O_EXCL
Diffstat (limited to 'weed/filesys/dir.go')
| -rw-r--r-- | weed/filesys/dir.go | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 7ed638e0e..3c1672911 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -3,6 +3,7 @@ package filesys import ( "context" "os" + "strings" "time" "github.com/chrislusf/seaweedfs/weed/filer2" @@ -123,26 +124,29 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, TtlSec: dir.wfs.option.TtlSec, }, }, + OExcl: req.Flags&fuse.OpenExclusive != 0, } - glog.V(1).Infof("create: %v", request) + glog.V(1).Infof("create: %v", req.String()) - if request.Entry.IsDirectory { - if err := dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { - if _, err := client.CreateEntry(ctx, request); err != nil { - glog.V(0).Infof("create %s/%s: %v", dir.Path, req.Name, err) - return fuse.EIO + if err := dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { + if _, err := client.CreateEntry(ctx, request); err != nil { + glog.V(0).Infof("create %s/%s: %v", dir.Path, req.Name, err) + if strings.Contains(err.Error(), "EEXIST") { + return fuse.EEXIST } - return nil - }); err != nil { - return nil, nil, err + return fuse.EIO } + return nil + }); err != nil { + return nil, nil, err } - node := dir.newFile(req.Name, request.Entry) - file := node.(*File) - if !request.Entry.IsDirectory { - file.isOpen = true + if request.Entry.IsDirectory { + return node, nil, nil } + + file := node.(*File) + file.isOpen = true fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid) fh.dirtyMetadata = true return file, fh, nil |
