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.3 kB

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

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