mirror of
https://github.com/nkanaev/yarr.git
synced 2025-05-25 05:29:20 +00:00
76 lines
1.7 KiB
Go
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)
|
|
}
|