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 }