forked from molecule-ai/molecule-core
fix(scheduler): use context.Background() for post-fire UPDATE (F1089) (#1244)
The post-fire UPDATE after s.proxy.ProxyA2ARequest() was using fireCtx, which derives from the outer ctx passed into fireSchedule(). If that ctx is cancelled — HTTP timeout, graceful shutdown, or any upstream deadline — ExecContext returns context.Canceled and the UPDATE is silently skipped, leaving next_run_at stale and causing the schedule to re-fire on the next tick. Fix: create a dedicated updateCtx from context.Background() with a 5s deadline, independent of the outer ctx hierarchy. Also improved the error log to include schedule name for easier debugging. Complements PR #1241 (fix/f1089-scheduler-ctx-fix-main) which fixes the goroutine-panic path in tick() — this fix covers the wider case of normal-return + ctx-cancelled after the proxy call. F1089 | Severity: HIGH+security Co-authored-by: Molecule AI Infra Lead <infra-lead@agents.moleculesai.app> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
f7275895e0
commit
9be99059dd
@ -389,7 +389,15 @@ func (s *Scheduler) fireSchedule(ctx context.Context, sched scheduleRow) {
|
||||
sched.Name, sched.ID, nextErr)
|
||||
}
|
||||
|
||||
_, err := db.DB.ExecContext(ctx, `
|
||||
// F1089: use a dedicated context with its own 5s deadline for the
|
||||
// post-fire UPDATE. The outer ctx (fireCtx) may be cancelled if the
|
||||
// HTTP call timed out or the server is shutting down; using it here
|
||||
// would silently skip the UPDATE and leave next_run_at stale, causing
|
||||
// the schedule to be immediately re-fired on the next tick.
|
||||
updateCtx, updateCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer updateCancel()
|
||||
|
||||
_, err := db.DB.ExecContext(updateCtx, `
|
||||
UPDATE workspace_schedules
|
||||
SET last_run_at = now(),
|
||||
next_run_at = COALESCE($2, next_run_at),
|
||||
@ -400,7 +408,7 @@ func (s *Scheduler) fireSchedule(ctx context.Context, sched scheduleRow) {
|
||||
WHERE id = $1
|
||||
`, sched.ID, nextRunPtr, lastStatus, lastError)
|
||||
if err != nil {
|
||||
log.Printf("Scheduler: update error for %s: %v", sched.ID, err)
|
||||
log.Printf("Scheduler: post-fire update error for %s [%s]: %v", sched.ID, sched.Name, err)
|
||||
}
|
||||
|
||||
// Log a dedicated cron_run activity entry with schedule metadata so the
|
||||
|
||||
Loading…
Reference in New Issue
Block a user