From 3bf2d844a0922f659b4305858fb3c8001901958a Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 20 Dec 2014 20:13:49 +0100 Subject: [PATCH] Release api lock on connection close or finish fix #4372 --- couchpotato/api.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/couchpotato/api.py b/couchpotato/api.py index cd01197a..27a8efcb 100644 --- a/couchpotato/api.py +++ b/couchpotato/api.py @@ -7,6 +7,7 @@ import urllib from couchpotato.core.helpers.request import getParams from couchpotato.core.logger import CPLog +from tornado.ioloop import IOLoop from tornado.web import RequestHandler, asynchronous @@ -33,7 +34,7 @@ def run_async(func): def run_handler(route, kwargs, callback = None): try: res = api[route](**kwargs) - callback(res, route) + IOLoop.current().add_callback(callback, res, route) except: log.error('Failed doing api request "%s": %s', (route, traceback.format_exc())) callback({'success': False, 'error': 'Failed returning results'}, route) @@ -83,10 +84,11 @@ def addNonBlockApiView(route, func_tuple, docs = None, **kwargs): # Blocking API handler class ApiHandler(RequestHandler): + route = None @asynchronous def get(self, route, *args, **kwargs): - route = route.strip('/') + self.route = route = route.strip('/') if not api.get(route): self.write('API call doesn\'t seem to exist') self.finish() @@ -123,10 +125,18 @@ class ApiHandler(RequestHandler): except: log.error('Failed write error "%s": %s', (route, traceback.format_exc())) - api_locks[route].release() + self.unlock() post = get + def on_connection_close(self): + self.unlock() + super(ApiHandler, self).on_connection_close() + + def on_finish(self): + self.unlock() + super(ApiHandler, self).on_finish() + def taskFinished(self, result, route): if not self.request.connection.stream.closed(): @@ -150,7 +160,11 @@ class ApiHandler(RequestHandler): try: self.finish({'success': False, 'error': 'Failed returning results'}) except: pass - api_locks[route].release() + self.unlock() + + def unlock(self): + try: api_locks[self.route].release() + except: pass def addApiView(route, func, static = False, docs = None, **kwargs):