forked from goffee/core
scheduler updates
This commit is contained in:
parent
d156e3785d
commit
987e8b98d0
2 changed files with 274 additions and 39 deletions
36
scheduler.go
36
scheduler.go
|
|
@ -27,15 +27,15 @@ var globalSchedulerMux *Schedulermux
|
|||
type Schedulermux struct {
|
||||
registry *scheduler.Registry
|
||||
store *scheduler.Store
|
||||
semaphore *scheduler.Semaphore
|
||||
semaphore *scheduler.PersistedSemaphore
|
||||
sched *scheduler.Scheduler
|
||||
}
|
||||
|
||||
// SchedulerInit initializes the scheduler internals (registry and semaphore).
|
||||
// SchedulerInit initializes the scheduler internals (registry).
|
||||
// The store must be set separately via SetStore before starting.
|
||||
// The semaphore is created lazily during RunScheduler once the DB is available.
|
||||
func (s *Schedulermux) SchedulerInit() {
|
||||
s.registry = scheduler.NewRegistry()
|
||||
s.semaphore = scheduler.NewSemaphore(true)
|
||||
globalSchedulerMux = s
|
||||
}
|
||||
|
||||
|
|
@ -56,7 +56,8 @@ func (s *Schedulermux) GetStore() *scheduler.Store {
|
|||
}
|
||||
|
||||
// RunScheduler starts the scheduler loop with the given configuration.
|
||||
// It creates the internal Scheduler instance and launches it in a goroutine.
|
||||
// It auto-migrates the scheduler_meta table, recovers the persisted semaphore
|
||||
// state, creates the in-memory semaphore, and launches the scheduler goroutine.
|
||||
func (s *Schedulermux) RunScheduler(config SchedulerConfig) {
|
||||
if s.store == nil {
|
||||
log.Fatal("scheduler: store is not set — call SetStore before RunScheduler")
|
||||
|
|
@ -72,6 +73,24 @@ func (s *Schedulermux) RunScheduler(config SchedulerConfig) {
|
|||
rateLimit = DefaultSchedulerRateLimit
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
// Auto-migrate the scheduler_meta table for semaphore persistence.
|
||||
_ = s.store.DB().AutoMigrate(&scheduler.SchedulerMeta{})
|
||||
|
||||
// Recover the persisted semaphore state (defaults to green).
|
||||
wasGreen := s.store.GetSemaphore(ctx)
|
||||
s.semaphore = scheduler.NewPersistedSemaphore(s.store, wasGreen)
|
||||
logger.ResolveLogger().Info(fmt.Sprintf("[scheduler] semaphore recovered: %s", map[bool]string{true: "green", false: "red"}[wasGreen]))
|
||||
|
||||
// Recover stuck items from a previous crash before starting.
|
||||
recovered, err := s.store.RecoverStuck(ctx)
|
||||
if err != nil {
|
||||
logger.ResolveLogger().Error(fmt.Sprintf("[scheduler] recover stuck error: %v", err))
|
||||
} else if recovered > 0 {
|
||||
logger.ResolveLogger().Info(fmt.Sprintf("[scheduler] recovered %d stuck task(s) back to pending", recovered))
|
||||
}
|
||||
|
||||
s.sched = scheduler.NewScheduler(
|
||||
scheduler.SchedulerConfig{
|
||||
Interval: interval,
|
||||
|
|
@ -82,15 +101,6 @@ func (s *Schedulermux) RunScheduler(config SchedulerConfig) {
|
|||
s.registry,
|
||||
)
|
||||
|
||||
// Recover stuck items from a previous crash before starting.
|
||||
ctx := context.Background()
|
||||
recovered, err := s.store.RecoverStuck(ctx)
|
||||
if err != nil {
|
||||
logger.ResolveLogger().Error(fmt.Sprintf("[scheduler] recover stuck error: %v", err))
|
||||
} else if recovered > 0 {
|
||||
logger.ResolveLogger().Info(fmt.Sprintf("[scheduler] recovered %d stuck task(s) back to pending", recovered))
|
||||
}
|
||||
|
||||
s.sched.Start(ctx)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue