﻿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
