aboutsummaryrefslogtreecommitdiff
path: root/weed/server/volume_grpc_read_all.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/volume_grpc_read_all.go')
-rw-r--r--weed/server/volume_grpc_read_all.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/weed/server/volume_grpc_read_all.go b/weed/server/volume_grpc_read_all.go
new file mode 100644
index 000000000..f1f79a2e3
--- /dev/null
+++ b/weed/server/volume_grpc_read_all.go
@@ -0,0 +1,50 @@
+package weed_server
+
+import (
+ "fmt"
+ "github.com/chrislusf/seaweedfs/weed/pb/volume_server_pb"
+ "github.com/chrislusf/seaweedfs/weed/storage"
+ "github.com/chrislusf/seaweedfs/weed/storage/needle"
+ "github.com/chrislusf/seaweedfs/weed/storage/super_block"
+)
+
+func (vs *VolumeServer) ReadAllNeedles(req *volume_server_pb.ReadAllNeedlesRequest, stream volume_server_pb.VolumeServer_ReadAllNeedlesServer) (err error) {
+
+ v := vs.store.GetVolume(needle.VolumeId(req.VolumeId))
+ if v == nil {
+ return fmt.Errorf("not found volume id %d", req.VolumeId)
+ }
+
+ scanner := &VolumeFileScanner4ReadAll{
+ stream: stream,
+ }
+
+ err = storage.ScanVolumeFileFrom(v.Version(), v.DataBackend, super_block.SuperBlockSize, scanner)
+
+ return err
+
+}
+
+type VolumeFileScanner4ReadAll struct {
+ stream volume_server_pb.VolumeServer_ReadAllNeedlesServer
+}
+
+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 {
+
+ sendErr := scanner.stream.Send(&volume_server_pb.ReadAllNeedlesResponse{
+ NeedleId: uint64(n.Id),
+ NeedleBlob: needleBody,
+ })
+ if sendErr != nil {
+ return sendErr
+ }
+ return nil
+}