aboutsummaryrefslogtreecommitdiff
path: root/weed/server/volume_grpc_read_all.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-09-27 01:45:32 -0700
committerChris Lu <chris.lu@gmail.com>2021-09-27 01:45:32 -0700
commitc4d7ee6c5cb039f8503c24718ba927f7347a8289 (patch)
tree3f0c4d3628b9c716c66d6469726c675b3a6617dd /weed/server/volume_grpc_read_all.go
parent4a1d4d7462334088ea979c01ae42563eefb0b9f1 (diff)
downloadseaweedfs-c4d7ee6c5cb039f8503c24718ba927f7347a8289.tar.xz
seaweedfs-c4d7ee6c5cb039f8503c24718ba927f7347a8289.zip
volume server: read all files in a volume
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
+}