summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriele <gsantomaggio@suse.com>2019-04-04 14:56:25 +0200
committerGabriele Santomaggio <g.santomaggio@gmail.com>2019-04-23 07:51:00 +0000
commit99b77c07bee7dc482af03d13b2c454593f153f0c (patch)
tree7361c43a9e9477e45ee6f1922ca98aff2f7b205e
parentf276f0853afcda949a665d2fa12d712e96d7115f (diff)
downloadoslo-messaging-99b77c07bee7dc482af03d13b2c454593f153f0c.tar.gz
Retry to declare a queue after internal error
Without this commit, the client can lose the messages, because the client does not handler the 'AMQP internal error 541', read here [2] for details. The fix retries to create the queue after a delay. When the virtual-host is ready the declare does not fail. This is a rare condiction, please read the bug [1] for details. Closes-Bug: #1822778 [1] https://bugs.launchpad.net/oslo.messaging/+bug/1822778 [2] https://www.rabbitmq.com/amqp-0-9-1-reference.html Change-Id: I7ab1f9d21ebb807285bf1422bc14cc6e07dcd32a (cherry picked from commit 4d2787227b00b973973554f7387e621d2664c0d8)
-rw-r--r--oslo_messaging/_drivers/impl_rabbit.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py
index 5e07593..7bbf8ad 100644
--- a/oslo_messaging/_drivers/impl_rabbit.py
+++ b/oslo_messaging/_drivers/impl_rabbit.py
@@ -227,7 +227,6 @@ class Consumer(object):
self.nowait = nowait
self.queue_arguments = _get_queue_arguments(rabbit_ha_queues,
rabbit_queue_ttl)
-
self.queue = None
self._declared_on = None
self.exchange = kombu.entity.Exchange(
@@ -262,6 +261,28 @@ class Consumer(object):
self.queue.declare()
else:
raise
+ except kombu.exceptions.ConnectionError as exc:
+ # NOTE(gsantomaggio): This exception happens when the
+ # connection is established,but it fails to create the queue.
+ # Add some delay to avoid too many requests to the server.
+ # See: https://bugs.launchpad.net/oslo.messaging/+bug/1822778
+ # for details.
+ if exc.code == 541:
+ interval = 2
+ info = {'sleep_time': interval,
+ 'queue': self.queue_name,
+ 'err_str': exc
+ }
+ LOG.error(_LE('Internal amqp error (541) '
+ 'during queue declare,'
+ 'retrying in %(sleep_time)s seconds. '
+ 'Queue: [%(queue)s], '
+ 'error message: [%(err_str)s]'), info)
+ time.sleep(interval)
+ self.queue.declare()
+ else:
+ raise
+
self._declared_on = conn.channel
def consume(self, conn, tag):