From 7dee2103a90f32bfc3cdc45bc3dcca3567013ddf Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Mon, 27 Sep 2010 11:44:23 -0400 Subject: [PATCH] Refactoring timelimit to add feed address re-check to a limited timeout. --- apps/rss_feeds/models.py | 2 ++ utils/feed_fetcher.py | 31 +------------------------------ utils/feed_functions.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 496758185..18e45f156 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -18,6 +18,7 @@ from mongoengine.queryset import OperationError from utils import json from utils import feedfinder from utils.feed_functions import levenshtein_distance +from utils.feed_functions import timelimit from utils.story_functions import format_story_link_date__short from utils.story_functions import format_story_link_date__long from utils.story_functions import pre_process_story @@ -78,6 +79,7 @@ class Feed(models.Model): self.save_popular_authors(lock=lock) self.save_popular_tags(lock=lock) + @timelimit(20) def check_feed_address_for_feed_link(self): feed_address = None diff --git a/utils/feed_fetcher.py b/utils/feed_fetcher.py index 43ea7f0e4..b7121dee0 100644 --- a/utils/feed_fetcher.py +++ b/utils/feed_fetcher.py @@ -9,6 +9,7 @@ from utils import feedparser from django.db import IntegrityError from utils.story_functions import pre_process_story from utils import log as logging +from utils.feed_functions import timelimit import sys import time import datetime @@ -36,36 +37,6 @@ def mtime(ttime): """ return datetime.datetime.fromtimestamp(time.mktime(ttime)) -import threading -class TimeoutError(Exception): pass -def timelimit(timeout): - """borrowed from web.py""" - def _1(function): - def _2(*args, **kw): - class Dispatch(threading.Thread): - def __init__(self): - threading.Thread.__init__(self) - self.result = None - self.error = None - - self.setDaemon(True) - self.start() - - def run(self): - try: - self.result = function(*args, **kw) - except: - self.error = sys.exc_info() - - c = Dispatch() - c.join(timeout) - if c.isAlive(): - raise TimeoutError, 'took too long' - if c.error: - raise c.error[0], c.error[1] - return c.result - return _2 - return _1 class FetchFeed: def __init__(self, feed, options): diff --git a/utils/feed_functions.py b/utils/feed_functions.py index ed4157036..cc3fc79c3 100644 --- a/utils/feed_functions.py +++ b/utils/feed_functions.py @@ -1,7 +1,39 @@ import datetime +import threading +import sys from django.utils.translation import ungettext from utils import feedfinder +class TimeoutError(Exception): pass +def timelimit(timeout): + """borrowed from web.py""" + def _1(function): + def _2(*args, **kw): + class Dispatch(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.result = None + self.error = None + + self.setDaemon(True) + self.start() + + def run(self): + try: + self.result = function(*args, **kw) + except: + self.error = sys.exc_info() + + c = Dispatch() + c.join(timeout) + if c.isAlive(): + raise TimeoutError, 'took too long' + if c.error: + raise c.error[0], c.error[1] + return c.result + return _2 + return _1 + def encode(tstr): """ Encodes a unicode string in utf-8 """