From d312c55bbed8ef69dc11bf024024c7b50f56f5b2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 4 Mar 2019 13:00:08 -0800 Subject: file path supports windows, avoiding back slashes fix https://github.com/chrislusf/seaweedfs/issues/868 --- weed/filesys/dir_rename.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'weed/filesys/dir_rename.go') diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index d29281f35..e18f67edc 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -41,7 +41,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector func moveEntry(ctx context.Context, client filer_pb.SeaweedFilerClient, oldParent string, entry *filer_pb.Entry, newParent, newName string) error { if entry.IsDirectory { - currentDirPath := filepath.Join(oldParent, entry.Name) + currentDirPath := filepath.ToSlash(filepath.Join(oldParent, entry.Name)) lastFileName := "" includeLastFile := false @@ -65,7 +65,7 @@ func moveEntry(ctx context.Context, client filer_pb.SeaweedFilerClient, oldParen for _, item := range resp.Entries { lastFileName = item.Name - err := moveEntry(ctx, client, currentDirPath, item, filepath.Join(newParent, newName), item.Name) + err := moveEntry(ctx, client, currentDirPath, item, filepath.ToSlash(filepath.Join(newParent, newName)), item.Name) if err != nil { return err } -- cgit v1.2.3 From 55bab1b456c3c13a8009a11730e678ca0c48dfb0 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 15 Mar 2019 17:20:24 -0700 Subject: add context.Context --- weed/filesys/dir_rename.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'weed/filesys/dir_rename.go') diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index e18f67edc..8c586eb73 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -15,7 +15,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector newDir := newDirectory.(*Dir) - return dir.wfs.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { + return dir.wfs.withFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { // find existing entry request := &filer_pb.LookupDirectoryEntryRequest{ -- cgit v1.2.3 From 97406333a5ecc5b0d2cdaa74ff9901e3100e4bf2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 30 Mar 2019 23:08:29 -0700 Subject: support atomic renaming for mysql/postgres filer store --- weed/filesys/dir_rename.go | 106 +++++---------------------------------------- 1 file changed, 10 insertions(+), 96 deletions(-) (limited to 'weed/filesys/dir_rename.go') diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index 8c586eb73..7a415ff82 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -2,13 +2,10 @@ package filesys import ( "context" + "fmt" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/seaweedfs/fuse" "github.com/seaweedfs/fuse/fs" - "math" - "path/filepath" - - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" ) func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirectory fs.Node) error { @@ -17,103 +14,20 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector return dir.wfs.withFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { - // find existing entry - request := &filer_pb.LookupDirectoryEntryRequest{ - Directory: dir.Path, - Name: req.OldName, + request := &filer_pb.AtomicRenameEntryRequest{ + OldDirectory: dir.Path, + OldName: req.OldName, + NewDirectory: newDir.Path, + NewName: req.NewName, } - glog.V(4).Infof("find existing directory entry: %v", request) - resp, err := client.LookupDirectoryEntry(ctx, request) + _, err := client.AtomicRenameEntry(ctx, request) if err != nil { - glog.V(3).Infof("renaming find %s/%s: %v", dir.Path, req.OldName, err) - return fuse.ENOENT + return fmt.Errorf("renaming %s/%s => %s/%s: %v", dir.Path, req.OldName, newDir.Path, req.NewName, err) } - entry := resp.Entry + return nil - glog.V(4).Infof("found existing directory entry resp: %+v", resp) - - return moveEntry(ctx, client, dir.Path, entry, newDir.Path, req.NewName) }) } - -func moveEntry(ctx context.Context, client filer_pb.SeaweedFilerClient, oldParent string, entry *filer_pb.Entry, newParent, newName string) error { - if entry.IsDirectory { - currentDirPath := filepath.ToSlash(filepath.Join(oldParent, entry.Name)) - - lastFileName := "" - includeLastFile := false - limit := math.MaxInt32 - for limit > 0 { - request := &filer_pb.ListEntriesRequest{ - Directory: currentDirPath, - StartFromFileName: lastFileName, - InclusiveStartFrom: includeLastFile, - Limit: 1024, - } - glog.V(4).Infof("read directory: %v", request) - resp, err := client.ListEntries(ctx, request) - if err != nil { - glog.V(0).Infof("list %s: %v", oldParent, err) - return fuse.EIO - } - if len(resp.Entries) == 0 { - break - } - - for _, item := range resp.Entries { - lastFileName = item.Name - err := moveEntry(ctx, client, currentDirPath, item, filepath.ToSlash(filepath.Join(newParent, newName)), item.Name) - if err != nil { - return err - } - limit-- - } - if len(resp.Entries) < 1024 { - break - } - } - - } - - // add to new directory - { - request := &filer_pb.CreateEntryRequest{ - Directory: newParent, - Entry: &filer_pb.Entry{ - Name: newName, - IsDirectory: entry.IsDirectory, - Attributes: entry.Attributes, - Chunks: entry.Chunks, - }, - } - - glog.V(1).Infof("create new entry: %v", request) - if _, err := client.CreateEntry(ctx, request); err != nil { - glog.V(0).Infof("renaming create %s/%s: %v", newParent, newName, err) - return fuse.EIO - } - } - - // delete old entry - { - request := &filer_pb.DeleteEntryRequest{ - Directory: oldParent, - Name: entry.Name, - IsDeleteData: false, - } - - glog.V(1).Infof("remove old entry: %v", request) - _, err := client.DeleteEntry(ctx, request) - if err != nil { - glog.V(0).Infof("renaming delete %s/%s: %v", oldParent, entry.Name, err) - return fuse.EIO - } - - } - - return nil - -} -- cgit v1.2.3 From b30c14b6314c96e0cb0c110e2aa1fc206857a066 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 3 May 2019 00:24:35 -0700 Subject: webdav: can read now --- weed/filesys/dir_rename.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'weed/filesys/dir_rename.go') diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index 7a415ff82..e72a15758 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -12,7 +12,7 @@ func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, newDirector newDir := newDirectory.(*Dir) - return dir.wfs.withFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { + return dir.wfs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error { request := &filer_pb.AtomicRenameEntryRequest{ OldDirectory: dir.Path, -- cgit v1.2.3