aboutsummaryrefslogtreecommitdiff
path: root/weed/server/filer_grpc_server_dlm.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/filer_grpc_server_dlm.go')
-rw-r--r--weed/server/filer_grpc_server_dlm.go37
1 files changed, 35 insertions, 2 deletions
diff --git a/weed/server/filer_grpc_server_dlm.go b/weed/server/filer_grpc_server_dlm.go
index f3c6caa3d..6cdd69e42 100644
--- a/weed/server/filer_grpc_server_dlm.go
+++ b/weed/server/filer_grpc_server_dlm.go
@@ -16,7 +16,23 @@ func (fs *FilerServer) Lock(ctx context.Context, req *filer_pb.LockRequest) (res
var movedTo pb.ServerAddress
expiredAtNs := time.Now().Add(time.Duration(req.SecondsToLock) * time.Second).UnixNano()
- resp.RenewToken, movedTo, err = fs.filer.Dlm.Lock(fs.option.Host, req.Name, expiredAtNs, req.PreviousLockToken)
+ resp.RenewToken, movedTo, err = fs.filer.Dlm.Lock(fs.option.Host, req.Name, expiredAtNs, req.RenewToken)
+ if !req.IsMoved && movedTo != "" {
+ err = pb.WithFilerClient(false, 0, movedTo, fs.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error {
+ secondResp, err := client.Lock(context.Background(), &filer_pb.LockRequest{
+ Name: req.Name,
+ SecondsToLock: req.SecondsToLock,
+ RenewToken: req.RenewToken,
+ IsMoved: true,
+ })
+ if err == nil {
+ resp.RenewToken = secondResp.RenewToken
+ } else {
+ resp.Error = secondResp.Error
+ }
+ return err
+ })
+ }
if err != nil {
resp.Error = fmt.Sprintf("%v", err)
@@ -33,10 +49,27 @@ func (fs *FilerServer) Unlock(ctx context.Context, req *filer_pb.UnlockRequest)
resp = &filer_pb.UnlockResponse{}
- _, err = fs.filer.Dlm.Unlock(fs.option.Host, req.Name, req.LockToken)
+ var movedTo pb.ServerAddress
+ movedTo, err = fs.filer.Dlm.Unlock(fs.option.Host, req.Name, req.RenewToken)
+
+ if !req.IsMoved && movedTo != "" {
+ err = pb.WithFilerClient(false, 0, movedTo, fs.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error {
+ secondResp, err := client.Unlock(context.Background(), &filer_pb.UnlockRequest{
+ Name: req.Name,
+ RenewToken: req.RenewToken,
+ IsMoved: true,
+ })
+ resp.Error = secondResp.Error
+ return err
+ })
+ }
+
if err != nil {
resp.Error = fmt.Sprintf("%v", err)
}
+ if movedTo != "" {
+ resp.MovedTo = string(movedTo)
+ }
return resp, nil