mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
Delete volumes online without restarting volume server
This commit is contained in:
parent
492f93416d
commit
e074a54a20
|
@ -60,6 +60,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string,
|
||||||
adminMux.HandleFunc("/admin/sync/data", vs.guard.WhiteList(vs.getVolumeDataContentHandler))
|
adminMux.HandleFunc("/admin/sync/data", vs.guard.WhiteList(vs.getVolumeDataContentHandler))
|
||||||
adminMux.HandleFunc("/admin/volume/mount", vs.guard.WhiteList(vs.getVolumeMountHandler))
|
adminMux.HandleFunc("/admin/volume/mount", vs.guard.WhiteList(vs.getVolumeMountHandler))
|
||||||
adminMux.HandleFunc("/admin/volume/unmount", vs.guard.WhiteList(vs.getVolumeUnmountHandler))
|
adminMux.HandleFunc("/admin/volume/unmount", vs.guard.WhiteList(vs.getVolumeUnmountHandler))
|
||||||
|
adminMux.HandleFunc("/admin/volume/delete", vs.guard.WhiteList(vs.getVolumeDeleteHandler))
|
||||||
adminMux.HandleFunc("/stats/counter", vs.guard.WhiteList(statsCounterHandler))
|
adminMux.HandleFunc("/stats/counter", vs.guard.WhiteList(statsCounterHandler))
|
||||||
adminMux.HandleFunc("/stats/memory", vs.guard.WhiteList(statsMemoryHandler))
|
adminMux.HandleFunc("/stats/memory", vs.guard.WhiteList(statsMemoryHandler))
|
||||||
adminMux.HandleFunc("/stats/disk", vs.guard.WhiteList(vs.statsDiskHandler))
|
adminMux.HandleFunc("/stats/disk", vs.guard.WhiteList(vs.statsDiskHandler))
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package weed_server
|
package weed_server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -8,6 +9,7 @@ import (
|
||||||
"github.com/chrislusf/seaweedfs/weed/glog"
|
"github.com/chrislusf/seaweedfs/weed/glog"
|
||||||
"github.com/chrislusf/seaweedfs/weed/stats"
|
"github.com/chrislusf/seaweedfs/weed/stats"
|
||||||
"github.com/chrislusf/seaweedfs/weed/util"
|
"github.com/chrislusf/seaweedfs/weed/util"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (vs *VolumeServer) statusHandler(w http.ResponseWriter, r *http.Request) {
|
func (vs *VolumeServer) statusHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -65,3 +67,45 @@ func (vs *VolumeServer) statsDiskHandler(w http.ResponseWriter, r *http.Request)
|
||||||
m["DiskStatuses"] = ds
|
m["DiskStatuses"] = ds
|
||||||
writeJsonQuiet(w, r, http.StatusOK, m)
|
writeJsonQuiet(w, r, http.StatusOK, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (vs *VolumeServer) getVolume(volumeParameterName string, r *http.Request) (*storage.Volume, error) {
|
||||||
|
vid, err := vs.getVolumeId(volumeParameterName, r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
v := vs.store.GetVolume(vid)
|
||||||
|
if v == nil {
|
||||||
|
return nil, fmt.Errorf("Not Found Volume Id %d", vid)
|
||||||
|
}
|
||||||
|
return v, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vs *VolumeServer) getVolumeMountHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vid, err := vs.getVolumeId("volume", r)
|
||||||
|
if err != nil {
|
||||||
|
writeJsonError(w, r, http.StatusNotFound, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
vs.store.MountVolume(vid)
|
||||||
|
writeJsonQuiet(w, r, http.StatusOK, "Volume mounted")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vs *VolumeServer) getVolumeUnmountHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vid, err := vs.getVolumeId("volume", r)
|
||||||
|
if err != nil {
|
||||||
|
writeJsonError(w, r, http.StatusNotFound, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
vs.store.UnmountVolume(vid)
|
||||||
|
writeJsonQuiet(w, r, http.StatusOK, "Volume unmounted")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vs *VolumeServer) getVolumeDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vid, err := vs.getVolumeId("volume", r)
|
||||||
|
if err != nil {
|
||||||
|
writeJsonError(w, r, http.StatusNotFound, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
vs.store.DeleteVolume(vid)
|
||||||
|
writeJsonQuiet(w, r, http.StatusOK, "Volume deleted")
|
||||||
|
}
|
||||||
|
|
|
@ -84,35 +84,3 @@ func (vs *VolumeServer) getVolumeId(volumeParameterName string, r *http.Request)
|
||||||
|
|
||||||
return vid, err
|
return vid, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vs *VolumeServer) getVolume(volumeParameterName string, r *http.Request) (*storage.Volume, error) {
|
|
||||||
vid, err := vs.getVolumeId(volumeParameterName, r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
v := vs.store.GetVolume(vid)
|
|
||||||
if v == nil {
|
|
||||||
return nil, fmt.Errorf("Not Found Volume Id %d", vid)
|
|
||||||
}
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vs *VolumeServer) getVolumeMountHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
vid, err := vs.getVolumeId("volume", r)
|
|
||||||
if err != nil {
|
|
||||||
writeJsonError(w, r, http.StatusNotFound, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vs.store.MountVolume(vid)
|
|
||||||
writeJsonQuiet(w, r, http.StatusOK, "Volume mounted")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vs *VolumeServer) getVolumeUnmountHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
vid, err := vs.getVolumeId("volume", r)
|
|
||||||
if err != nil {
|
|
||||||
writeJsonError(w, r, http.StatusNotFound, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vs.store.UnmountVolume(vid)
|
|
||||||
writeJsonQuiet(w, r, http.StatusOK, "Volume unmounted")
|
|
||||||
}
|
|
||||||
|
|
|
@ -152,7 +152,15 @@ func (l *DiskLocation) LoadVolume(vid VolumeId, needleMapKind NeedleMapType) boo
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *DiskLocation) UnloadVolume(vid VolumeId) (e error) {
|
func (l *DiskLocation) DeleteVolume(vid VolumeId) (error) {
|
||||||
|
_, ok := l.volumes[vid]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("Volume not found, VolumeId: %d", vid)
|
||||||
|
}
|
||||||
|
return l.deleteVolumeById(vid)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *DiskLocation) UnloadVolume(vid VolumeId) (error) {
|
||||||
_, ok := l.volumes[vid]
|
_, ok := l.volumes[vid]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Volume not loaded, VolumeId: %d", vid)
|
return fmt.Errorf("Volume not loaded, VolumeId: %d", vid)
|
||||||
|
|
|
@ -338,3 +338,13 @@ func (s *Store) UnmountVolume(i VolumeId) error {
|
||||||
return fmt.Errorf("Volume %d not found on disk", i)
|
return fmt.Errorf("Volume %d not found on disk", i)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Store) DeleteVolume(i VolumeId) error {
|
||||||
|
for _, location := range s.Locations {
|
||||||
|
if error := location.deleteVolumeById(i); error == nil {
|
||||||
|
s.updateMaster()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("Volume %d not found on disk", i)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue