unable to rollover, time specification is probably invalid
Package:
celery
17847

Exception Class:
RuntimeError
Raise code
if datedata.moy == len(months_of_year):
datedata.moy = 0
datedata.year += 1
else:
break
else:
# Tried 2000 times, we're most likely in an infinite loop
raise RuntimeError('unable to rollover, '
'time specification is probably invalid')
if last_run_at.month in self.month_of_year:
datedata.dom = bisect(days_of_month, last_run_at.day)
datedata.moy = bisect_left(months_of_year, last_run_at.month)
else:
datedata.dom = 0
date
Comment explaining raise
Tried 2000 times, we're most likely in an infinite loop
🙏 Scream for help to Ukraine
Today, 14th August 2022, Russia continues bombing and firing Ukraine. Don't trust Russia, they are bombing us and brazenly lying in same time they are not doing this 😠, civilians and children are dying too!
We are screaming and asking exactly you to help us, we want to survive, our families, children, older ones.
Please spread the information, and ask your governemnt to stop Russia by any means. We promise to work extrahard after survival to make the world safer place for all.
Please spread the information, and ask your governemnt to stop Russia by any means. We promise to work extrahard after survival to make the world safer place for all.
Links to the raise (1)
https://github.com/celery/celery/blob/fc57a612c07c8121ad6606a20641e4da35de00b3/celery/schedules.py#L498Ways to fix
The exception is thrown when dealing with the celery schedule. So that, creating a crontab with an empty list of day_of_month
parameter causes an error.
A Crontab can be used as the run_every
value of a periodic task entry to add crontab(5)-like scheduling.
To Reproduce an error
from celery.schedules import crontab
import datetime
crona = crontab(minute=1,day_of_month=[])
last_run_at =datetime.datetime.now()
crona.is_due(last_run_at)
is_due method returns (is_due, next_time_to_check
).
For example: `(True, 20)
`, means the task should be run now, and the next time to check is in 20 seconds
The exception is raised within function called roll_over()
def roll_over():
for _ in range(2000):
flag = (datedata.dom == len(days_of_month) or
day_out_of_range(datedata.year,
months_of_year[datedata.moy],
days_of_month[datedata.dom]) or
(is_before_last_run(datedata.year,
months_of_year[datedata.moy],
days_of_month[datedata.dom])))
if flag:
datedata.dom = 0
datedata.moy += 1
if datedata.moy == len(months_of_year):
datedata.moy = 0
datedata.year += 1
else:
break
else:
# Tried 2000 times, we're most likely in an infinite loop
raise RuntimeError('unable to rollover, '
'time specification is probably invalid')
When empty days are passed within the loop, 2000 times flag variable is being True and loop is not breaking, That's why is code goes to else block and raise an error.
Fix Code
from celery.schedules import crontab
import datetime
crona = crontab(minute=1,day_of_month=[2,5,6])
last_run_at =datetime.datetime.now()
crona.is_due(last_run_at)
Add a possible fix
Please authorize to post fix