mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-08-24 01:54:33 +08:00
delay new file creation unless file is opened exclusively
This commit is contained in:
parent
1faafce832
commit
83cf94ad2d
@ -28,6 +28,7 @@ type Dir struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var _ = fs.Node(&Dir{})
|
var _ = fs.Node(&Dir{})
|
||||||
|
|
||||||
//var _ = fs.NodeIdentifier(&Dir{})
|
//var _ = fs.NodeIdentifier(&Dir{})
|
||||||
var _ = fs.NodeCreater(&Dir{})
|
var _ = fs.NodeCreater(&Dir{})
|
||||||
var _ = fs.NodeMknoder(&Dir{})
|
var _ = fs.NodeMknoder(&Dir{})
|
||||||
@ -140,19 +141,38 @@ func (dir *Dir) newDirectory(fullpath util.FullPath) fs.Node {
|
|||||||
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,
|
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest,
|
||||||
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
|
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
|
||||||
|
|
||||||
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0)
|
exclusive := req.Flags&fuse.OpenExclusive != 0
|
||||||
|
isDirectory := req.Mode&os.ModeDir > 0
|
||||||
|
|
||||||
if err != nil {
|
if exclusive || isDirectory {
|
||||||
return nil, nil, err
|
_, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, exclusive)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var node fs.Node
|
var node fs.Node
|
||||||
if request.Entry.IsDirectory {
|
if isDirectory {
|
||||||
node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name))
|
node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name))
|
||||||
return node, nil, nil
|
return node, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
node = dir.newFile(req.Name)
|
node = dir.newFile(req.Name)
|
||||||
file := node.(*File)
|
file := node.(*File)
|
||||||
|
file.entry = &filer_pb.Entry{
|
||||||
|
Name: req.Name,
|
||||||
|
IsDirectory: req.Mode&os.ModeDir > 0,
|
||||||
|
Attributes: &filer_pb.FuseAttributes{
|
||||||
|
Mtime: time.Now().Unix(),
|
||||||
|
Crtime: time.Now().Unix(),
|
||||||
|
FileMode: uint32(req.Mode &^ dir.wfs.option.Umask),
|
||||||
|
Uid: req.Uid,
|
||||||
|
Gid: req.Gid,
|
||||||
|
Collection: dir.wfs.option.Collection,
|
||||||
|
Replication: dir.wfs.option.Replication,
|
||||||
|
TtlSec: dir.wfs.option.TtlSec,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
file.dirtyMetadata = true
|
||||||
fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid)
|
fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid)
|
||||||
return file, fh, nil
|
return file, fh, nil
|
||||||
|
|
||||||
|
@ -265,6 +265,7 @@ func (file *File) maybeLoadEntry(ctx context.Context) (entry *filer_pb.Entry, er
|
|||||||
file.wfs.handlesLock.Lock()
|
file.wfs.handlesLock.Lock()
|
||||||
handle, found := file.wfs.handles[file.Id()]
|
handle, found := file.wfs.handles[file.Id()]
|
||||||
file.wfs.handlesLock.Unlock()
|
file.wfs.handlesLock.Unlock()
|
||||||
|
entry = file.entry
|
||||||
if found {
|
if found {
|
||||||
glog.V(4).Infof("maybeLoadEntry found opened file %s/%s: %v %v", file.dir.FullPath(), file.Name, handle.f.entry, entry)
|
glog.V(4).Infof("maybeLoadEntry found opened file %s/%s: %v %v", file.dir.FullPath(), file.Name, handle.f.entry, entry)
|
||||||
entry = handle.f.entry
|
entry = handle.f.entry
|
||||||
|
Loading…
Reference in New Issue
Block a user