Fix fail of getting claim after claim expire(Redis)

When creating a claim for messages in a queue, after
this claim expires, Zaqar will return service unavailable
when getting the claim.

This happens since claim's id is still listed in set
"<project_id>.<queue_name>.claims" but Zaqar get '[None]'
from claim_id's 'expire' field.

Fix this issue if field value is '[None]' then just return
it and remove it from  set "<project_id>.<queue_name>.claims".

Change-Id: I8602b197903acc1692185e7715a4070814fe1661
Closes-Bug: #1588247
This commit is contained in:
wanghao 2016-06-07 14:30:59 +08:00
parent 5d1964d96b
commit e72dc08287
2 changed files with 22 additions and 1 deletions

View File

@ -98,7 +98,10 @@ class ClaimController(storage.Claim, scripting.Mixin):
"""Get one or more fields from the claim Info."""
values = self._client.hmget(claim_id, fields)
return [transform(v) for v in values] if transform else values
if values == [None]:
return values
else:
return [transform(v) for v in values] if transform else values
def _claim_messages(self, msgset_key, now, limit,
claim_id, claim_expires, msg_ttl, msg_expires):

View File

@ -400,6 +400,24 @@ class RedisClaimsTest(base.ClaimControllerTest):
self.controller.update, queue_name,
claim_id, {}, project=None)
def test_get_claim_after_expires(self):
queue_name = 'no-such-claim'
self.queue_controller.create(queue_name, project='fake_project')
new_messages = [{'ttl': 60, 'body': {}},
{'ttl': 60, 'body': {}},
{'ttl': 60, 'body': {}}]
self.message_controller.post(queue_name, new_messages,
client_uuid=str(uuid.uuid1()),
project='fake_project')
claim_id, messages = self.controller.create(queue_name, {'ttl': 1,
'grace': 0},
project='fake_project')
# Lets let it expire
time.sleep(2)
self.assertRaises(storage.errors.ClaimDoesNotExist,
self.controller.get, queue_name,
claim_id, project='fake_project')
def test_gc(self):
self.queue_controller.create(self.queue_name)