|
@@ -177,6 +177,9 @@ class RedisBackend(KeyValueStoreBackend):
|
|
def expire(self, key, value):
|
|
def expire(self, key, value):
|
|
return self.client.expire(key, value)
|
|
return self.client.expire(key, value)
|
|
|
|
|
|
|
|
+ def add_to_chord(self, group_id, result):
|
|
|
|
+ self.client.incr(self.get_key_for_group(group_id, '.t'), 1)
|
|
|
|
+
|
|
def _unpack_chord_result(self, tup, decode,
|
|
def _unpack_chord_result(self, tup, decode,
|
|
PROPAGATE_STATES=states.PROPAGATE_STATES):
|
|
PROPAGATE_STATES=states.PROPAGATE_STATES):
|
|
_, tid, state, retval = decode(tup)
|
|
_, tid, state, retval = decode(tup)
|
|
@@ -201,21 +204,27 @@ class RedisBackend(KeyValueStoreBackend):
|
|
|
|
|
|
client = self.client
|
|
client = self.client
|
|
jkey = self.get_key_for_group(gid, '.j')
|
|
jkey = self.get_key_for_group(gid, '.j')
|
|
|
|
+ tkey = self.get_key_for_group(gid, '.t')
|
|
result = self.encode_result(result, state)
|
|
result = self.encode_result(result, state)
|
|
- _, readycount, _ = client.pipeline() \
|
|
|
|
|
|
+ _, readycount, totaldiff, _, _ = client.pipeline() \
|
|
.rpush(jkey, self.encode([1, tid, state, result])) \
|
|
.rpush(jkey, self.encode([1, tid, state, result])) \
|
|
.llen(jkey) \
|
|
.llen(jkey) \
|
|
|
|
+ .get(tkey) \
|
|
.expire(jkey, 86400) \
|
|
.expire(jkey, 86400) \
|
|
|
|
+ .expire(tkey, 86400) \
|
|
.execute()
|
|
.execute()
|
|
|
|
|
|
|
|
+ totaldiff = int(totaldiff or 0)
|
|
|
|
+
|
|
try:
|
|
try:
|
|
callback = maybe_signature(request.chord, app=app)
|
|
callback = maybe_signature(request.chord, app=app)
|
|
- total = callback['chord_size']
|
|
|
|
|
|
+ total = callback['chord_size'] + totaldiff
|
|
if readycount >= total:
|
|
if readycount >= total:
|
|
decode, unpack = self.decode, self._unpack_chord_result
|
|
decode, unpack = self.decode, self._unpack_chord_result
|
|
- resl, _ = client.pipeline() \
|
|
|
|
|
|
+ resl, _, _ = client.pipeline() \
|
|
.lrange(jkey, 0, total) \
|
|
.lrange(jkey, 0, total) \
|
|
.delete(jkey) \
|
|
.delete(jkey) \
|
|
|
|
+ .delete(tkey) \
|
|
.execute()
|
|
.execute()
|
|
try:
|
|
try:
|
|
callback.delay([unpack(tup, decode) for tup in resl])
|
|
callback.delay([unpack(tup, decode) for tup in resl])
|