Initial cleaner is for expiring access tokens
This commit is contained in:
parent
6f16289b41
commit
4ef9e19fbc
2 changed files with 89 additions and 0 deletions
19
storage-new/cleaners/ExpireAccessTokens.go
Normal file
19
storage-new/cleaners/ExpireAccessTokens.go
Normal file
|
@ -0,0 +1,19 @@
|
|||
package cleaners
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
||||
)
|
||||
|
||||
func init() {
|
||||
cleanerBuilders = append(cleanerBuilders, buildExpireAccessTokens)
|
||||
}
|
||||
|
||||
func tickExpireAccessTokens(now time.Time) {
|
||||
dbgen.AccessToken.Where(dbgen.AccessToken.ExpiresAt.Lt(time.Now())).Delete()
|
||||
}
|
||||
|
||||
func buildExpireAccessTokens() (onTick func(time.Time), name string, tickSpeed time.Duration) {
|
||||
return tickExpireAccessTokens, "expire-access-tokens", time.Hour
|
||||
}
|
70
storage-new/cleaners/manager.go
Normal file
70
storage-new/cleaners/manager.go
Normal file
|
@ -0,0 +1,70 @@
|
|||
package cleaners
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CleanerManager struct {
|
||||
activeCleaners map[string]bool
|
||||
activeCleanerLock sync.Mutex
|
||||
exitChans []chan any
|
||||
}
|
||||
|
||||
var cleanerBuilders = []func() (onTick func(time.Time), name string, tickSpeed time.Duration){}
|
||||
|
||||
func NewManager() *CleanerManager {
|
||||
activeCleaners := make(map[string]bool)
|
||||
exitChans := []chan any{}
|
||||
cm := &CleanerManager{
|
||||
activeCleaners: activeCleaners,
|
||||
exitChans: exitChans,
|
||||
}
|
||||
|
||||
// Launch all cleaner tickers in a new goroutine each
|
||||
for _, builder := range cleanerBuilders {
|
||||
exitChan := make(chan any, 1)
|
||||
onTick, name, tickSpeed := builder()
|
||||
cm.exitChans = append(cm.exitChans, exitChan)
|
||||
go cm.tickOrExit(tickSpeed, name, exitChan, onTick)
|
||||
}
|
||||
|
||||
return cm
|
||||
}
|
||||
|
||||
func (m *CleanerManager) Stop() {
|
||||
for _, exitChan := range m.exitChans {
|
||||
exitChan <- 1
|
||||
}
|
||||
}
|
||||
|
||||
func (m *CleanerManager) tickOrExit(
|
||||
tickSpeed time.Duration,
|
||||
name string,
|
||||
exitChan chan any,
|
||||
onTick func(time.Time),
|
||||
) {
|
||||
ticker := time.Tick(tickSpeed)
|
||||
for {
|
||||
select {
|
||||
case now := <-ticker:
|
||||
go m.wrapOnTick(name, now, onTick)
|
||||
case <-exitChan:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *CleanerManager) wrapOnTick(name string, now time.Time, onTick func(time.Time)) {
|
||||
m.activeCleanerLock.Lock()
|
||||
if m.activeCleaners[name] {
|
||||
m.activeCleanerLock.Unlock()
|
||||
return
|
||||
}
|
||||
m.activeCleaners[name] = true
|
||||
m.activeCleanerLock.Unlock()
|
||||
onTick(now)
|
||||
m.activeCleanerLock.Lock()
|
||||
m.activeCleaners[name] = false
|
||||
m.activeCleanerLock.Unlock()
|
||||
}
|
Loading…
Reference in a new issue