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.

command_service_ec.go 4.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package services
  2. import (
  3. "database/sql"
  4. "errors"
  5. "github.com/jmoiron/sqlx"
  6. "gitlink.org.cn/cloudream/common/consts/errorcode"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. "gitlink.org.cn/cloudream/common/pkgs/mq"
  9. mymq "gitlink.org.cn/cloudream/storage-common/pkgs/mq/message"
  10. coormsg "gitlink.org.cn/cloudream/storage-common/pkgs/mq/message/coordinator"
  11. )
  12. func (svc *Service) PreUploadEcObject(msg *coormsg.PreUploadEcObject) (*coormsg.PreUploadEcResp, *mq.CodeMessage) {
  13. // 判断同名对象是否存在。等到UploadRepObject时再判断一次。
  14. // 此次的判断只作为参考,具体是否成功还是看UploadRepObject的结果
  15. isBucketAvai, err := svc.db.Bucket().IsAvailable(svc.db.SQLCtx(), msg.BucketID, msg.UserID)
  16. if err != nil {
  17. logger.WithField("BucketID", msg.BucketID).
  18. Warnf("check bucket available failed, err: %s", err.Error())
  19. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "check bucket available failed")
  20. }
  21. if !isBucketAvai {
  22. logger.WithField("BucketID", msg.BucketID).
  23. Warnf("bucket is not available to user")
  24. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "bucket is not available to user")
  25. }
  26. _, err = svc.db.Object().GetByName(svc.db.SQLCtx(), msg.BucketID, msg.ObjectName)
  27. if err == nil {
  28. logger.WithField("BucketID", msg.BucketID).
  29. WithField("ObjectName", msg.ObjectName).
  30. Warnf("object with given Name and BucketID already exists")
  31. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "object with given Name and BucketID already exists")
  32. }
  33. if !errors.Is(err, sql.ErrNoRows) {
  34. logger.WithField("BucketID", msg.BucketID).
  35. WithField("ObjectName", msg.ObjectName).
  36. Warnf("get object by name failed, err: %s", err.Error())
  37. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "get object by name failed")
  38. }
  39. //查询用户可用的节点IP
  40. nodes, err := svc.db.Node().GetUserNodes(svc.db.SQLCtx(), msg.UserID)
  41. if err != nil {
  42. logger.WithField("UserID", msg.UserID).
  43. Warnf("query user nodes failed, err: %s", err.Error())
  44. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "query user nodes failed")
  45. }
  46. // 查询客户端所属节点
  47. foundBelongNode := true
  48. belongNode, err := svc.db.Node().GetByExternalIP(svc.db.SQLCtx(), msg.ClientExternalIP)
  49. if err == sql.ErrNoRows {
  50. foundBelongNode = false
  51. } else if err != nil {
  52. logger.WithField("ClientExternalIP", msg.ClientExternalIP).
  53. Warnf("query client belong node failed, err: %s", err.Error())
  54. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "query client belong node failed")
  55. }
  56. var respNodes []mymq.RespNode
  57. for _, node := range nodes {
  58. respNodes = append(respNodes, mymq.NewRespNode(
  59. node.NodeID,
  60. node.ExternalIP,
  61. node.LocalIP,
  62. // LocationID 相同则认为是在同一个地域
  63. foundBelongNode && belongNode.LocationID == node.LocationID,
  64. ))
  65. }
  66. //查询纠删码参数
  67. ec, err := svc.db.Ec().GetEc(svc.db.SQLCtx(), msg.EcName)
  68. if err != nil {
  69. logger.WithField("Ec", msg.EcName).
  70. Warnf("check ec type failed, err: %s", err.Error())
  71. return mq.ReplyFailed[coormsg.PreUploadEcResp](errorcode.OperationFailed, "check bucket available failed")
  72. }
  73. ecc := mymq.NewEc(ec.EcID, ec.Name, ec.EcK, ec.EcN)
  74. return mq.ReplyOK(coormsg.NewPreUploadEcResp(respNodes, ecc))
  75. }
  76. func (svc *Service) CreateEcObject(msg *coormsg.CreateEcObject) (*coormsg.CreateObjectResp, *mq.CodeMessage) {
  77. var objID int64
  78. err := svc.db.DoTx(sql.LevelDefault, func(tx *sqlx.Tx) error {
  79. var err error
  80. objID, err = svc.db.Object().CreateEcObject(tx, msg.BucketID, msg.ObjectName, msg.FileSize, msg.UserID, msg.NodeIDs, msg.Hashes, msg.EcName, msg.DirName)
  81. return err
  82. })
  83. if err != nil {
  84. logger.WithField("BucketName", msg.BucketID).
  85. WithField("ObjectName", msg.ObjectName).
  86. Warnf("create rep object failed, err: %s", err.Error())
  87. return mq.ReplyFailed[coormsg.CreateObjectResp](errorcode.OperationFailed, "create rep object failed")
  88. }
  89. return mq.ReplyOK(coormsg.NewCreateObjectResp(objID))
  90. }

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