|
- package accessstat
-
- import (
- "sync"
- "time"
-
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- "gitlink.org.cn/cloudream/common/utils/sync2"
- "gitlink.org.cn/cloudream/storage2/client/internal/db"
- clitypes "gitlink.org.cn/cloudream/storage2/client/types"
- )
-
- type AccessStatEvent interface{}
-
- type AccessStat struct {
- cfg Config
- stats []db.AddAccessStatEntry
- lock sync.Mutex
- db *db.DB
- }
-
- func NewAccessStat(cfg Config, db *db.DB) *AccessStat {
- return &AccessStat{
- cfg: cfg,
- db: db,
- }
- }
-
- func (p *AccessStat) AddAccessCounter(objID clitypes.ObjectID, pkgID clitypes.PackageID, spaceID clitypes.UserSpaceID, value float64) {
- p.lock.Lock()
- defer p.lock.Unlock()
-
- p.stats = append(p.stats, db.AddAccessStatEntry{
- ObjectID: objID,
- PackageID: pkgID,
- UserSpaceID: spaceID,
- Counter: value,
- })
- }
-
- func (p *AccessStat) Start() *sync2.UnboundChannel[AccessStatEvent] {
- ch := sync2.NewUnboundChannel[AccessStatEvent]()
-
- go func() {
- ticker := time.NewTicker(p.cfg.ReportInterval)
- for {
- <-ticker.C
-
- p.lock.Lock()
- st := p.stats
- p.stats = nil
- p.lock.Unlock()
-
- if len(st) == 0 {
- continue
- }
-
- err := db.DoTx10(p.db, p.db.Package().BatchAddPackageAccessStat, st)
- if err != nil {
- logger.Errorf("add all package access stat counter: %v", err)
-
- p.lock.Lock()
- p.stats = append(p.stats, st...)
- p.lock.Unlock()
- continue
- }
- }
- }()
- return ch
- }
|