feat: add ops scheduler control center
This commit is contained in:
@@ -173,6 +173,57 @@ func (w *ScheduleDispatchWorker) runOnce(parent context.Context) {
|
||||
w.dispatchBatch(parent, tasks)
|
||||
}
|
||||
|
||||
func (w *ScheduleDispatchWorker) RunOnce(ctx context.Context) (map[string]any, error) {
|
||||
if w == nil || w.pool == nil || w.promptRuleService == nil {
|
||||
return map[string]any{"skipped": true, "reason": "worker_not_ready"}, nil
|
||||
}
|
||||
startedAt := time.Now()
|
||||
|
||||
stageCtx, cancel := w.stageContext(ctx)
|
||||
hydratedCount, err := w.hydrateMissingNextRuns(stageCtx)
|
||||
cancel()
|
||||
if err != nil {
|
||||
return map[string]any{
|
||||
"stage": "hydrate_missing_next_runs",
|
||||
}, err
|
||||
}
|
||||
|
||||
stageCtx, cancel = w.stageContext(ctx)
|
||||
paused, stats, err := w.shouldPauseDispatch(stageCtx)
|
||||
cancel()
|
||||
if err != nil {
|
||||
return map[string]any{
|
||||
"stage": "queue_backpressure",
|
||||
"hydrated_count": hydratedCount,
|
||||
}, err
|
||||
}
|
||||
if paused {
|
||||
return map[string]any{
|
||||
"hydrated_count": hydratedCount,
|
||||
"paused": true,
|
||||
"queue_depth": stats.Messages,
|
||||
"queue_consumers": stats.Consumers,
|
||||
"duration_ms": time.Since(startedAt).Milliseconds(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
stageCtx, cancel = w.stageContext(ctx)
|
||||
tasks, err := w.claimDueSchedules(stageCtx)
|
||||
cancel()
|
||||
if err != nil {
|
||||
return map[string]any{
|
||||
"stage": "claim_due_schedules",
|
||||
"hydrated_count": hydratedCount,
|
||||
}, err
|
||||
}
|
||||
w.dispatchBatch(ctx, tasks)
|
||||
return map[string]any{
|
||||
"hydrated_count": hydratedCount,
|
||||
"claimed_count": len(tasks),
|
||||
"duration_ms": time.Since(startedAt).Milliseconds(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (w *ScheduleDispatchWorker) hydrateMissingNextRuns(ctx context.Context) (int, error) {
|
||||
runtimeCfg := w.runtimeConfig()
|
||||
tx, err := w.pool.Begin(ctx)
|
||||
|
||||
Reference in New Issue
Block a user