[enh] alway relaunch montly job

This commit is contained in:
Laurent Peuch 2018-09-10 03:50:08 +02:00
parent faf1379094
commit 792ce1ad22
2 changed files with 29 additions and 13 deletions

16
run.py
View file

@ -7,7 +7,7 @@ import random
import logging import logging
import asyncio import asyncio
from datetime import datetime, date, timedelta from datetime import datetime, date
from collections import defaultdict from collections import defaultdict
from functools import wraps from functools import wraps
@ -26,7 +26,7 @@ from sanic_jinja2 import SanicJinja2
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
from models import Repo, Job, db, Worker from models import Repo, Job, db, Worker
from schedule import always_relaunch from schedule import always_relaunch, once_per_day
LOGGING_CONFIG_DEFAULTS["loggers"] = { LOGGING_CONFIG_DEFAULTS["loggers"] = {
"task": { "task": {
@ -201,6 +201,7 @@ async def monitor_apps_lists(type="stable"):
await asyncio.sleep(3) await asyncio.sleep(3)
@once_per_day
async def launch_monthly_job(type): async def launch_monthly_job(type):
# XXX DRY # XXX DRY
job_command_last_part = "" job_command_last_part = ""
@ -215,17 +216,6 @@ async def launch_monthly_job(type):
task_logger.info(f"Launch montly job for {repo.name} on day {today} of the month ") task_logger.info(f"Launch montly job for {repo.name} on day {today} of the month ")
await create_job(repo.name, repo.app_list, repo, job_command_last_part) await create_job(repo.name, repo.app_list, repo, job_command_last_part)
# launch tomorrow at 1 am
now = datetime.now()
tomorrow = now + timedelta(days=1)
tomorrow = tomorrow.replace(hour=1, minute=0, second=0)
seconds_until_next_run = (tomorrow - now).seconds
# XXX if relaunched twice the same day that will duplicate the jobs
await asyncio.sleep(seconds_until_next_run)
asyncio.ensure_future(launch_monthly_job(type=type))
async def jobs_dispatcher(): async def jobs_dispatcher():
if Worker.select().count() == 0: if Worker.select().count() == 0:

View file

@ -1,5 +1,7 @@
import asyncio import asyncio
from functools import wraps from functools import wraps
from datetime import datetime, timedelta
def always_relaunch(sleep): def always_relaunch(sleep):
@ -19,3 +21,27 @@ def always_relaunch(sleep):
await asyncio.sleep(sleep) await asyncio.sleep(sleep)
return wrap return wrap
return decorator return decorator
def once_per_day(function):
async def decorator(*args, **kwargs):
while True:
try:
await function(*args, **kwargs)
except KeyboardInterrupt:
return
except Exception as e:
import traceback
traceback.print_exc()
print(f"Error: exception in function '{function.__name__}', relaunch in tomorrow at one am")
finally:
# launch tomorrow at 1 am
now = datetime.now()
tomorrow = now + timedelta(days=1)
tomorrow = tomorrow.replace(hour=1, minute=0, second=0)
seconds_until_next_run = (tomorrow - now).seconds
# XXX if relaunched twice the same day that will duplicate the jobs
await asyncio.sleep(seconds_until_next_run)
return decorator