diff options
Diffstat (limited to 'weed/server/volume_grpc_server.go')
| -rw-r--r-- | weed/server/volume_grpc_server.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/weed/server/volume_grpc_server.go b/weed/server/volume_grpc_server.go new file mode 100644 index 000000000..3554d97ae --- /dev/null +++ b/weed/server/volume_grpc_server.go @@ -0,0 +1,78 @@ +package weed_server + +import ( + "context" + "net/http" + "time" + + "github.com/chrislusf/seaweedfs/weed/operation" + "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb" + "github.com/chrislusf/seaweedfs/weed/storage" +) + +func (vs *VolumeServer) BatchDelete(ctx context.Context, req *volume_server_pb.BatchDeleteRequest) (*volume_server_pb.BatchDeleteResponse, error) { + + resp := &volume_server_pb.BatchDeleteResponse{} + + now := uint64(time.Now().Unix()) + + for _, fid := range req.FileIds { + vid, id_cookie, err := operation.ParseFileId(fid) + if err != nil { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusBadRequest, + Error: err.Error()}) + continue + } + + n := new(storage.Needle) + volumeId, _ := storage.NewVolumeId(vid) + n.ParsePath(id_cookie) + + cookie := n.Cookie + if _, err := vs.store.ReadVolumeNeedle(volumeId, n); err != nil { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusNotFound, + Error: err.Error(), + }) + continue + } + + if n.IsChunkedManifest() { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusNotAcceptable, + Error: "ChunkManifest: not allowed in batch delete mode.", + }) + continue + } + + if n.Cookie != cookie { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusBadRequest, + Error: "File Random Cookie does not match.", + }) + break + } + n.LastModified = now + if size, err := vs.store.Delete(volumeId, n); err != nil { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusInternalServerError, + Error: err.Error()}, + ) + } else { + resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ + FileId: fid, + Status: http.StatusAccepted, + Size: size}, + ) + } + } + + return resp, nil + +} |
