|
|
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
}
|