From 2ccd7b6cfe6673013b32b7edfcc9a1918b722e70 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Mon, 15 Apr 2013 15:09:04 -0700 Subject: [PATCH] Fixing race condition between primary adn secondaries when creating feed fetch histories. --- apps/rss_feeds/models.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 0c46056d5..b2f05dbd8 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -8,6 +8,7 @@ import mongoengine as mongo import zlib import hashlib import redis +import pymongo from urlparse import urlparse from collections import defaultdict from operator import itemgetter @@ -1762,8 +1763,12 @@ class MFetchHistory(mongo.Document): @classmethod def feed(cls, feed_id, timezone=None): - fetch_history, _ = cls.objects.get_or_create(feed_id=feed_id) + fetch_history, _ = cls.objects.get_or_create( + feed_id=feed_id, + read_preference=pymongo.ReadPreference.PRIMARY + ) history = {} + for fetch_type in ['feed_fetch_history', 'page_fetch_history', 'push_history']: history[fetch_type] = getattr(fetch_history, fetch_type) if not history[fetch_type]: @@ -1783,7 +1788,10 @@ class MFetchHistory(mongo.Document): if not date: date = datetime.datetime.now() - fetch_history, _ = cls.objects.get_or_create(feed_id=feed_id) + fetch_history, _ = cls.objects.get_or_create( + feed_id=feed_id, + read_preference=pymongo.ReadPreference.PRIMARY + ) if fetch_type == 'feed': history = fetch_history.feed_fetch_history or [] elif fetch_type == 'page': @@ -1828,7 +1836,10 @@ class MFetchExceptionHistory(mongo.Document): if not isinstance(exception, basestring): exception = unicode(exception) - fetch_exception, _ = cls.objects.get_or_create(feed_id=feed_id) + fetch_exception, _ = cls.objects.get_or_create( + feed_id=feed_id, + read_preference=pymongo.ReadPreference.PRIMARY + ) fetch_exception.date = date fetch_exception.code = code fetch_exception.message = message