From d0a129f26e796cb3860040c96764e2ea16d43b2f Mon Sep 17 00:00:00 2001 From: wangxiyuan Date: Mon, 13 Jun 2016 11:29:23 +0800 Subject: [PATCH] (redis)Fix the 503 error when get/delete messages Zaqar will return 503 in these three cases with redis backend: 1. Delete a message from a nonexistent queue. DELETE /v2/queues/{queue_name}/messages/{message_id} 2. Delete messages with ids from a nonexistent queue. DELETE /v2/queues/{queue_name}/messages?ids={message_ids} 3. Get messages with ids from a nonexistent queue. GET /v2/queues/{queue_name}/messages?ids={message_ids} With mongoDB, zaqar will return 204, 204 and 404. This patch fixed it to keep the same with mongoDB backend. Change-Id: I61d8f6f252cb7d56df1e0821a541ce52d89e34dc Closes-bug: #1590227 --- zaqar/storage/redis/messages.py | 7 +++---- zaqar/tests/unit/storage/base.py | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/zaqar/storage/redis/messages.py b/zaqar/storage/redis/messages.py index d2dba5d06..792871e2e 100644 --- a/zaqar/storage/redis/messages.py +++ b/zaqar/storage/redis/messages.py @@ -386,7 +386,7 @@ class MessageController(storage.Message, scripting.Mixin): @utils.retries_on_connection_error def bulk_get(self, queue, message_ids, project=None): if not self._queue_ctrl.exists(queue, project): - raise errors.QueueDoesNotExist(queue, project) + return iter([]) # NOTE(prashanthr_): Pipelining is used here purely # for performance. @@ -440,7 +440,7 @@ class MessageController(storage.Message, scripting.Mixin): @utils.retries_on_connection_error def delete(self, queue, message_id, project=None, claim=None): if not self._queue_ctrl.exists(queue, project): - raise errors.QueueDoesNotExist(queue, project) + return # NOTE(kgriffs): The message does not exist, so # it is essentially "already" deleted. @@ -490,8 +490,7 @@ class MessageController(storage.Message, scripting.Mixin): @utils.retries_on_connection_error def bulk_delete(self, queue, message_ids, project=None): if not self._queue_ctrl.exists(queue, project): - raise errors.QueueDoesNotExist(queue, - project) + return msgset_key = utils.msgset_key(queue, project) diff --git a/zaqar/tests/unit/storage/base.py b/zaqar/tests/unit/storage/base.py index c119f6ff2..d0ec7013f 100644 --- a/zaqar/tests/unit/storage/base.py +++ b/zaqar/tests/unit/storage/base.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import collections import datetime import random import time @@ -739,6 +740,29 @@ class MessageControllerTest(ControllerBaseTest): self.assertEqual(1, len(popped_messages)) + def test_delete_message_from_nonexistent_queue(self): + queue_name = 'fake_name' + message_id = 'fake_id' + res = self.controller.delete(queue_name, message_id, + project=self.project) + self.assertIsNone(res) + + def test_delete_messages_with_ids_from__nonexistent_queue(self): + queue_name = 'fake_name' + message_ids = ['fake_id1', 'fake_id2'] + res = self.controller.bulk_delete(queue_name, message_ids, + project=self.project) + self.assertIsNone(res) + + def test_get_messages_with_ids_from__nonexistent_queue(self): + queue_name = 'fake_name' + message_ids = ['fake_id1', 'fake_id2'] + res = self.controller.bulk_get(queue_name, message_ids, + project=self.project) + + self.assertTrue(isinstance(res, collections.Iterable)) + self.assertEqual([], list(res)) + class ClaimControllerTest(ControllerBaseTest): """Claim Controller base tests.