106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
package ticktock
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-co-op/gocron/v2"
|
|
"github.com/samber/lo"
|
|
"gitlink.org.cn/cloudream/common/pkgs/logger"
|
|
"gitlink.org.cn/cloudream/jcs-pub/client/internal/db"
|
|
"gitlink.org.cn/cloudream/jcs-pub/client/internal/metacache"
|
|
"gitlink.org.cn/cloudream/jcs-pub/common/pkgs/publock"
|
|
"gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/pool"
|
|
"gitlink.org.cn/cloudream/jcs-pub/common/pkgs/sysevent"
|
|
)
|
|
|
|
type Job interface {
|
|
Name() string
|
|
Execute(t *TickTock)
|
|
}
|
|
|
|
type cronJob struct {
|
|
cronJob gocron.Job
|
|
job Job
|
|
}
|
|
|
|
type TickTock struct {
|
|
cfg Config
|
|
sch gocron.Scheduler
|
|
jobs map[string]cronJob
|
|
db *db.DB
|
|
spaceMeta *metacache.UserSpaceMeta
|
|
stgPool *pool.Pool
|
|
evtPub *sysevent.Publisher
|
|
pubLock *publock.Service
|
|
}
|
|
|
|
func New(cfg Config, db *db.DB, spaceMeta *metacache.UserSpaceMeta, stgPool *pool.Pool, evtPub *sysevent.Publisher, pubLock *publock.Service) *TickTock {
|
|
sch, _ := gocron.NewScheduler()
|
|
t := &TickTock{
|
|
cfg: cfg,
|
|
sch: sch,
|
|
jobs: map[string]cronJob{},
|
|
db: db,
|
|
spaceMeta: spaceMeta,
|
|
stgPool: stgPool,
|
|
evtPub: evtPub,
|
|
pubLock: pubLock,
|
|
}
|
|
t.initJobs()
|
|
return t
|
|
}
|
|
|
|
func (t *TickTock) Start() {
|
|
t.sch.Start()
|
|
}
|
|
|
|
func (t *TickTock) Stop() {
|
|
t.sch.Shutdown()
|
|
}
|
|
|
|
func (t *TickTock) GetJobNames() []string {
|
|
return lo.Keys(t.jobs)
|
|
}
|
|
|
|
func (t *TickTock) RunNow(jobName string) bool {
|
|
j, ok := t.jobs[jobName]
|
|
if !ok {
|
|
logger.Warnf("job %s not found", jobName)
|
|
return false
|
|
}
|
|
|
|
j.cronJob.RunNow()
|
|
return true
|
|
}
|
|
|
|
func (t *TickTock) addJob(job Job, duration gocron.JobDefinition) {
|
|
j, err := t.sch.NewJob(duration, gocron.NewTask(job.Execute, t))
|
|
if err != nil {
|
|
panic(fmt.Errorf("add job %s: %w", job.Name(), err))
|
|
}
|
|
|
|
t.jobs[job.Name()] = cronJob{
|
|
cronJob: j,
|
|
job: job,
|
|
}
|
|
}
|
|
|
|
func (t *TickTock) initJobs() {
|
|
t.addJob(&UpdatePackageAccessStatAmount{}, gocron.DailyJob(1, gocron.NewAtTimes(
|
|
gocron.NewAtTime(0, 0, 0),
|
|
)))
|
|
|
|
t.addJob(&ChangeRedundancy{}, gocron.DailyJob(1, gocron.NewAtTimes(
|
|
gocron.NewAtTime(0, 5, 0),
|
|
)))
|
|
|
|
t.addJob(&CheckShardStore{}, gocron.DailyJob(1, gocron.NewAtTimes(
|
|
gocron.NewAtTime(1, 0, 0),
|
|
)))
|
|
|
|
t.addJob(&UserSpaceGC{}, gocron.DailyJob(1, gocron.NewAtTimes(
|
|
gocron.NewAtTime(2, 0, 0),
|
|
)))
|
|
|
|
}
|