Saturday, July 9, 2016

Re: Possible Bug in RegexURLResolver

Hey,

I did indeed not consider the multi-threading behavior on uwsgi when
writing that. Can you post this to django-developers@googlegroups.com
and open a ticket for that. I'd love to get someone else's input.

Thanks

/Markus

On Sat, Jul 09, 2016 at 08:36:44AM -0700, a.branco@rataran.com wrote:
>Hello everyone.
>
>I'm using django (1, 10, 0, u'beta', 1).
>
>When I try to reverse url in shell everything goes fine.
>
>When under nginx/uwsgi with many concurrent request I get
>
>... /local/lib/python2.7/site-packages/django/urls/resolvers.py", line 241,
>in reverse_dict
> return self._reverse_dict[language_code]
>KeyError: 'it'
>
>After a wile I figured out that RegexURLResolver is memoized by
>get_resolver and so it acts like a singleton for a certain number of
>requests.
>
>Analyzing the code of RegexURLResolver I found that the method _poupulate
>will return directly if it has been called before and not yet finished.
>
> ...
> def _populate(self):
> if self._populating:
> return
> self._populating = True
> ...
>
>if used for recursive call in a single thread this will not hurt, but in my
>case in uwsgi multi thread mode I got the error.
>
>here is my quick and dirty fix:
>
>class RegexURLResolver(LocaleRegexProvider):
> def __init__(self, regex, urlconf_name, default_kwargs=None,
>app_name=None, namespace=None):
>
> ...
>
> self._populating = False
> self.RLock = threading.RLock()
>
> ...
>
> def _populate(self):
> if self._populating:
> self.RLock.acquire()
> self.RLock.release()
> return
> self._populating = True
> self.RLock.acquire()
>
> ...
>
> self._populating = False
> self.RLock.release()
>
>
>Does anyone know if there is a better solution?
>
>Tank You
>
>
>--
>You received this message because you are subscribed to the Google Groups "Django users" group.
>To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
>To post to this group, send email to django-users@googlegroups.com.
>Visit this group at https://groups.google.com/group/django-users.
>To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/147ab225-7ec9-4bf3-a5e1-61a945154c29%40googlegroups.com.
>For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/20160709162551.GC11144%40inel.local.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment