您最多选择25个标签 标签必须以中文、字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package ops
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "gitlink.org.cn/cloudream/common/pkgs/future"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  9. "gitlink.org.cn/cloudream/common/utils/io2"
  10. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  11. "gitlink.org.cn/cloudream/storage/common/pkgs/ioswitch"
  12. )
  13. type GRPCSend struct {
  14. LocalID ioswitch.StreamID `json:"localID"`
  15. RemoteID ioswitch.StreamID `json:"remoteID"`
  16. Node cdssdk.Node `json:"node"`
  17. }
  18. func (o *GRPCSend) Execute(sw *ioswitch.Switch, planID ioswitch.PlanID) error {
  19. logger.
  20. WithField("LocalID", o.LocalID).
  21. WithField("RemoteID", o.RemoteID).
  22. Debugf("grpc send")
  23. strs, err := sw.WaitStreams(planID, o.LocalID)
  24. if err != nil {
  25. return err
  26. }
  27. defer strs[0].Stream.Close()
  28. // TODO 根据客户端地址选择IP和端口
  29. agtCli, err := stgglb.AgentRPCPool.Acquire(o.Node.ExternalIP, o.Node.ExternalGRPCPort)
  30. if err != nil {
  31. return fmt.Errorf("new agent rpc client: %w", err)
  32. }
  33. defer stgglb.AgentRPCPool.Release(agtCli)
  34. err = agtCli.SendStream(planID, o.RemoteID, strs[0].Stream)
  35. if err != nil {
  36. return fmt.Errorf("sending stream: %w", err)
  37. }
  38. return nil
  39. }
  40. type GRPCFetch struct {
  41. RemoteID ioswitch.StreamID `json:"remoteID"`
  42. LocalID ioswitch.StreamID `json:"localID"`
  43. Node cdssdk.Node `json:"node"`
  44. }
  45. func (o *GRPCFetch) Execute(sw *ioswitch.Switch, planID ioswitch.PlanID) error {
  46. // TODO 根据客户端地址选择IP和端口
  47. agtCli, err := stgglb.AgentRPCPool.Acquire(o.Node.ExternalIP, o.Node.ExternalGRPCPort)
  48. if err != nil {
  49. return fmt.Errorf("new agent rpc client: %w", err)
  50. }
  51. defer stgglb.AgentRPCPool.Release(agtCli)
  52. str, err := agtCli.FetchStream(planID, o.RemoteID)
  53. if err != nil {
  54. return fmt.Errorf("fetching stream: %w", err)
  55. }
  56. fut := future.NewSetVoid()
  57. str = io2.AfterReadClosedOnce(str, func(closer io.ReadCloser) {
  58. fut.SetVoid()
  59. })
  60. sw.StreamReady(planID, ioswitch.NewStream(o.LocalID, str))
  61. // TODO
  62. fut.Wait(context.TODO())
  63. return err
  64. }
  65. func init() {
  66. OpUnion.AddT((*GRPCSend)(nil))
  67. OpUnion.AddT((*GRPCFetch)(nil))
  68. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。