1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 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/needle"
- "github.com/chrislusf/seaweedfs/weed/storage/types"
- )
- 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(needle.Needle)
- volumeId, _ := needle.NewVolumeId(vid)
- if req.SkipCookieCheck {
- n.Id, err = types.ParseNeedleId(id_cookie)
- if err != nil {
- resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{
- FileId: fid,
- Status: http.StatusBadRequest,
- Error: err.Error()})
- continue
- }
- } else {
- n.ParsePath(id_cookie)
- cookie := n.Cookie
- if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil); err != nil {
- resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{
- FileId: fid,
- Status: http.StatusNotFound,
- Error: err.Error(),
- })
- 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
- }
- }
- 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
- }
- n.LastModified = now
- if size, err := vs.store.DeleteVolumeNeedle(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: uint32(size)},
- )
- }
- }
- return resp, nil
- }
|