aboutsummaryrefslogtreecommitdiff
path: root/weed-fs/src/cmd
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2012-11-07 01:51:43 -0800
committerChris Lu <chris.lu@gmail.com>2012-11-07 01:51:43 -0800
commit86c8f248bde7efd37740ede31d4041f8d13897ba (patch)
tree78abfc57d5684e357084cd1434a74ebf07c7d08d /weed-fs/src/cmd
parent963082557600373230a32d0247fb29d746aface4 (diff)
downloadseaweedfs-86c8f248bde7efd37740ede31d4041f8d13897ba.tar.xz
seaweedfs-86c8f248bde7efd37740ede31d4041f8d13897ba.zip
support compacting a volume
Diffstat (limited to 'weed-fs/src/cmd')
-rw-r--r--weed-fs/src/cmd/weed/fix.go10
-rw-r--r--weed-fs/src/cmd/weed/master.go21
-rw-r--r--weed-fs/src/cmd/weed/version.go2
-rw-r--r--weed-fs/src/cmd/weed/volume.go28
4 files changed, 52 insertions, 9 deletions
diff --git a/weed-fs/src/cmd/weed/fix.go b/weed-fs/src/cmd/weed/fix.go
index acf2d6643..e75bfa2f6 100644
--- a/weed-fs/src/cmd/weed/fix.go
+++ b/weed-fs/src/cmd/weed/fix.go
@@ -47,17 +47,19 @@ func runFix(cmd *Command, args []string) bool {
//skip the volume super block
dataFile.Seek(storage.SuperBlockSize, 0)
- n, length := storage.ReadNeedle(dataFile)
+ n, rest := storage.ReadNeedle(dataFile)
+ dataFile.Seek(int64(rest), 1)
nm := storage.NewNeedleMap(indexFile)
offset := uint32(storage.SuperBlockSize)
for n != nil {
- debug("key", n.Id, "volume offset", offset, "data_size", n.Size, "length", length)
+ debug("key", n.Id, "volume offset", offset, "data_size", n.Size, "rest", rest)
if n.Size > 0 {
count, pe := nm.Put(n.Id, offset/8, n.Size)
debug("saved", count, "with error", pe)
}
- offset += length
- n, length = storage.ReadNeedle(dataFile)
+ offset += rest+16
+ n, rest = storage.ReadNeedle(dataFile)
+ dataFile.Seek(int64(rest), 1)
}
return true
}
diff --git a/weed-fs/src/cmd/weed/master.go b/weed-fs/src/cmd/weed/master.go
index 759e5fdc9..b2b114a35 100644
--- a/weed-fs/src/cmd/weed/master.go
+++ b/weed-fs/src/cmd/weed/master.go
@@ -122,6 +122,27 @@ func dirStatusHandler(w http.ResponseWriter, r *http.Request) {
writeJson(w, r, m)
}
+func volumeVacuumHandler(w http.ResponseWriter, r *http.Request) {
+ count := 0
+ rt, err := storage.NewReplicationTypeFromString(r.FormValue("replication"))
+ if err == nil {
+ if count, err = strconv.Atoi(r.FormValue("count")); err == nil {
+ if topo.FreeSpace() < count*rt.GetCopyCount() {
+ err = errors.New("Only " + strconv.Itoa(topo.FreeSpace()) + " volumes left! Not enough for " + strconv.Itoa(count*rt.GetCopyCount()))
+ } else {
+ count, err = vg.GrowByCountAndType(count, rt, topo)
+ }
+ }
+ }
+ if err != nil {
+ w.WriteHeader(http.StatusNotAcceptable)
+ writeJson(w, r, map[string]string{"error": err.Error()})
+ } else {
+ w.WriteHeader(http.StatusNotAcceptable)
+ writeJson(w, r, map[string]interface{}{"count": count})
+ }
+}
+
func volumeGrowHandler(w http.ResponseWriter, r *http.Request) {
count := 0
rt, err := storage.NewReplicationTypeFromString(r.FormValue("replication"))
diff --git a/weed-fs/src/cmd/weed/version.go b/weed-fs/src/cmd/weed/version.go
index aa2396b11..f63b5bd70 100644
--- a/weed-fs/src/cmd/weed/version.go
+++ b/weed-fs/src/cmd/weed/version.go
@@ -6,7 +6,7 @@ import (
)
const (
- VERSION = "0.23"
+ VERSION = "0.24"
)
var cmdVersion = &Command{
diff --git a/weed-fs/src/cmd/weed/volume.go b/weed-fs/src/cmd/weed/volume.go
index 259dbfded..9e6f3e9ac 100644
--- a/weed-fs/src/cmd/weed/volume.go
+++ b/weed-fs/src/cmd/weed/volume.go
@@ -55,7 +55,25 @@ func assignVolumeHandler(w http.ResponseWriter, r *http.Request) {
} else {
writeJson(w, r, map[string]string{"error": err.Error()})
}
- debug("volume =", r.FormValue("volume"), ", replicationType =", r.FormValue("replicationType"), ", error =", err)
+ debug("assign volume =", r.FormValue("volume"), ", replicationType =", r.FormValue("replicationType"), ", error =", err)
+}
+func vacuumVolumeCompactHandler(w http.ResponseWriter, r *http.Request) {
+ err := store.CompactVolume(r.FormValue("volume"))
+ if err == nil {
+ writeJson(w, r, map[string]string{"error": ""})
+ } else {
+ writeJson(w, r, map[string]string{"error": err.Error()})
+ }
+ debug("compacted volume =", r.FormValue("volume"), ", error =", err)
+}
+func vacuumVolumeCommitHandler(w http.ResponseWriter, r *http.Request) {
+ count, err := store.CommitCompactVolume(r.FormValue("volume"))
+ if err == nil {
+ writeJson(w, r, map[string]interface{}{"error": "", "size":count})
+ } else {
+ writeJson(w, r, map[string]string{"error": err.Error()})
+ }
+ debug("commit compact volume =", r.FormValue("volume"), ", error =", err)
}
func storeHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
@@ -250,9 +268,9 @@ func distributedOperation(volumeId storage.VolumeId, op func(location operation.
}
func runVolume(cmd *Command, args []string) bool {
- if *vMaxCpu < 1 {
- *vMaxCpu = runtime.NumCPU()
- }
+ if *vMaxCpu < 1 {
+ *vMaxCpu = runtime.NumCPU()
+ }
runtime.GOMAXPROCS(*vMaxCpu)
fileInfo, err := os.Stat(*volumeFolder)
if err != nil {
@@ -273,6 +291,8 @@ func runVolume(cmd *Command, args []string) bool {
http.HandleFunc("/", storeHandler)
http.HandleFunc("/status", statusHandler)
http.HandleFunc("/admin/assign_volume", assignVolumeHandler)
+ http.HandleFunc("/admin/vacuum_volume_compact", vacuumVolumeCompactHandler)
+ http.HandleFunc("/admin/vacuum_volume_commit", vacuumVolumeCommitHandler)
go func() {
for {