fix(cron): stop recurring jobs from re-firing every poll - #65
Draft
cursor[bot] wants to merge 1 commit into
Draft
Conversation
cron_next_from_expr returned the current matching minute, so after cron_poll updated next_run the job stayed due and re-fired every poll until the minute rolled — or forever when the next match was outside the 8-day search window. Start from the next minute and search up to a year; fail closed if next_run still cannot be computed. Co-authored-by: esadrianno <esadrianno@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bug and impact
Recurring
cron:schedules re-delivered the same job every main-loop poll (~1s) for the rest of the matching minute. When the following match was more than 8 days away (e.g. monthly0 0 1 * *),next_runwas never advanced and the job fired on every poll indefinitely — duplicate agent runs and runaway provider usage.Root cause
cron_next_from_expr()started searching atnowand returned the current matching minute. Aftercron_poll()wrote that value back asnext_run,next_run <= nowstayed true on the next poll. The 8-day search window also made monthly/yearly advances fail silently, leaving a still-duenext_run.Fix
now).next_runstill cannot be computed after a fire, push it one year forward so the job cannot tight-loop.Validation
make test_cron && ./build/test_cron— all tests passed, including new coverage for same-minute skip, monthly >8 days, and poll advance + no immediate re-fire.Distinct from #57 (defer DB commit until delivery succeeds).