10

How do you change the retrieval timeout for the Memcached/Elasticache caching backend in Django?

I'm using Amazon's Elasticache for caching content in Django, and I'm frequently seeing errors like:

  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/defaulttags.py", line 285, in render
    return nodelist.render(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/base.py", line 830, in render
    bit = self.render_node(node, context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/template/base.py", line 844, in render_node
    return node.render(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/templatetags/static.py", line 109, in render
    url = self.url(context)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/contrib/staticfiles/templatetags/staticfiles.py", line 12, in url
    return staticfiles_storage.url(path)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/contrib/staticfiles/storage.py", line 136, in url
    hashed_name = self.cache.get(cache_key)
  File "/usr/local/myproject/.env/lib/python2.7/site-packages/django/core/cache/backends/memcached.py", line 64, in get
    val = self._cache.get(key)
Error: error 31 from memcached_get(myproject:1:staticfiles:27e4bc0): A TIMEOUT OCCURRED

I've tried increasing the number of nodes in my Elasticache cluster, but that has had no effect. My next thought was to increase the timeout for the memcached retrieval, but the Django docs don't seem to provide an option for this.

There's a "TIMEOUT" option, but that seems to define the default time after which the content expires, not the timeout of the HTTP request to the memcached server.

Cerin
  • 60,957
  • 96
  • 316
  • 522

2 Answers2

6

The solution I went with was to switch my Django cache backend to django-ft-cache, a fault-tolerant version of the standard memcache backend. So now, when a periodic timeout occurs, the cache simply bypasses to a non-cache retrieval of media instead of throwing a 500 error.

Cerin
  • 60,957
  • 96
  • 316
  • 522
4

There is no setting in django to do that. Something like this should work, albeit it is quite dirty. Make sure following is executed before cache is created:

import memcached; memcached._SOCKET_TIMEOUT = whatever_you_want_it_to_be;
Konstantin Svintsov
  • 1,607
  • 10
  • 25