1
0
mirror of https://github.com/django/django.git synced 2025-10-23 21:59:11 +00:00

Fixed #26888 -- Fixed concurrency issue in URL resolver.

Fixed a regression in 625b8e9295:
improper short-circuiting could lead to a KeyError when threads
concurrently call RegexURLResolver._populate().
This commit is contained in:
Marten Kenbeek
2016-07-14 20:41:52 +02:00
committed by Tim Graham
parent 3e71f6544f
commit 389a5318a0
2 changed files with 23 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ Unit tests for reverse URL lookups.
from __future__ import unicode_literals
import sys
import threading
from admin_scripts.tests import AdminScriptTestCase
@@ -429,6 +430,18 @@ class ResolverTests(SimpleTestCase):
self.assertTrue(resolver._is_callback('urlpatterns_reverse.nested_urls.View3'))
self.assertFalse(resolver._is_callback('urlpatterns_reverse.nested_urls.blub'))
def test_populate_concurrency(self):
"""
RegexURLResolver._populate() can be called concurrently, but not more
than once per thread (#26888).
"""
resolver = RegexURLResolver(r'^/', 'urlpatterns_reverse.urls')
resolver._local.populating = True
thread = threading.Thread(target=resolver._populate)
thread.start()
thread.join()
self.assertNotEqual(resolver._reverse_dict, {})
@override_settings(ROOT_URLCONF='urlpatterns_reverse.reverse_lazy_urls')
class ReverseLazyTest(TestCase):