Hi, I just experienced the following behaviour and would like to ask for your opinion whether I should file this as a bug or whether this is intended behaviour. I today had the pleasure to work with a crashed memcached deaemon that could not restart because of a permission problem. In this case, django, using the backend 'django.core.cache.backends.memcached.MemcachedCache' behaved as follows:
>>> cache.set("foo", "bar") >>> cache.get("foo") So it fails silently and all get calls will return None. That is sensible behaviour if one does not want cache calls to raise exceptions. However, when using the new get_or_set() method from Django 1.9, I got >>> cache.get_or_set('foo', default='bar') 0 This really is suprising to me. For any reasonable usage I can think of, I would expect get_or_set() to return the specified default value. When looking at the implementation of BaseCache.get_or_set, one finds that in the case of the value not existing, the value is saved and returned as follows: if val is None: val = self.add(key, default, timeout=timeout, version=version) if val: return self.get(key, default, version) return val I assume that the last get() call is there to prevent a possible race condition with other processes that is updating the key right after our add statement. However, if val is for some reason not evaluating to True, the result of add() is being returned. add() is documented as returning True or False and I don't think it makes any sense to return True/False from a method that is expected to return a cached value or a default value. I think we need a better behaviour of get_or_set() if add() fails but I'm unsure how it exactly should look like, otherwise I would have prepared a patch. Cheers Raphael -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To post to this group, send email to django-developers@googlegroups.com. Visit this group at https://groups.google.com/group/django-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/20160228232625.0e613084%40kvothe. For more options, visit https://groups.google.com/d/optout.
pgpFdwc2qwCzG.pgp
Description: Digitale Signatur von OpenPGP