aboutsummaryrefslogtreecommitdiff
path: root/go/weed
diff options
context:
space:
mode:
authortnextday <fw2k4@163.com>2015-12-03 16:27:02 +0800
committertnextday <fw2k4@163.com>2015-12-03 16:27:02 +0800
commitdaac5de1bae20de28082367db44b7b7afa9e4aaf (patch)
tree77b9ca3beb5f33f736b5a66da8ecf4a53ed1e576 /go/weed
parenta9a336fdff076211e7c94a4243b430219e5d891c (diff)
downloadseaweedfs-daac5de1bae20de28082367db44b7b7afa9e4aaf.tar.xz
seaweedfs-daac5de1bae20de28082367db44b7b7afa9e4aaf.zip
more check in `http_util.Delete`
add status code in `DeleteResult` struct operation.DeleteFiles maybe unsafe, so `ChunkManifest.DeleteChunks` manually delete each chunks
Diffstat (limited to 'go/weed')
-rw-r--r--go/weed/weed_server/volume_server_handlers_write.go47
1 files changed, 39 insertions, 8 deletions
diff --git a/go/weed/weed_server/volume_server_handlers_write.go b/go/weed/weed_server/volume_server_handlers_write.go
index c891b5af7..cd4a4c673 100644
--- a/go/weed/weed_server/volume_server_handlers_write.go
+++ b/go/weed/weed_server/volume_server_handlers_write.go
@@ -63,19 +63,20 @@ func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) {
if n.Cookie != cookie {
glog.V(0).Infoln("delete", r.URL.Path, "with unmaching cookie from ", r.RemoteAddr, "agent", r.UserAgent())
+ writeJsonError(w, r, http.StatusBadRequest, errors.New("File Random Cookie does not match."))
return
}
count := int64(n.Size)
- if n.IsChunkedManifest(){
+ if n.IsChunkedManifest() {
chunkManifest, e := operation.LoadChunkManifest(n.Data, n.IsGzipped())
if e != nil {
- writeJsonError(w, r, http.StatusInternalServerError, errors.New("Load chunks manifest error: " + e.Error()))
+ writeJsonError(w, r, http.StatusInternalServerError, errors.New("Load chunks manifest error: "+e.Error()))
return
}
if e := chunkManifest.DeleteChunks(vs.GetMasterNode()); e != nil {
- writeJsonError(w, r, http.StatusInternalServerError, errors.New("Delete chunks error: " + e.Error()))
+ writeJsonError(w, r, http.StatusInternalServerError, errors.New("Delete chunks error: "+e.Error()))
return
}
count = chunkManifest.Size
@@ -100,7 +101,10 @@ func (vs *VolumeServer) batchDeleteHandler(w http.ResponseWriter, r *http.Reques
for _, fid := range r.Form["fid"] {
vid, id_cookie, err := operation.ParseFileId(fid)
if err != nil {
- ret = append(ret, operation.DeleteResult{Fid: fid, Error: err.Error()})
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusBadRequest,
+ Error: err.Error()})
continue
}
n := new(storage.Needle)
@@ -109,18 +113,45 @@ func (vs *VolumeServer) batchDeleteHandler(w http.ResponseWriter, r *http.Reques
glog.V(4).Infoln("batch deleting", n)
cookie := n.Cookie
if _, err := vs.store.ReadVolumeNeedle(volumeId, n); err != nil {
- ret = append(ret, operation.DeleteResult{Fid: fid, Error: err.Error()})
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusNotFound,
+ Error: err.Error(),
+ })
continue
}
+
+ if n.IsChunkedManifest() {
+ //Don't allow delete manifest in batch delete mode
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusNotAcceptable,
+ Error: "ChunkManifest: not allow.",
+ })
+ continue
+ }
+
if n.Cookie != cookie {
- ret = append(ret, operation.DeleteResult{Fid: fid, Error: "File Random Cookie does not match."})
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusBadRequest,
+ Error: "File Random Cookie does not match.",
+ })
glog.V(0).Infoln("deleting", fid, "with unmaching cookie from ", r.RemoteAddr, "agent", r.UserAgent())
return
}
if size, err := vs.store.Delete(volumeId, n); err != nil {
- ret = append(ret, operation.DeleteResult{Fid: fid, Error: err.Error()})
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusInternalServerError,
+ Error: err.Error()},
+ )
} else {
- ret = append(ret, operation.DeleteResult{Fid: fid, Size: int(size)})
+ ret = append(ret, operation.DeleteResult{
+ Fid: fid,
+ Status: http.StatusAccepted,
+ Size: int(size)},
+ )
}
}