From 1d5afe8cd65a90e9de7c3682bd7d68aa4080c54b Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 5 Jan 2023 14:07:34 -0600 Subject: [PATCH] Wrap browser cache in thread lock just in case. --- fanficfare/fetchers/cache_browser.py | 103 ++++++++++++++------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/fanficfare/fetchers/cache_browser.py b/fanficfare/fetchers/cache_browser.py index e55b5184..e2ba5483 100644 --- a/fanficfare/fetchers/cache_browser.py +++ b/fanficfare/fetchers/cache_browser.py @@ -19,6 +19,7 @@ from __future__ import absolute_import import logging logger = logging.getLogger(__name__) +import threading import traceback import time import webbrowser @@ -36,7 +37,7 @@ class BrowserCacheDecorator(FetcherDecorator): def __init__(self,cache): super(BrowserCacheDecorator,self).__init__() self.cache = cache - + self.cache_lock = threading.RLock() def fetcher_do_request(self, fetcher, @@ -46,56 +47,58 @@ class BrowserCacheDecorator(FetcherDecorator): parameters=None, referer=None, usecache=True): - # logger.debug("BrowserCacheDecorator fetcher_do_request") - fromcache=True - if usecache: - try: - d = self.cache.get_data(url) - - ## XXX - should there be a fail counter / limit for - ## cases of pointing to wrong cache/etc? - - parsedUrl = urlparse(url) - - sleeptries = [ 2, 5 ] - while( fetcher.getConfig("use_browser_cache_only") and - fetcher.getConfig("open_pages_in_browser",False) and - not d and sleeptries - and domain_open_tries.get(parsedUrl.netloc,0) < fetcher.getConfig("open_browser_pages_tries_limit",6)): - logger.debug("\n\nopen page in browser: %s\ntries:%s\n"%(url,domain_open_tries.get(parsedUrl.netloc,0))) - webbrowser.open(url) - domain_open_tries[parsedUrl.netloc] = domain_open_tries.get(parsedUrl.netloc,0) + 1 - fromcache=False - if parsedUrl.netloc not in domain_open_tries: - logger.debug("First time for (%s) extra sleep"%parsedUrl.netloc) - time.sleep(5) - time.sleep(sleeptries.pop(0)) + with self.cache_lock: + # logger.debug("BrowserCacheDecorator fetcher_do_request") + fromcache=True + if usecache: + try: d = self.cache.get_data(url) - # logger.debug(d) - except Exception as e: - logger.debug(traceback.format_exc()) - raise exceptions.BrowserCacheException("Browser Cache Failed to Load with error '%s'"%e) - # had a d = b'' which showed HIT, but failed. - logger.debug(make_log('BrowserCache',method,url,True if d else False)) - # logger.debug(d) - if d: - domain_open_tries[parsedUrl.netloc] = 0 - logger.debug("fromcache:%s"%fromcache) - return FetcherResponse(d,redirecturl=url,fromcache=fromcache) + ## XXX - should there be a fail counter / limit for + ## cases of pointing to wrong cache/etc? - if fetcher.getConfig("use_browser_cache_only"): - raise exceptions.HTTPErrorFFF( + parsedUrl = urlparse(url) + + sleeptries = [ 2, 5 ] + while( fetcher.getConfig("use_browser_cache_only") and + fetcher.getConfig("open_pages_in_browser",False) and + not d and sleeptries + and domain_open_tries.get(parsedUrl.netloc,0) < fetcher.getConfig("open_browser_pages_tries_limit",6) ): + logger.debug("\n\nopen page in browser: %s\ntries:%s\n"%(url,domain_open_tries.get(parsedUrl.netloc,0))) + webbrowser.open(url) + domain_open_tries[parsedUrl.netloc] = domain_open_tries.get(parsedUrl.netloc,0) + 1 + fromcache=False + if parsedUrl.netloc not in domain_open_tries: + logger.debug("First time for (%s) extra sleep"%parsedUrl.netloc) + time.sleep(5) + time.sleep(sleeptries.pop(0)) + d = self.cache.get_data(url) + # logger.debug(d) + except Exception as e: + logger.debug(traceback.format_exc()) + raise exceptions.BrowserCacheException("Browser Cache Failed to Load with error '%s'"%e) + + # had a d = b'' which showed HIT, but failed. + logger.debug(make_log('BrowserCache',method,url,True if d else False)) + # logger.debug(d) + if d: + domain_open_tries[parsedUrl.netloc] = 0 + logger.debug("fromcache:%s"%fromcache) + return FetcherResponse(d,redirecturl=url,fromcache=fromcache) + + if fetcher.getConfig("use_browser_cache_only"): + raise exceptions.HTTPErrorFFF( + url, + 428, # 404 & 410 trip StoryDoesNotExist + # 428 ('Precondition Required') gets the + # error_msg through to the user. + "Page not found or expired in Browser Cache (see FFF setting browser_cache_age_limit)",# error_msg + None # data + ) + return chainfn( + method, url, - 428, # 404 & 410 trip StoryDoesNotExist - # 428 ('Precondition Required') gets the - # error_msg through to the user. - "Page not found or expired in Browser Cache (see FFF setting browser_cache_age_limit)",# error_msg - None # data - ) - return chainfn( - method, - url, - parameters=parameters, - referer=referer, - usecache=usecache) + parameters=parameters, + referer=referer, + usecache=usecache) +