|
|
@ -24,7 +24,8 @@ func (fs *FilerServer) AtomicRenameEntry(ctx context.Context, req *filer_pb.Atom |
|
|
|
return nil, fmt.Errorf("%s/%s not found: %v", req.OldDirectory, req.OldName, err) |
|
|
|
} |
|
|
|
|
|
|
|
moveErr := fs.moveEntry(ctx, oldParent, oldEntry, filer2.FullPath(filepath.ToSlash(req.NewDirectory)), req.NewName) |
|
|
|
var events MoveEvents |
|
|
|
moveErr := fs.moveEntry(ctx, oldParent, oldEntry, filer2.FullPath(filepath.ToSlash(req.NewDirectory)), req.NewName, &events) |
|
|
|
if moveErr != nil { |
|
|
|
fs.filer.RollbackTransaction(ctx) |
|
|
|
return nil, fmt.Errorf("%s/%s move error: %v", req.OldDirectory, req.OldName, err) |
|
|
@ -35,19 +36,26 @@ func (fs *FilerServer) AtomicRenameEntry(ctx context.Context, req *filer_pb.Atom |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for _, entry := range events.newEntries { |
|
|
|
fs.filer.NotifyUpdateEvent(nil, entry, false) |
|
|
|
} |
|
|
|
for _, entry := range events.oldEntries { |
|
|
|
fs.filer.NotifyUpdateEvent(entry, nil, false) |
|
|
|
} |
|
|
|
|
|
|
|
return &filer_pb.AtomicRenameEntryResponse{}, nil |
|
|
|
} |
|
|
|
|
|
|
|
func (fs *FilerServer) moveEntry(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string) error { |
|
|
|
func (fs *FilerServer) moveEntry(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string, events *MoveEvents) error { |
|
|
|
if entry.IsDirectory() { |
|
|
|
if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName); err != nil { |
|
|
|
if err := fs.moveFolderSubEntries(ctx, oldParent, entry, newParent, newName, events); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
return fs.moveSelfEntry(ctx, oldParent, entry, newParent, newName) |
|
|
|
return fs.moveSelfEntry(ctx, oldParent, entry, newParent, newName, events) |
|
|
|
} |
|
|
|
|
|
|
|
func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string) error { |
|
|
|
func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string, events *MoveEvents) error { |
|
|
|
|
|
|
|
currentDirPath := oldParent.Child(entry.Name()) |
|
|
|
newDirPath := newParent.Child(newName) |
|
|
@ -68,7 +76,7 @@ func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent filer |
|
|
|
for _, item := range entries { |
|
|
|
lastFileName = item.Name() |
|
|
|
println("processing", lastFileName) |
|
|
|
err := fs.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name()) |
|
|
|
err := fs.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name(), events) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
@ -80,18 +88,19 @@ func (fs *FilerServer) moveFolderSubEntries(ctx context.Context, oldParent filer |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string) error { |
|
|
|
func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent filer2.FullPath, entry *filer2.Entry, newParent filer2.FullPath, newName string, events *MoveEvents) (error) { |
|
|
|
|
|
|
|
oldPath, newPath := oldParent.Child(entry.Name()), newParent.Child(newName) |
|
|
|
|
|
|
|
glog.V(1).Infof("moving entry %s => %s", oldPath, newPath) |
|
|
|
|
|
|
|
// add to new directory
|
|
|
|
createErr := fs.filer.CreateEntry(ctx, &filer2.Entry{ |
|
|
|
newEntry := &filer2.Entry{ |
|
|
|
FullPath: newPath, |
|
|
|
Attr: entry.Attr, |
|
|
|
Chunks: entry.Chunks, |
|
|
|
}) |
|
|
|
} |
|
|
|
createErr := fs.filer.CreateEntry(ctx, newEntry) |
|
|
|
if createErr != nil { |
|
|
|
return createErr |
|
|
|
} |
|
|
@ -101,6 +110,14 @@ func (fs *FilerServer) moveSelfEntry(ctx context.Context, oldParent filer2.FullP |
|
|
|
if deleteErr != nil { |
|
|
|
return deleteErr |
|
|
|
} |
|
|
|
|
|
|
|
events.oldEntries = append(events.oldEntries, entry) |
|
|
|
events.newEntries = append(events.newEntries, newEntry) |
|
|
|
return nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
type MoveEvents struct { |
|
|
|
oldEntries []*filer2.Entry |
|
|
|
newEntries []*filer2.Entry |
|
|
|
} |