From 389a5318a06e7e4d8f8aba14af88c4cc4ea0db47 Mon Sep 17 00:00:00 2001 From: Marten Kenbeek Date: Thu, 14 Jul 2016 20:41:52 +0200 Subject: Fixed #26888 -- Fixed concurrency issue in URL resolver. Fixed a regression in 625b8e9295d79650208bfb3fca8bf9e6aaf578e4: improper short-circuiting could lead to a KeyError when threads concurrently call RegexURLResolver._populate(). --- tests/urlpatterns_reverse/tests.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tests/urlpatterns_reverse') diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py index 0201e28bf8..67a4370e78 100644 --- a/tests/urlpatterns_reverse/tests.py +++ b/tests/urlpatterns_reverse/tests.py @@ -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): -- cgit v1.3