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

test_hub_connectivities.go 2.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package ticktock
  2. import (
  3. "context"
  4. "sync"
  5. "time"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/common/utils/reflect2"
  8. stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals"
  9. corrpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/coordinator"
  10. hubrpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/hub"
  11. cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
  12. )
  13. type TestHubConnectivities struct {
  14. myHubID cortypes.HubID
  15. }
  16. func (t *TestHubConnectivities) Name() string {
  17. return reflect2.TypeNameOf[TestHubConnectivities]()
  18. }
  19. func (j *TestHubConnectivities) Execute(t *TickTock) {
  20. log := logger.WithType[TestHubConnectivities]("TickTock")
  21. startTime := time.Now()
  22. log.Infof("job start")
  23. defer func() {
  24. log.Infof("job end, time: %v", time.Since(startTime))
  25. }()
  26. coorCli := stgglb.CoordinatorRPCPool.Get()
  27. defer coorCli.Release()
  28. getHubs, cerr := coorCli.GetHubs(context.Background(), corrpc.NewGetHubs(nil))
  29. if cerr != nil {
  30. log.Warnf("get all hubs: %v", cerr)
  31. return
  32. }
  33. tests := make([]cortypes.HubConnectivity, len(getHubs.Hubs))
  34. wg := sync.WaitGroup{}
  35. for i, hub := range getHubs.Hubs {
  36. wg.Add(1)
  37. go func(hub *cortypes.Hub, i int) {
  38. defer wg.Done()
  39. tests[i] = j.testOne(hub)
  40. }(hub, i)
  41. }
  42. wg.Wait()
  43. _, cerr = coorCli.ReportHubConnectivity(context.Background(), &corrpc.ReportHubConnectivity{
  44. Connecttivities: tests,
  45. })
  46. if cerr != nil {
  47. log.Warnf("report hub connectivities: %v", cerr)
  48. }
  49. }
  50. func (j *TestHubConnectivities) testOne(hub *cortypes.Hub) cortypes.HubConnectivity {
  51. log := logger.WithType[TestHubConnectivities]("TickTock")
  52. rpcAddr, ok := hub.Address.(*cortypes.GRPCAddressInfo)
  53. if !ok {
  54. return cortypes.HubConnectivity{
  55. FromHubID: j.myHubID,
  56. ToHubID: hub.HubID,
  57. Latency: nil,
  58. TestTime: time.Now(),
  59. }
  60. }
  61. hubCli := stgglb.HubRPCPool.Get(stgglb.SelectGRPCAddress(hub, rpcAddr))
  62. defer hubCli.Release()
  63. // 后几次ping计算延迟
  64. var avgLatency time.Duration
  65. for i := 0; i < 3; i++ {
  66. start := time.Now()
  67. _, cerr := hubCli.Ping(context.Background(), &hubrpc.Ping{})
  68. if cerr != nil {
  69. log.Warnf("ping %v: %v", hub.String(), cerr)
  70. return cortypes.HubConnectivity{
  71. FromHubID: j.myHubID,
  72. ToHubID: hub.HubID,
  73. Latency: nil,
  74. TestTime: time.Now(),
  75. }
  76. }
  77. latency := time.Since(start)
  78. avgLatency += latency
  79. // 每次ping之间间隔1秒
  80. <-time.After(time.Second)
  81. }
  82. latency := avgLatency / 3
  83. latencyMs := float32(latency.Microseconds()) / 1000
  84. return cortypes.HubConnectivity{
  85. FromHubID: j.myHubID,
  86. ToHubID: hub.HubID,
  87. Latency: &latencyMs,
  88. TestTime: time.Now(),
  89. }
  90. }

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