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.

agent_storage_gc.go 2.3 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package event
  2. import (
  3. "time"
  4. "gitlink.org.cn/cloudream/common/pkgs/logger"
  5. "gitlink.org.cn/cloudream/common/pkgs/mq"
  6. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/distlock/reqbuilder"
  8. agtmq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/agent"
  9. scevt "gitlink.org.cn/cloudream/storage/common/pkgs/mq/scanner/event"
  10. )
  11. type AgentStorageGC struct {
  12. *scevt.AgentStorageGC
  13. }
  14. func NewAgentStorageGC(evt *scevt.AgentStorageGC) *AgentStorageGC {
  15. return &AgentStorageGC{
  16. AgentStorageGC: evt,
  17. }
  18. }
  19. func (t *AgentStorageGC) TryMerge(other Event) bool {
  20. event, ok := other.(*AgentStorageGC)
  21. if !ok {
  22. return false
  23. }
  24. if event.StorageID != t.StorageID {
  25. return false
  26. }
  27. return true
  28. }
  29. func (t *AgentStorageGC) Execute(execCtx ExecuteContext) {
  30. log := logger.WithType[AgentStorageGC]("Event")
  31. startTime := time.Now()
  32. log.Debugf("begin with %v", logger.FormatStruct(t.AgentStorageGC))
  33. defer func() {
  34. log.Debugf("end, time: %v", time.Since(startTime))
  35. }()
  36. // TODO unavailable的节点需不需要发送任务?
  37. mutex, err := reqbuilder.NewBuilder().
  38. // 进行GC
  39. Storage().GC(t.StorageID).
  40. MutexLock(execCtx.Args.DistLock)
  41. if err != nil {
  42. log.Warnf("acquire locks failed, err: %s", err.Error())
  43. return
  44. }
  45. defer mutex.Unlock()
  46. getStg, err := execCtx.Args.DB.Storage().GetByID(execCtx.Args.DB.SQLCtx(), t.StorageID)
  47. if err != nil {
  48. log.WithField("StorageID", t.StorageID).Warnf("getting storage: %s", err.Error())
  49. return
  50. }
  51. stgPkgs, err := execCtx.Args.DB.StoragePackage().GetAllByStorageID(execCtx.Args.DB.SQLCtx(), t.StorageID)
  52. if err != nil {
  53. log.WithField("StorageID", t.StorageID).Warnf("getting storage packages: %s", err.Error())
  54. return
  55. }
  56. agtCli, err := stgglb.AgentMQPool.Acquire(getStg.NodeID)
  57. if err != nil {
  58. log.WithField("NodeID", getStg.NodeID).Warnf("create agent client failed, err: %s", err.Error())
  59. return
  60. }
  61. defer stgglb.AgentMQPool.Release(agtCli)
  62. _, err = agtCli.StorageGC(agtmq.ReqStorageGC(t.StorageID, stgPkgs), mq.RequestOption{Timeout: time.Minute})
  63. if err != nil {
  64. log.WithField("StorageID", t.StorageID).Warnf("storage gc: %s", err.Error())
  65. return
  66. }
  67. }
  68. func init() {
  69. RegisterMessageConvertor(NewAgentStorageGC)
  70. }

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