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.

access_stat.go 1.7 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package accessstat
  2. import (
  3. "sync"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/async"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
  8. clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
  9. )
  10. type AccessStatEventChan = async.UnboundChannel[AccessStatEvent]
  11. type AccessStatEvent interface {
  12. IsAccessStatEvent() bool
  13. }
  14. type ExitEvent struct {
  15. AccessStatEvent
  16. Err error
  17. }
  18. type AccessStat struct {
  19. cfg Config
  20. done chan any
  21. stats []db.AddAccessStatEntry
  22. lock sync.Mutex
  23. db *db.DB
  24. }
  25. func NewAccessStat(cfg Config, db *db.DB) *AccessStat {
  26. return &AccessStat{
  27. cfg: cfg,
  28. done: make(chan any),
  29. db: db,
  30. }
  31. }
  32. func (p *AccessStat) AddAccessCounter(objID clitypes.ObjectID, pkgID clitypes.PackageID, spaceID clitypes.UserSpaceID, value float64) {
  33. p.lock.Lock()
  34. defer p.lock.Unlock()
  35. p.stats = append(p.stats, db.AddAccessStatEntry{
  36. ObjectID: objID,
  37. PackageID: pkgID,
  38. UserSpaceID: spaceID,
  39. Counter: value,
  40. })
  41. }
  42. func (p *AccessStat) Start() *AccessStatEventChan {
  43. ch := async.NewUnboundChannel[AccessStatEvent]()
  44. go func() {
  45. ticker := time.NewTicker(p.cfg.ReportInterval)
  46. defer ticker.Stop()
  47. for {
  48. select {
  49. case <-ticker.C:
  50. case <-p.done:
  51. ch.Send(ExitEvent{})
  52. return
  53. }
  54. p.lock.Lock()
  55. st := p.stats
  56. p.stats = nil
  57. p.lock.Unlock()
  58. if len(st) == 0 {
  59. continue
  60. }
  61. err := db.DoTx10(p.db, p.db.Package().BatchAddPackageAccessStat, st)
  62. if err != nil {
  63. logger.Errorf("add all package access stat counter: %v", err)
  64. p.lock.Lock()
  65. p.stats = append(p.stats, st...)
  66. p.lock.Unlock()
  67. continue
  68. }
  69. }
  70. }()
  71. return ch
  72. }
  73. func (p *AccessStat) Stop() {
  74. close(p.done)
  75. }

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