Possible Bug in RegexURLResolver

20 views
Skip to first unread message

a.br...@rataran.com

unread,
Jul 9, 2016, 11:45:02 AM7/9/16
to Django users
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


Markus Holtermann

unread,
Jul 9, 2016, 12:26:23 PM7/9/16
to django...@googlegroups.com
Hey,

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

Thanks

/Markus
>--
>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...@googlegroups.com.
>To post to this group, send email to django...@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.

signature.asc
Reply all
Reply to author
Forward
0 new messages