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.

node.go 3.1 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package mq
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/storage/common/pkgs/db2"
  5. "gitlink.org.cn/cloudream/common/consts/errorcode"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/common/pkgs/mq"
  8. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  9. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  10. )
  11. func (svc *Service) GetUserNodes(msg *coormq.GetUserNodes) (*coormq.GetUserNodesResp, *mq.CodeMessage) {
  12. nodes, err := svc.db2.Node().GetUserNodes(svc.db2.DefCtx(), msg.UserID)
  13. if err != nil {
  14. logger.WithField("UserID", msg.UserID).
  15. Warnf("query user nodes failed, err: %s", err.Error())
  16. return nil, mq.Failed(errorcode.OperationFailed, "query user nodes failed")
  17. }
  18. return mq.ReplyOK(coormq.NewGetUserNodesResp(nodes))
  19. }
  20. func (svc *Service) GetNodes(msg *coormq.GetNodes) (*coormq.GetNodesResp, *mq.CodeMessage) {
  21. var nodes []cdssdk.Node
  22. if msg.NodeIDs == nil {
  23. var err error
  24. nodes, err = svc.db2.Node().GetAllNodes(svc.db2.DefCtx())
  25. if err != nil {
  26. logger.Warnf("getting all nodes: %s", err.Error())
  27. return nil, mq.Failed(errorcode.OperationFailed, "get all node failed")
  28. }
  29. } else {
  30. // 可以不用事务
  31. for _, id := range msg.NodeIDs {
  32. node, err := svc.db2.Node().GetByID(svc.db2.DefCtx(), id)
  33. if err != nil {
  34. logger.WithField("NodeID", id).
  35. Warnf("query node failed, err: %s", err.Error())
  36. return nil, mq.Failed(errorcode.OperationFailed, "query node failed")
  37. }
  38. nodes = append(nodes, node)
  39. }
  40. }
  41. return mq.ReplyOK(coormq.NewGetNodesResp(nodes))
  42. }
  43. func (svc *Service) GetNodeConnectivities(msg *coormq.GetNodeConnectivities) (*coormq.GetNodeConnectivitiesResp, *mq.CodeMessage) {
  44. cons, err := svc.db2.NodeConnectivity().BatchGetByFromNode(svc.db2.DefCtx(), msg.NodeIDs)
  45. if err != nil {
  46. logger.Warnf("batch get node connectivities by from node: %s", err.Error())
  47. return nil, mq.Failed(errorcode.OperationFailed, "batch get node connectivities by from node failed")
  48. }
  49. return mq.ReplyOK(coormq.RespGetNodeConnectivities(cons))
  50. }
  51. func (svc *Service) UpdateNodeConnectivities(msg *coormq.UpdateNodeConnectivities) (*coormq.UpdateNodeConnectivitiesResp, *mq.CodeMessage) {
  52. err := svc.db2.DoTx(func(tx db2.SQLContext) error {
  53. // 只有发起节点和目的节点都存在,才能插入这条记录到数据库
  54. allNodes, err := svc.db2.Node().GetAllNodes(tx)
  55. if err != nil {
  56. return fmt.Errorf("getting all nodes: %w", err)
  57. }
  58. allNodeID := make(map[cdssdk.NodeID]bool)
  59. for _, node := range allNodes {
  60. allNodeID[node.NodeID] = true
  61. }
  62. var avaiCons []cdssdk.NodeConnectivity
  63. for _, con := range msg.Connectivities {
  64. if allNodeID[con.FromNodeID] && allNodeID[con.ToNodeID] {
  65. avaiCons = append(avaiCons, con)
  66. }
  67. }
  68. err = svc.db2.NodeConnectivity().BatchUpdateOrCreate(tx, avaiCons)
  69. if err != nil {
  70. return fmt.Errorf("batch update or create node connectivities: %s", err)
  71. }
  72. return nil
  73. })
  74. if err != nil {
  75. logger.Warn(err.Error())
  76. return nil, mq.Failed(errorcode.OperationFailed, err.Error())
  77. }
  78. return mq.ReplyOK(coormq.RespUpdateNodeConnectivities())
  79. }

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