Commit 93d4aea9 authored by Sean Bleier's avatar Sean Bleier

Clean up get_or_set.

parent ac78f6f4
...@@ -389,18 +389,28 @@ class BaseRedisCache(BaseCache): ...@@ -389,18 +389,28 @@ class BaseRedisCache(BaseCache):
if not callable(func): if not callable(func):
raise Exception("Must pass in a callable") raise Exception("Must pass in a callable")
timeout = self.get_timeout(timeout) value = self.get(key._original_key)
if value is None:
dogpile_lock_key = "_lock" + key._versioned_key dogpile_lock_key = "_lock" + key._versioned_key
dogpile_lock = client.get(dogpile_lock_key) dogpile_lock = client.get(dogpile_lock_key)
if dogpile_lock is None: if dogpile_lock is None:
self.set(dogpile_lock_key, 0, None) # Set the dogpile lock.
value = func() self._set(client, dogpile_lock_key, 0, None)
self._set(client, key, self.prep_value(value), None)
self._set(client, dogpile_lock_key, 0, timeout) # calculate value of `func`.
else: try:
value = self.get(key._original_key) value = func()
finally:
# Regardless of error, release the dogpile lock.
client.expire(dogpile_lock_key, -1)
timeout = self.get_timeout(timeout)
# Set value of `func` and set timeout
self._set(client, key, self.prep_value(value), timeout)
return value return value
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment