Commit 6c5a30b4 authored by Tim Graham's avatar Tim Graham
Browse files

Added tests for LocalMemCache deadlocks. refs #20613 and refs #18541.

Thanks Zach Smith for the patch.
parent 02add435
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -990,6 +990,18 @@ class CreateCacheTableForDBCacheTests(TestCase):
            router.routers = old_routers


class PicklingSideEffect(object):

    def __init__(self, cache):
        self.cache = cache
        self.locked = False

    def __getstate__(self):
        if self.cache._lock.active_writers:
            self.locked = True
        return {}


@override_settings(CACHES=caches_setting_for_tests(
    BACKEND='django.core.cache.backends.locmem.LocMemCache',
))
@@ -1025,6 +1037,15 @@ class LocMemCacheTests(BaseCacheTests, TestCase):
        self.assertEqual(caches['default'].get('value'), 42)
        self.assertEqual(caches['other'].get('value'), None)

    def test_locking_on_pickle(self):
        """#20613/#18541 -- Ensures pickling is done outside of the lock."""
        bad_obj = PicklingSideEffect(cache)
        cache.set('set', bad_obj)
        self.assertFalse(bad_obj.locked, "Cache was locked during pickling")

        cache.add('add', bad_obj)
        self.assertFalse(bad_obj.locked, "Cache was locked during pickling")

    def test_incr_decr_timeout(self):
        """incr/decr does not modify expiry time (matches memcached behavior)"""
        key = 'value'