yarr/src/expirer/expirer.go
2025-01-03 13:25:25 +01:00

76 lines
1.7 KiB
Go

package expirer
import (
"log"
"time"
"github.com/nkanaev/yarr/src/storage"
)
type Expirer struct {
db *storage.Storage
stop chan bool
intervalMinutes uint64
}
func NewExpirer(db *storage.Storage) *Expirer {
return &Expirer{
db: db,
stop: make(chan bool),
intervalMinutes: 0,
}
}
func expire(db *storage.Storage, rateMinutes uint64, stop chan bool) {
tick := time.NewTicker(time.Minute * time.Duration(rateMinutes) / 2)
db.ExpireUnreads(rateMinutes)
log.Printf("expirer %dm: starting", rateMinutes)
for {
select {
case <-tick.C:
log.Printf("expirer %dm: firing", rateMinutes)
db.ExpireUnreads(rateMinutes)
case <-stop:
log.Printf("expirer %dm: stopping", rateMinutes)
tick.Stop()
stop <- true
return
}
}
}
func (e *Expirer) getCheckInterval(globalExpirationPeriod uint64) uint64 {
minFeedExpirationPeriod, err := e.db.GetMinExpirationPeriod()
if err != nil {
log.Fatal(err)
}
checkInterval := globalExpirationPeriod
if *minFeedExpirationPeriod != 0 && *minFeedExpirationPeriod < checkInterval {
checkInterval = *minFeedExpirationPeriod
}
return checkInterval
}
func (e *Expirer) StartUnreadsExpirer(globalExpirationPeriod uint64) {
checkInterval := e.getCheckInterval(globalExpirationPeriod)
if checkInterval > 0 {
e.intervalMinutes = uint64(checkInterval)
go expire(e.db, e.intervalMinutes, e.stop)
}
}
func (e *Expirer) SetExpirationRate(globalExpirationPeriod uint64) {
checkInterval := e.getCheckInterval(globalExpirationPeriod)
if checkInterval == e.intervalMinutes {
return
}
e.stop <- true
<-e.stop
e.intervalMinutes = globalExpirationPeriod
if checkInterval == 0 {
return
}
go expire(e.db, e.intervalMinutes, e.stop)
}