diff options
| author | bingoohuang <bingoo.huang@gmail.com> | 2019-01-16 17:48:59 +0800 |
|---|---|---|
| committer | bingoohuang <bingoo.huang@gmail.com> | 2019-01-16 17:48:59 +0800 |
| commit | 6ddfaf33cba953b92a5e3383a15bf26ab1845dbc (patch) | |
| tree | 5e98a7f62939582459b52c0ff02b956bddbd9587 /weed/command/fix.go | |
| parent | 27093bc2e5cf3d61149e5eda14b98b1e527e5a28 (diff) | |
| download | seaweedfs-6ddfaf33cba953b92a5e3383a15bf26ab1845dbc.tar.xz seaweedfs-6ddfaf33cba953b92a5e3383a15bf26ab1845dbc.zip | |
extract VolumeFileScanner for ScanVolumeFile
Diffstat (limited to 'weed/command/fix.go')
| -rw-r--r-- | weed/command/fix.go | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/weed/command/fix.go b/weed/command/fix.go index 3643c9d58..a800978c6 100644 --- a/weed/command/fix.go +++ b/weed/command/fix.go @@ -28,6 +28,32 @@ var ( fixVolumeId = cmdFix.Flag.Int("volumeId", -1, "a volume id. The volume should already exist in the dir. The volume index file should not exist.") ) +type VolumeFileScanner4Fix struct { + version storage.Version + nm *storage.NeedleMap +} + +func (scanner *VolumeFileScanner4Fix) VisitSuperBlock(superBlock storage.SuperBlock) error { + scanner.version = superBlock.Version() + return nil + +} +func (scanner *VolumeFileScanner4Fix) ReadNeedleBody() bool { + return false +} + +func (scanner *VolumeFileScanner4Fix) VisitNeedle(n *storage.Needle, offset int64) error { + glog.V(2).Infof("key %d offset %d size %d disk_size %d gzip %v", n.Id, offset, n.Size, n.DiskSize(scanner.version), n.IsGzipped()) + if n.Size > 0 { + pe := scanner.nm.Put(n.Id, types.Offset(offset/types.NeedlePaddingSize), n.Size) + glog.V(2).Infof("saved %d with error %v", n.Size, pe) + } else { + glog.V(2).Infof("skipping deleted file ...") + return scanner.nm.Delete(n.Id, types.Offset(offset/types.NeedlePaddingSize)) + } + return nil +} + func runFix(cmd *Command, args []string) bool { if *fixVolumeId == -1 { @@ -48,24 +74,12 @@ func runFix(cmd *Command, args []string) bool { nm := storage.NewBtreeNeedleMap(indexFile) defer nm.Close() - var version storage.Version vid := storage.VolumeId(*fixVolumeId) - err = storage.ScanVolumeFile(*fixVolumePath, *fixVolumeCollection, vid, - storage.NeedleMapInMemory, - func(superBlock storage.SuperBlock) error { - version = superBlock.Version() - return nil - }, false, func(n *storage.Needle, offset int64) error { - glog.V(2).Infof("key %d offset %d size %d disk_size %d gzip %v", n.Id, offset, n.Size, n.DiskSize(version), n.IsGzipped()) - if n.Size > 0 { - pe := nm.Put(n.Id, types.Offset(offset/types.NeedlePaddingSize), n.Size) - glog.V(2).Infof("saved %d with error %v", n.Size, pe) - } else { - glog.V(2).Infof("skipping deleted file ...") - return nm.Delete(n.Id, types.Offset(offset/types.NeedlePaddingSize)) - } - return nil - }) + scanner := &VolumeFileScanner4Fix{ + nm: nm, + } + + err = storage.ScanVolumeFile(*fixVolumePath, *fixVolumeCollection, vid, storage.NeedleMapInMemory, scanner) if err != nil { glog.Fatalf("Export Volume File [ERROR] %s\n", err) os.Remove(indexFileName) |
