diff --git a/go/weed/weed_server/volume_server_handlers.go b/go/weed/weed_server/volume_server_handlers.go index 36ed204ac..4f8c7d562 100644 --- a/go/weed/weed_server/volume_server_handlers.go +++ b/go/weed/weed_server/volume_server_handlers.go @@ -6,10 +6,8 @@ import ( "code.google.com/p/weed-fs/go/stats" "code.google.com/p/weed-fs/go/storage" "code.google.com/p/weed-fs/go/topology" - "code.google.com/p/weed-fs/go/util" "mime" "net/http" - "path/filepath" "strconv" "strings" "time" @@ -17,75 +15,6 @@ import ( var fileNameEscaper = strings.NewReplacer("\\", "\\\\", "\"", "\\\"") -func (vs *VolumeServer) statusHandler(w http.ResponseWriter, r *http.Request) { - m := make(map[string]interface{}) - m["Version"] = util.VERSION - m["Volumes"] = vs.store.Status() - writeJsonQuiet(w, r, m) -} -func (vs *VolumeServer) assignVolumeHandler(w http.ResponseWriter, r *http.Request) { - err := vs.store.AddVolume(r.FormValue("volume"), r.FormValue("collection"), r.FormValue("replication")) - if err == nil { - writeJsonQuiet(w, r, map[string]string{"error": ""}) - } else { - writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) - } - glog.V(2).Infoln("assign volume =", r.FormValue("volume"), ", collection =", r.FormValue("collection"), ", replication =", r.FormValue("replication"), ", error =", err) -} -func (vs *VolumeServer) deleteCollectionHandler(w http.ResponseWriter, r *http.Request) { - if "benchmark" != r.FormValue("collection") { - glog.V(0).Infoln("deleting collection =", r.FormValue("collection"), "!!!") - return - } - err := vs.store.DeleteCollection(r.FormValue("collection")) - if err == nil { - writeJsonQuiet(w, r, map[string]string{"error": ""}) - } else { - writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) - } - glog.V(2).Infoln("deleting collection =", r.FormValue("collection"), ", error =", err) -} -func (vs *VolumeServer) vacuumVolumeCheckHandler(w http.ResponseWriter, r *http.Request) { - err, ret := vs.store.CheckCompactVolume(r.FormValue("volume"), r.FormValue("garbageThreshold")) - if err == nil { - writeJsonQuiet(w, r, map[string]interface{}{"error": "", "result": ret}) - } else { - writeJsonQuiet(w, r, map[string]interface{}{"error": err.Error(), "result": false}) - } - glog.V(2).Infoln("checked compacting volume =", r.FormValue("volume"), "garbageThreshold =", r.FormValue("garbageThreshold"), "vacuum =", ret) -} -func (vs *VolumeServer) vacuumVolumeCompactHandler(w http.ResponseWriter, r *http.Request) { - err := vs.store.CompactVolume(r.FormValue("volume")) - if err == nil { - writeJsonQuiet(w, r, map[string]string{"error": ""}) - } else { - writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) - } - glog.V(2).Infoln("compacted volume =", r.FormValue("volume"), ", error =", err) -} -func (vs *VolumeServer) vacuumVolumeCommitHandler(w http.ResponseWriter, r *http.Request) { - err := vs.store.CommitCompactVolume(r.FormValue("volume")) - if err == nil { - writeJsonQuiet(w, r, map[string]interface{}{"error": ""}) - } else { - writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) - } - glog.V(2).Infoln("commit compact volume =", r.FormValue("volume"), ", error =", err) -} -func (vs *VolumeServer) freezeVolumeHandler(w http.ResponseWriter, r *http.Request) { - //TODO: notify master that this volume will be read-only - err := vs.store.FreezeVolume(r.FormValue("volume")) - if err == nil { - writeJsonQuiet(w, r, map[string]interface{}{"error": ""}) - } else { - writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) - } - glog.V(2).Infoln("freeze volume =", r.FormValue("volume"), ", error =", err) -} -func (vs *VolumeServer) submitFromVolumeServerHandler(w http.ResponseWriter, r *http.Request) { - submitForClientHandler(w, r, vs.masterNode) -} - func (vs *VolumeServer) storeHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": @@ -105,6 +34,7 @@ func (vs *VolumeServer) storeHandler(w http.ResponseWriter, r *http.Request) { secure(vs.whiteList, vs.PostHandler)(w, r) } } + func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, isGetMethod bool) { n := new(storage.Needle) vid, fid, filename, ext, _ := parseURLPath(r.URL.Path) @@ -195,6 +125,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } } } + func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { m := make(map[string]interface{}) if e := r.ParseForm(); e != nil { @@ -227,6 +158,7 @@ func (vs *VolumeServer) PostHandler(w http.ResponseWriter, r *http.Request) { m["size"] = ret writeJsonQuiet(w, r, m) } + func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { n := new(storage.Needle) vid, fid, _, _, _ := parseURLPath(r.URL.Path) @@ -263,16 +195,3 @@ func (vs *VolumeServer) DeleteHandler(w http.ResponseWriter, r *http.Request) { m["size"] = uint32(count) writeJsonQuiet(w, r, m) } - -func (vs *VolumeServer) statsDiskHandler(w http.ResponseWriter, r *http.Request) { - m := make(map[string]interface{}) - m["Version"] = util.VERSION - ds := make([]*stats.DiskStatus, 0) - for _, loc := range vs.store.Locations { - if dir, e := filepath.Abs(loc.Directory); e == nil { - ds = append(ds, stats.NewDiskStatus(dir)) - } - } - m["DiskStatues"] = ds - writeJsonQuiet(w, r, m) -} diff --git a/go/weed/weed_server/volume_server_handlers_admin.go b/go/weed/weed_server/volume_server_handlers_admin.go new file mode 100644 index 000000000..5921a3b96 --- /dev/null +++ b/go/weed/weed_server/volume_server_handlers_admin.go @@ -0,0 +1,68 @@ +package weed_server + +import ( + "code.google.com/p/weed-fs/go/glog" + "code.google.com/p/weed-fs/go/stats" + "code.google.com/p/weed-fs/go/util" + "net/http" + "path/filepath" +) + +func (vs *VolumeServer) statusHandler(w http.ResponseWriter, r *http.Request) { + m := make(map[string]interface{}) + m["Version"] = util.VERSION + m["Volumes"] = vs.store.Status() + writeJsonQuiet(w, r, m) +} + +func (vs *VolumeServer) assignVolumeHandler(w http.ResponseWriter, r *http.Request) { + err := vs.store.AddVolume(r.FormValue("volume"), r.FormValue("collection"), r.FormValue("replication")) + if err == nil { + writeJsonQuiet(w, r, map[string]string{"error": ""}) + } else { + writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) + } + glog.V(2).Infoln("assign volume =", r.FormValue("volume"), ", collection =", r.FormValue("collection"), ", replication =", r.FormValue("replication"), ", error =", err) +} + +func (vs *VolumeServer) deleteCollectionHandler(w http.ResponseWriter, r *http.Request) { + if "benchmark" != r.FormValue("collection") { + glog.V(0).Infoln("deleting collection =", r.FormValue("collection"), "!!!") + return + } + err := vs.store.DeleteCollection(r.FormValue("collection")) + if err == nil { + writeJsonQuiet(w, r, map[string]string{"error": ""}) + } else { + writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) + } + glog.V(2).Infoln("deleting collection =", r.FormValue("collection"), ", error =", err) +} + +func (vs *VolumeServer) freezeVolumeHandler(w http.ResponseWriter, r *http.Request) { + //TODO: notify master that this volume will be read-only + err := vs.store.FreezeVolume(r.FormValue("volume")) + if err == nil { + writeJsonQuiet(w, r, map[string]interface{}{"error": ""}) + } else { + writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) + } + glog.V(2).Infoln("freeze volume =", r.FormValue("volume"), ", error =", err) +} + +func (vs *VolumeServer) submitFromVolumeServerHandler(w http.ResponseWriter, r *http.Request) { + submitForClientHandler(w, r, vs.masterNode) +} + +func (vs *VolumeServer) statsDiskHandler(w http.ResponseWriter, r *http.Request) { + m := make(map[string]interface{}) + m["Version"] = util.VERSION + ds := make([]*stats.DiskStatus, 0) + for _, loc := range vs.store.Locations { + if dir, e := filepath.Abs(loc.Directory); e == nil { + ds = append(ds, stats.NewDiskStatus(dir)) + } + } + m["DiskStatues"] = ds + writeJsonQuiet(w, r, m) +} diff --git a/go/weed/weed_server/volume_server_handlers_vacuum.go b/go/weed/weed_server/volume_server_handlers_vacuum.go new file mode 100644 index 000000000..60a5e9742 --- /dev/null +++ b/go/weed/weed_server/volume_server_handlers_vacuum.go @@ -0,0 +1,34 @@ +package weed_server + +import ( + "code.google.com/p/weed-fs/go/glog" + "net/http" +) + +func (vs *VolumeServer) vacuumVolumeCheckHandler(w http.ResponseWriter, r *http.Request) { + err, ret := vs.store.CheckCompactVolume(r.FormValue("volume"), r.FormValue("garbageThreshold")) + if err == nil { + writeJsonQuiet(w, r, map[string]interface{}{"error": "", "result": ret}) + } else { + writeJsonQuiet(w, r, map[string]interface{}{"error": err.Error(), "result": false}) + } + glog.V(2).Infoln("checked compacting volume =", r.FormValue("volume"), "garbageThreshold =", r.FormValue("garbageThreshold"), "vacuum =", ret) +} +func (vs *VolumeServer) vacuumVolumeCompactHandler(w http.ResponseWriter, r *http.Request) { + err := vs.store.CompactVolume(r.FormValue("volume")) + if err == nil { + writeJsonQuiet(w, r, map[string]string{"error": ""}) + } else { + writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) + } + glog.V(2).Infoln("compacted volume =", r.FormValue("volume"), ", error =", err) +} +func (vs *VolumeServer) vacuumVolumeCommitHandler(w http.ResponseWriter, r *http.Request) { + err := vs.store.CommitCompactVolume(r.FormValue("volume")) + if err == nil { + writeJsonQuiet(w, r, map[string]interface{}{"error": ""}) + } else { + writeJsonQuiet(w, r, map[string]string{"error": err.Error()}) + } + glog.V(2).Infoln("commit compact volume =", r.FormValue("volume"), ", error =", err) +}