aboutsummaryrefslogtreecommitdiff
path: root/go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2014-05-19 20:54:39 -0700
committerChris Lu <chris.lu@gmail.com>2014-05-19 20:54:39 -0700
commitfe3f06435e31d6d630cc6026b4a06df51667973e (patch)
tree11842c523558780d60cf153bc4183c765c8f6fdb /go
parente7aaa24da85eaf5637a2ff3e4bac4082c17d708c (diff)
downloadseaweedfs-fe3f06435e31d6d630cc6026b4a06df51667973e.tar.xz
seaweedfs-fe3f06435e31d6d630cc6026b4a06df51667973e.zip
Refactor out volume vacuum.
Diffstat (limited to 'go')
-rw-r--r--go/storage/volume.go38
-rw-r--r--go/storage/volume_vacuum.go40
2 files changed, 40 insertions, 38 deletions
diff --git a/go/storage/volume.go b/go/storage/volume.go
index bfdac8edf..937798649 100644
--- a/go/storage/volume.go
+++ b/go/storage/volume.go
@@ -346,44 +346,6 @@ func ScanVolumeFile(dirname string, collection string, id VolumeId,
return
}
-func (v *Volume) copyDataAndGenerateIndexFile(dstName, idxName string) (err error) {
- var (
- dst, idx *os.File
- )
- if dst, err = os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
- return
- }
- defer dst.Close()
-
- if idx, err = os.OpenFile(idxName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
- return
- }
- defer idx.Close()
-
- nm := NewNeedleMap(idx)
- new_offset := int64(SuperBlockSize)
-
- err = ScanVolumeFile(v.dir, v.Collection, v.Id, func(superBlock SuperBlock) error {
- _, err = dst.Write(superBlock.Bytes())
- return err
- }, func(n *Needle, offset int64) error {
- nv, ok := v.nm.Get(n.Id)
- glog.V(3).Infoln("needle expected offset ", offset, "ok", ok, "nv", nv)
- if ok && int64(nv.Offset)*NeedlePaddingSize == offset && nv.Size > 0 {
- if _, err = nm.Put(n.Id, uint32(new_offset/NeedlePaddingSize), n.Size); err != nil {
- return fmt.Errorf("cannot put needle: %s", err)
- }
- if _, err = n.Append(dst, v.Version()); err != nil {
- return fmt.Errorf("cannot append needle: %s", err)
- }
- new_offset += n.DiskSize()
- glog.V(3).Infoln("saving key", n.Id, "volume offset", offset, "=>", new_offset, "data_size", n.Size)
- }
- return nil
- })
-
- return
-}
func (v *Volume) ContentSize() uint64 {
return v.nm.ContentSize()
}
diff --git a/go/storage/volume_vacuum.go b/go/storage/volume_vacuum.go
index 8b36bb378..3aeb11e64 100644
--- a/go/storage/volume_vacuum.go
+++ b/go/storage/volume_vacuum.go
@@ -2,6 +2,7 @@ package storage
import (
"code.google.com/p/weed-fs/go/glog"
+ "fmt"
"os"
)
@@ -33,3 +34,42 @@ func (v *Volume) commitCompact() error {
}
return nil
}
+
+func (v *Volume) copyDataAndGenerateIndexFile(dstName, idxName string) (err error) {
+ var (
+ dst, idx *os.File
+ )
+ if dst, err = os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
+ return
+ }
+ defer dst.Close()
+
+ if idx, err = os.OpenFile(idxName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644); err != nil {
+ return
+ }
+ defer idx.Close()
+
+ nm := NewNeedleMap(idx)
+ new_offset := int64(SuperBlockSize)
+
+ err = ScanVolumeFile(v.dir, v.Collection, v.Id, func(superBlock SuperBlock) error {
+ _, err = dst.Write(superBlock.Bytes())
+ return err
+ }, func(n *Needle, offset int64) error {
+ nv, ok := v.nm.Get(n.Id)
+ glog.V(3).Infoln("needle expected offset ", offset, "ok", ok, "nv", nv)
+ if ok && int64(nv.Offset)*NeedlePaddingSize == offset && nv.Size > 0 {
+ if _, err = nm.Put(n.Id, uint32(new_offset/NeedlePaddingSize), n.Size); err != nil {
+ return fmt.Errorf("cannot put needle: %s", err)
+ }
+ if _, err = n.Append(dst, v.Version()); err != nil {
+ return fmt.Errorf("cannot append needle: %s", err)
+ }
+ new_offset += n.DiskSize()
+ glog.V(3).Infoln("saving key", n.Id, "volume offset", offset, "=>", new_offset, "data_size", n.Size)
+ }
+ return nil
+ })
+
+ return
+}