aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/volume_read_write.go
diff options
context:
space:
mode:
authorbingoohuang <bingoo.huang@gmail.com>2019-01-16 17:48:59 +0800
committerbingoohuang <bingoo.huang@gmail.com>2019-01-16 17:48:59 +0800
commit6ddfaf33cba953b92a5e3383a15bf26ab1845dbc (patch)
tree5e98a7f62939582459b52c0ff02b956bddbd9587 /weed/storage/volume_read_write.go
parent27093bc2e5cf3d61149e5eda14b98b1e527e5a28 (diff)
downloadseaweedfs-6ddfaf33cba953b92a5e3383a15bf26ab1845dbc.tar.xz
seaweedfs-6ddfaf33cba953b92a5e3383a15bf26ab1845dbc.zip
extract VolumeFileScanner for ScanVolumeFile
Diffstat (limited to 'weed/storage/volume_read_write.go')
-rw-r--r--weed/storage/volume_read_write.go16
1 files changed, 10 insertions, 6 deletions
diff --git a/weed/storage/volume_read_write.go b/weed/storage/volume_read_write.go
index 66f90634f..ed9729c84 100644
--- a/weed/storage/volume_read_write.go
+++ b/weed/storage/volume_read_write.go
@@ -169,16 +169,20 @@ func (v *Volume) readNeedle(n *Needle) (int, error) {
return -1, ErrorNotFound
}
+type VolumeFileScanner interface {
+ VisitSuperBlock(SuperBlock) error
+ ReadNeedleBody() bool
+ VisitNeedle(n *Needle, offset int64) error
+}
+
func ScanVolumeFile(dirname string, collection string, id VolumeId,
needleMapKind NeedleMapType,
- visitSuperBlock func(SuperBlock) error,
- readNeedleBody bool,
- visitNeedle func(n *Needle, offset int64) error) (err error) {
+ volumeFileScanner VolumeFileScanner) (err error) {
var v *Volume
if v, err = loadVolumeWithoutIndex(dirname, collection, id, needleMapKind); err != nil {
return fmt.Errorf("Failed to load volume %d: %v", id, err)
}
- if err = visitSuperBlock(v.SuperBlock); err != nil {
+ if err = volumeFileScanner.VisitSuperBlock(v.SuperBlock); err != nil {
return fmt.Errorf("Failed to process volume %d super block: %v", id, err)
}
defer v.Close()
@@ -192,14 +196,14 @@ func ScanVolumeFile(dirname string, collection string, id VolumeId,
return
}
for n != nil {
- if readNeedleBody {
+ if volumeFileScanner.ReadNeedleBody() {
if err = n.ReadNeedleBody(v.dataFile, version, offset+NeedleEntrySize, rest); err != nil {
glog.V(0).Infof("cannot read needle body: %v", err)
//err = fmt.Errorf("cannot read needle body: %v", err)
//return
}
}
- err = visitNeedle(n, offset)
+ err = volumeFileScanner.VisitNeedle(n, offset)
if err == io.EOF {
return nil
}