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.

package_stat.go 2.2 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package packagestat
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  8. "gitlink.org.cn/cloudream/common/utils/sync2"
  9. stgglb "gitlink.org.cn/cloudream/storage/common/globals"
  10. coormq "gitlink.org.cn/cloudream/storage/common/pkgs/mq/coordinator"
  11. )
  12. type PackageStatEvent interface{}
  13. type amountKey struct {
  14. PackageID cdssdk.PackageID
  15. NodeID cdssdk.NodeID
  16. }
  17. type amount struct {
  18. Counter float64
  19. }
  20. type PackageStat struct {
  21. cfg Config
  22. amounts map[amountKey]*amount
  23. lock sync.Mutex
  24. }
  25. func NewPackageStat(cfg Config) *PackageStat {
  26. return &PackageStat{
  27. cfg: cfg,
  28. amounts: make(map[amountKey]*amount),
  29. }
  30. }
  31. func (p *PackageStat) AddAccessCounter(pkgID cdssdk.PackageID, nodeID cdssdk.NodeID, value float64) {
  32. p.lock.Lock()
  33. defer p.lock.Unlock()
  34. key := amountKey{
  35. PackageID: pkgID,
  36. NodeID: nodeID,
  37. }
  38. if _, ok := p.amounts[key]; !ok {
  39. p.amounts[key] = &amount{}
  40. }
  41. p.amounts[key].Counter += value
  42. }
  43. func (p *PackageStat) Start() *sync2.UnboundChannel[PackageStatEvent] {
  44. ch := sync2.NewUnboundChannel[PackageStatEvent]()
  45. go func() {
  46. coorCli, err := stgglb.CoordinatorMQPool.Acquire()
  47. if err != nil {
  48. ch.Send(fmt.Errorf("new coordinator client: %w", err))
  49. }
  50. defer stgglb.CoordinatorMQPool.Release(coorCli)
  51. ticker := time.NewTicker(p.cfg.ReportInterval)
  52. for {
  53. <-ticker.C
  54. p.lock.Lock()
  55. amts := p.amounts
  56. p.amounts = make(map[amountKey]*amount)
  57. var addEntries []coormq.AddPackageAccessStatCounterEntry
  58. for key, amount := range amts {
  59. addEntries = append(addEntries, coormq.AddPackageAccessStatCounterEntry{
  60. PackageID: key.PackageID,
  61. NodeID: key.NodeID,
  62. Value: amount.Counter,
  63. })
  64. }
  65. p.lock.Unlock()
  66. _, err := coorCli.AddPackageAccessStatCounter(coormq.NewAddPackageAccessStatCounter(addEntries))
  67. if err != nil {
  68. logger.Errorf("add all package access stat counter: %v", err)
  69. p.lock.Lock()
  70. for key, a := range amts {
  71. if _, ok := p.amounts[key]; !ok {
  72. p.amounts[key] = &amount{}
  73. }
  74. p.amounts[key].Counter += a.Counter
  75. }
  76. p.lock.Unlock()
  77. continue
  78. }
  79. }
  80. }()
  81. return ch
  82. }

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