id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 21952,Deadlock while dispatching signals,André Cruz,nobody,"I'm testing an upgrade from Django 1.5.2 to 1.6.1, and came across this deadlock: {{{ File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/greenlet.py"", line 327, in run result = self._run(*self.args, **self.kwargs) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/http/response.py"", line 308, in close signals.request_finished.send(sender=self._handler_class) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 184, in send for receiver in self._live_receivers(sender): File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 245, in _live_receivers for (receiverkey, r_senderkey), receiver in self.receivers: File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/saferef.py"", line 121, in remove function( self ) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 270, in _remove_receiver with self.lock: File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/hub.py"", line 331, in switch return greenlet.switch(self) }}} While in ''_live_receivers'' we have acquired the lock, and we try to acquire it again in ''_remove_receiver'' which is called with the lock. I don't know if the Gevent interaction is triggering the issue here, but its locks are supposed to exhibit the same behaviour as the ones from stdlib. I'm using uWSGI with the Gevent loop engine so it spawns one greenlet per request. After this deadlock I ended up with thousands of greenlets in: {{{ File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/greenlet.py"", line 327, in run result = self._run(*self.args, **self.kwargs) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py"", line 206, in __call__ response = self.get_response(request) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/core/handlers/base.py"", line 90, in get_response response = middleware_method(request) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/contrib/sessions/middleware.py"", line 12, in process_request request.session = engine.SessionStore(session_key) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/contrib/sessions/backends/cache.py"", line 14, in __init__ self._cache = get_cache(settings.SESSION_CACHE_ALIAS) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/core/cache/__init__.py"", line 135, in get_cache signals.request_finished.connect(cache.close) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 116, in connect with self.lock: File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/hub.py"", line 331, in switch return greenlet.switch(self) }}} and {{{ File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/greenlet.py"", line 327, in run result = self._run(*self.args, **self.kwargs) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/http/response.py"", line 308, in close signals.request_finished.send(sender=self._handler_class) File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 184, in send for receiver in self._live_receivers(sender): File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py"", line 242, in _live_receivers with self.lock: File ""/servers/python-environments/discosite/local/lib/python2.7/site-packages/gevent/hub.py"", line 331, in switch return greenlet.switch(self) }}}",Bug,closed,Core (Other),1.6,Release blocker,fixed,signal deadlock,Florian Apolloner,Accepted,1,0,0,0,0,0