mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
4c85da7844
This is useful for doing backups on the data so we can accurately store the last modified time, the compression state, and verify the crc. Previously we were doing VolumeNeedleStatus and then an HTTP request which needlessly read from the dat file twice.
46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
package storage
|
|
|
|
import (
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/storage/needle"
|
|
"github.com/seaweedfs/seaweedfs/weed/storage/super_block"
|
|
)
|
|
|
|
type VolumeFileScanner4ReadAll struct {
|
|
Stream volume_server_pb.VolumeServer_ReadAllNeedlesServer
|
|
V *Volume
|
|
}
|
|
|
|
func (scanner *VolumeFileScanner4ReadAll) VisitSuperBlock(superBlock super_block.SuperBlock) error {
|
|
return nil
|
|
|
|
}
|
|
func (scanner *VolumeFileScanner4ReadAll) ReadNeedleBody() bool {
|
|
return true
|
|
}
|
|
|
|
func (scanner *VolumeFileScanner4ReadAll) VisitNeedle(n *needle.Needle, offset int64, needleHeader, needleBody []byte) error {
|
|
|
|
nv, ok := scanner.V.nm.Get(n.Id)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
if nv.Offset.ToActualOffset() != offset {
|
|
return nil
|
|
}
|
|
|
|
sendErr := scanner.Stream.Send(&volume_server_pb.ReadAllNeedlesResponse{
|
|
VolumeId: uint32(scanner.V.Id),
|
|
NeedleId: uint64(n.Id),
|
|
Cookie: uint32(n.Cookie),
|
|
NeedleBlob: n.Data,
|
|
NeedleBlobCompressed: n.IsCompressed(),
|
|
LastModified: n.LastModified,
|
|
Crc: n.Checksum.Value(),
|
|
})
|
|
if sendErr != nil {
|
|
return sendErr
|
|
}
|
|
return nil
|
|
}
|