From d7b53aa3227655c4d258f78f65c922d8def17b87 Mon Sep 17 00:00:00 2001 From: j Date: Thu, 18 Aug 2016 13:41:24 +0200 Subject: [PATCH] limit cronjob rate if multiple cronjobs end up in queue --- pandora/app/models.py | 3 --- pandora/app/utils.py | 17 +++++++++++++++++ pandora/item/tasks.py | 11 +++++++---- pandora/tv/tasks.py | 7 +++++-- 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 pandora/app/utils.py diff --git a/pandora/app/models.py b/pandora/app/models.py index ce07a3e2..94687d76 100644 --- a/pandora/app/models.py +++ b/pandora/app/models.py @@ -42,6 +42,3 @@ class Settings(models.Model): else: value = default return value - - - diff --git a/pandora/app/utils.py b/pandora/app/utils.py new file mode 100644 index 00000000..7afabe85 --- /dev/null +++ b/pandora/app/utils.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# vi:si:et:sw=4:sts=4:ts=4 +from __future__ import division, with_statement + +import time + +from .models import Settings + + +def limit_rate(key, timeout): + key = 'limit.%s.last' % key + last_cronjob = Settings.get(key, 0) + current_time = time.time() + if (current_time - last_cronjob) > timeout: + Settings.set(key, current_time) + return True + return False diff --git a/pandora/item/tasks.py b/pandora/item/tasks.py index 307e8206..fae11059 100644 --- a/pandora/item/tasks.py +++ b/pandora/item/tasks.py @@ -5,21 +5,24 @@ from datetime import timedelta, datetime import gzip import random +from celery.task import task, periodic_task from django.conf import settings from django.db import connection, transaction from django.db.models import Q from ox.utils import ET -from celery.task import task, periodic_task -import models +from app.utils import limit_rate from text.models import Text from taskqueue.models import Task +import models + @periodic_task(run_every=timedelta(days=1), queue='encoding') def cronjob(**kwargs): - update_random_sort() - update_random_clip_sort() + if limit_rate('item.tasks.cronjob', 8 * 60 * 60): + update_random_sort() + update_random_clip_sort() def update_random_sort(): if filter(lambda f: f['id'] == 'random', settings.CONFIG['itemKeys']): diff --git a/pandora/tv/tasks.py b/pandora/tv/tasks.py index d177b06c..76bfeac2 100644 --- a/pandora/tv/tasks.py +++ b/pandora/tv/tasks.py @@ -4,10 +4,13 @@ from datetime import timedelta from celery.task import periodic_task +from app.utils import limit_rate + import models @periodic_task(run_every=timedelta(days=1), queue='encoding') def update_program(**kwargs): - for c in models.Channel.objects.all(): - c.update_program() + if limit_rate('tv.tasks.update_program', 8 * 60 * 60): + for c in models.Channel.objects.all(): + c.update_program()