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.

trigger.go 2.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package spacesyncer
  2. import (
  3. "time"
  4. "gitlink.org.cn/cloudream/common/pkgs/logger"
  5. "gitlink.org.cn/cloudream/common/utils/sort2"
  6. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  7. )
  8. func triggerOnce(syncer *SpaceSyncer, task *task) {
  9. go func() {
  10. log := logger.WithField("Mod", logMod)
  11. if !syncer.cluster.IsMaster() {
  12. log.Infof("not cluster master, skip")
  13. return
  14. }
  15. execute(syncer, task)
  16. syncer.lock.Lock()
  17. defer syncer.lock.Unlock()
  18. tsk := syncer.tasks[task.Task.TaskID]
  19. if tsk == nil {
  20. return
  21. }
  22. tsk.CancelFn()
  23. delete(syncer.tasks, task.Task.TaskID)
  24. err := syncer.db.SpaceSyncTask().Delete(syncer.db.DefCtx(), task.Task.TaskID)
  25. if err != nil {
  26. log.Warnf("delete task %v from db: %v", task.Task.TaskID, err)
  27. }
  28. }()
  29. }
  30. func triggerInterval(syncer *SpaceSyncer, task *task, trigger *jcstypes.SpaceSyncTriggerInterval) {
  31. go func() {
  32. log := logger.WithField("Mod", logMod)
  33. ticker := time.NewTicker(time.Duration(trigger.Interval) * time.Second)
  34. defer ticker.Stop()
  35. loop:
  36. for {
  37. select {
  38. case <-ticker.C:
  39. if !syncer.cluster.IsMaster() {
  40. log.Infof("not cluster master, skip")
  41. continue
  42. }
  43. execute(syncer, task)
  44. case <-task.Context.Done():
  45. break loop
  46. }
  47. }
  48. syncer.lock.Lock()
  49. defer syncer.lock.Unlock()
  50. tsk := syncer.tasks[task.Task.TaskID]
  51. if tsk == nil {
  52. return
  53. }
  54. tsk.CancelFn()
  55. delete(syncer.tasks, task.Task.TaskID)
  56. err := syncer.db.SpaceSyncTask().Delete(syncer.db.DefCtx(), task.Task.TaskID)
  57. if err != nil {
  58. log.Warnf("delete task %v from db: %v", task.Task.TaskID, err)
  59. }
  60. }()
  61. }
  62. func triggerAt(syncer *SpaceSyncer, task *task, trigger *jcstypes.SpaceSyncTriggerAt) {
  63. go func() {
  64. log := logger.WithField("Mod", logMod)
  65. atTimes := sort2.Sort(trigger.At, func(l, r time.Time) int {
  66. return l.Compare(r)
  67. })
  68. loop:
  69. for _, at := range atTimes {
  70. nowTime := time.Now()
  71. if nowTime.After(at) {
  72. continue
  73. }
  74. select {
  75. case <-time.After(at.Sub(nowTime)):
  76. if !syncer.cluster.IsMaster() {
  77. log.Infof("not cluster master, skip")
  78. continue
  79. }
  80. execute(syncer, task)
  81. case <-task.Context.Done():
  82. break loop
  83. }
  84. }
  85. syncer.lock.Lock()
  86. defer syncer.lock.Unlock()
  87. tsk := syncer.tasks[task.Task.TaskID]
  88. if tsk == nil {
  89. return
  90. }
  91. tsk.CancelFn()
  92. delete(syncer.tasks, task.Task.TaskID)
  93. err := syncer.db.SpaceSyncTask().Delete(syncer.db.DefCtx(), task.Task.TaskID)
  94. if err != nil {
  95. log.Warnf("delete task %v from db: %v", task.Task.TaskID, err)
  96. }
  97. }()
  98. }

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