diff options
Diffstat (limited to 'weed/filesys/dir_rename.go')
| -rw-r--r-- | weed/filesys/dir_rename.go | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index f28c8af92..01a8df175 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -3,13 +3,13 @@ package filesys import ( "context" "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/seaweedfs/fuse" - "github.com/seaweedfs/fuse/fs" - "io" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/seaweedfs/fuse" + "github.com/seaweedfs/fuse/fs" + "io" + "strings" ) func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error { @@ -37,7 +37,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector stream, err := client.StreamRenameEntry(ctx, request) if err != nil { glog.Errorf("dir AtomicRenameEntry %s => %s : %v", oldPath, newPath, err) - return fuse.EXDEV + return fuse.EIO } for { @@ -46,11 +46,19 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector if recvErr == io.EOF { break } else { + glog.V(0).Infof("dir Rename %s => %s receive: %v", oldPath, newPath, recvErr) + if strings.Contains(recvErr.Error(), "not empty") { + return fuse.EEXIST + } + if strings.Contains(recvErr.Error(), "not directory") { + return fuse.ENOTDIR + } return recvErr } } if err = dir.handleRenameResponse(ctx, resp); err != nil { + glog.V(0).Infof("dir Rename %s => %s : %v", oldPath, newPath, err) return err } @@ -59,12 +67,8 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return nil }) - if err != nil { - glog.V(0).Infof("dir Rename %s => %s : %v", oldPath, newPath, err) - return fuse.EIO - } - return nil + return err } func (dir *Dir) handleRenameResponse(ctx context.Context, resp *filer_pb.StreamRenameEntryResponse) error { @@ -114,7 +118,9 @@ func (dir *Dir) handleRenameResponse(ctx context.Context, resp *filer_pb.StreamR if existingHandle, found := dir.wfs.handles[inodeId]; found && existingHandle != nil { glog.V(4).Infof("opened file handle %s => %s", oldPath, newPath) delete(dir.wfs.handles, inodeId) + existingHandle.handle = newPath.AsInode() existingHandle.f.entry.Name = newName + existingHandle.f.id = newPath.AsInode() dir.wfs.handles[newPath.AsInode()] = existingHandle } dir.wfs.handlesLock.Unlock() |
