You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.7 KiB

  1. package weed_server
  2. import (
  3. "fmt"
  4. "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb"
  5. "github.com/chrislusf/seaweedfs/weed/storage"
  6. "github.com/chrislusf/seaweedfs/weed/storage/needle"
  7. "github.com/chrislusf/seaweedfs/weed/storage/super_block"
  8. )
  9. func (vs *VolumeServer) ReadAllNeedles(req *volume_server_pb.ReadAllNeedlesRequest, stream volume_server_pb.VolumeServer_ReadAllNeedlesServer) (err error) {
  10. for _, vid := range req.VolumeIds {
  11. if err := vs.streaReadOneVolume(needle.VolumeId(vid), stream, err); err != nil {
  12. return err
  13. }
  14. }
  15. return nil
  16. }
  17. func (vs *VolumeServer) streaReadOneVolume(vid needle.VolumeId, stream volume_server_pb.VolumeServer_ReadAllNeedlesServer, err error) error {
  18. v := vs.store.GetVolume(vid)
  19. if v == nil {
  20. return fmt.Errorf("not found volume id %d", vid)
  21. }
  22. scanner := &VolumeFileScanner4ReadAll{
  23. stream: stream,
  24. v: v,
  25. }
  26. offset := int64(v.SuperBlock.BlockSize())
  27. err = storage.ScanVolumeFileFrom(v.Version(), v.DataBackend, offset, scanner)
  28. return err
  29. }
  30. type VolumeFileScanner4ReadAll struct {
  31. stream volume_server_pb.VolumeServer_ReadAllNeedlesServer
  32. v *storage.Volume
  33. }
  34. func (scanner *VolumeFileScanner4ReadAll) VisitSuperBlock(superBlock super_block.SuperBlock) error {
  35. return nil
  36. }
  37. func (scanner *VolumeFileScanner4ReadAll) ReadNeedleBody() bool {
  38. return true
  39. }
  40. func (scanner *VolumeFileScanner4ReadAll) VisitNeedle(n *needle.Needle, offset int64, needleHeader, needleBody []byte) error {
  41. sendErr := scanner.stream.Send(&volume_server_pb.ReadAllNeedlesResponse{
  42. VolumeId: uint32(scanner.v.Id),
  43. NeedleId: uint64(n.Id),
  44. Cookie: uint32(n.Cookie),
  45. NeedleBlob: n.Data,
  46. })
  47. if sendErr != nil {
  48. return sendErr
  49. }
  50. return nil
  51. }