diff --git a/go/storage/volume.go b/go/storage/volume.go index 937798649..7bd8e7467 100644 --- a/go/storage/volume.go +++ b/go/storage/volume.go @@ -309,6 +309,7 @@ func (v *Volume) freeze() error { func ScanVolumeFile(dirname string, collection string, id VolumeId, visitSuperBlock func(SuperBlock) error, + readNeedleBody bool, visitNeedle func(n *Needle, offset int64) error) (err error) { var v *Volume if v, err = loadVolumeWithoutIndex(dirname, collection, id); err != nil { @@ -327,9 +328,11 @@ func ScanVolumeFile(dirname string, collection string, id VolumeId, return } for n != nil { - if err = n.ReadNeedleBody(v.dataFile, version, offset+int64(NeedleHeaderSize), rest); err != nil { - err = fmt.Errorf("cannot read needle body: %s", err) - return + if readNeedleBody { + if err = n.ReadNeedleBody(v.dataFile, version, offset+int64(NeedleHeaderSize), rest); err != nil { + err = fmt.Errorf("cannot read needle body: %s", err) + return + } } if err = visitNeedle(n, offset); err != nil { return diff --git a/go/storage/volume_vacuum.go b/go/storage/volume_vacuum.go index 9ccf9f588..7d2a38cb8 100644 --- a/go/storage/volume_vacuum.go +++ b/go/storage/volume_vacuum.go @@ -62,7 +62,7 @@ func (v *Volume) copyDataAndGenerateIndexFile(dstName, idxName string) (err erro 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 { + }, true, func(n *Needle, offset int64) error { nv, ok := v.nm.Get(n.Id) glog.V(4).Infoln("needle expected offset ", offset, "ok", ok, "nv", nv) if ok && int64(nv.Offset)*NeedlePaddingSize == offset && nv.Size > 0 { diff --git a/go/weed/export.go b/go/weed/export.go index dae6053c7..3f8ff85bb 100644 --- a/go/weed/export.go +++ b/go/weed/export.go @@ -102,7 +102,7 @@ func runExport(cmd *Command, args []string) bool { err = storage.ScanVolumeFile(*exportVolumePath, *exportCollection, vid, func(superBlock storage.SuperBlock) error { version = superBlock.Version return nil - }, func(n *storage.Needle, offset int64) error { + }, true, func(n *storage.Needle, offset int64) error { nv, ok := nm.Get(n.Id) glog.V(3).Infoln("key", n.Id, "offset", offset, "size", n.Size, "disk_size", n.DiskSize(), "gzip", n.IsGzipped(), "ok", ok, "nv", nv) if ok && nv.Size > 0 { diff --git a/go/weed/fix.go b/go/weed/fix.go index 3c09727c1..02147d796 100644 --- a/go/weed/fix.go +++ b/go/weed/fix.go @@ -49,7 +49,7 @@ func runFix(cmd *Command, args []string) bool { vid := storage.VolumeId(*fixVolumeId) err = storage.ScanVolumeFile(*fixVolumePath, *fixVolumeCollection, vid, func(superBlock storage.SuperBlock) error { return nil - }, func(n *storage.Needle, offset int64) error { + }, false, func(n *storage.Needle, offset int64) error { debug("key", n.Id, "offset", offset, "size", n.Size, "disk_size", n.DiskSize(), "gzip", n.IsGzipped()) if n.Size > 0 { count, pe := nm.Put(n.Id, uint32(offset/storage.NeedlePaddingSize), n.Size)