From f7eeaf3eda2b4144ebf3ec90c4b7488325519445 Mon Sep 17 00:00:00 2001 From: Ruud Date: Tue, 16 Sep 2014 22:44:33 +0200 Subject: [PATCH] Locking mechanism --- couchpotato/core/event.py | 2 +- couchpotato/core/media/movie/_base/main.py | 8 ++++++-- couchpotato/core/plugins/base.py | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/couchpotato/core/event.py b/couchpotato/core/event.py index 7246cde1..35818e7e 100644 --- a/couchpotato/core/event.py +++ b/couchpotato/core/event.py @@ -90,7 +90,7 @@ def fireEvent(name, *args, **kwargs): else: - e = Event(name = name, threads = 10, exc_info = True, traceback = True, lock = threading.RLock()) + e = Event(name = name, threads = 10, exc_info = True, traceback = True) for event in events[name]: e.handle(event['handler'], priority = event['priority']) diff --git a/couchpotato/core/media/movie/_base/main.py b/couchpotato/core/media/movie/_base/main.py index 2757a920..1863d897 100755 --- a/couchpotato/core/media/movie/_base/main.py +++ b/couchpotato/core/media/movie/_base/main.py @@ -271,6 +271,10 @@ class MovieBase(MovieTypeBase): if self.shuttingDown(): return + lock_key = 'media.get.%s' % media_id if media_id else identifier + self.acquireLock(lock_key) + + media = {} try: db = get_db() @@ -319,11 +323,11 @@ class MovieBase(MovieTypeBase): self.getPoster(media, image_urls) db.update(media) - return media except: log.error('Failed update media: %s', traceback.format_exc()) - return {} + self.releaseLock(lock_key) + return media def updateReleaseDate(self, media_id): """ diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py index 2c7f9e13..d9308f4d 100644 --- a/couchpotato/core/plugins/base.py +++ b/couchpotato/core/plugins/base.py @@ -1,3 +1,4 @@ +import threading from urllib import quote from urlparse import urlparse import glob @@ -35,6 +36,8 @@ class Plugin(object): _needs_shutdown = False _running = None + _locks = {} + user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20130519 Firefox/24.0' http_last_use = {} http_time_between_calls = 0 @@ -393,3 +396,19 @@ class Plugin(object): def isEnabled(self): return self.conf(self.enabled_option) or self.conf(self.enabled_option) is None + + def acquireLock(self, key): + + lock = self._locks.get(key) + if not lock: + self._locks[key] = threading.RLock() + + log.debug('Acquiring lock: %s', key) + self._locks.get(key).acquire() + + def releaseLock(self, key): + + lock = self._locks.get(key) + if lock: + log.debug('Releasing lock: %s', key) + self._locks.get(key).release()